LyoKICogJFhGcmVlODY6IHhjL2xpYi9YcmFuZHIvWHJhbmRyLmgsdiAxLjkgMjAwMi8wOS8yOSAyMzozOTo0NCBrZWl0aHAgRXhwICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBDb21wYXEgQ29tcHV0ZXIgQ29ycG9yYXRpb24sIEluYy4KICogQ29weXJpZ2h0IKkgMjAwMiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgQ29tcGFxIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCiAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKICogd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgSFAgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQogKiBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKICogd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEhQIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMCiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIENPTVBBUQogKiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgogKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIAogKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKgogKiBBdXRob3I6ICBKaW0gR2V0dHlzLCBIUCBMYWJzLCBIUC4KICovCgojaWZuZGVmIF9YUkFORFJfSF8KI2RlZmluZSBfWFJBTkRSX0hfCgojaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvcmFuZHIuaD4KCiNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgoKX1hGVU5DUFJPVE9CRUdJTgoKICAgIAp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQJd2lkdGgsIGhlaWdodDsKICAgIGludAltd2lkdGgsIG1oZWlnaHQ7Cn0gWFJSU2NyZWVuU2l6ZTsKCi8qCiAqICBFdmVudHMuCiAqLwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50IHR5cGU7CQkJLyogZXZlbnQgYmFzZSAqLwogICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KICAgIEJvb2wgc2VuZF9ldmVudDsJCS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLwogICAgRGlzcGxheSAqZGlzcGxheTsJCS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KICAgIFdpbmRvdyB3aW5kb3c7CQkvKiB3aW5kb3cgd2hpY2ggc2VsZWN0ZWQgZm9yIHRoaXMgZXZlbnQgKi8KICAgIFdpbmRvdyByb290OwkJLyogUm9vdCB3aW5kb3cgZm9yIGNoYW5nZWQgc2NyZWVuICovCiAgICBUaW1lIHRpbWVzdGFtcDsJCS8qIHdoZW4gdGhlIHNjcmVlbiBjaGFuZ2Ugb2NjdXJyZWQgKi8KICAgIFRpbWUgY29uZmlnX3RpbWVzdGFtcDsJLyogd2hlbiB0aGUgbGFzdCBjb25maWd1cmF0aW9uIGNoYW5nZSAqLwogICAgU2l6ZUlEIHNpemVfaW5kZXg7CiAgICBTdWJwaXhlbE9yZGVyIHN1YnBpeGVsX29yZGVyOwogICAgUm90YXRpb24gcm90YXRpb247CiAgICBpbnQgd2lkdGg7CiAgICBpbnQgaGVpZ2h0OwogICAgaW50IG13aWR0aDsKICAgIGludCBtaGVpZ2h0Owp9IFhSUlNjcmVlbkNoYW5nZU5vdGlmeUV2ZW50OwoKCi8qIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGlzIHByaXZhdGUgdG8gdGhlIGxpYnJhcnkgKi8KdHlwZWRlZiBzdHJ1Y3QgX1hSUlNjcmVlbkNvbmZpZ3VyYXRpb24gWFJSU2NyZWVuQ29uZmlndXJhdGlvbjsJCgpCb29sIFhSUlF1ZXJ5RXh0ZW5zaW9uIChEaXNwbGF5ICpkcHksIGludCAqZXZlbnRfYmFzZXAsIGludCAqZXJyb3JfYmFzZXApOwpTdGF0dXMgWFJSUXVlcnlWZXJzaW9uIChEaXNwbGF5ICpkcHksCgkJCSAgICBpbnQgICAgICptYWpvcl92ZXJzaW9ucCwKCQkJICAgIGludCAgICAgKm1pbm9yX3ZlcnNpb25wKTsKClhSUlNjcmVlbkNvbmZpZ3VyYXRpb24gKlhSUkdldFNjcmVlbkluZm8gKERpc3BsYXkgKmRweSwKCQkJCQkgIERyYXdhYmxlIGRyYXcpOwogICAgCnZvaWQgWFJSRnJlZVNjcmVlbkNvbmZpZ0luZm8gKFhSUlNjcmVlbkNvbmZpZ3VyYXRpb24gKmNvbmZpZyk7CgovKiAKICogTm90ZSB0aGF0IHNjcmVlbiBjb25maWd1cmF0aW9uIGNoYW5nZXMgYXJlIG9ubHkgcGVybWl0dGVkIGlmIHRoZSBjbGllbnQgY2FuCiAqIHByb3ZlIGl0IGhhcyB1cCB0byBkYXRlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICBXZSBhcmUgdHJ5aW5nIHRvCiAqIGluc2lzdCB0aGF0IGl0IGJlY29tZSBwb3NzaWJsZSBmb3Igc2NyZWVucyB0byBjaGFuZ2UgZHluYW1pY2FsbHksIHNvCiAqIHdlIHdhbnQgdG8gZW5zdXJlIHRoZSBjbGllbnQga25vd3Mgd2hhdCBpdCBpcyB0YWxraW5nIGFib3V0IHdoZW4gcmVxdWVzdGluZwogKiBjaGFuZ2VzLgogKi8KU3RhdHVzIFhSUlNldFNjcmVlbkNvbmZpZyAoRGlzcGxheSAqZHB5LCAKCQkJICAgWFJSU2NyZWVuQ29uZmlndXJhdGlvbiAqY29uZmlnLAoJCQkgICBEcmF3YWJsZSBkcmF3LAoJCQkgICBpbnQgc2l6ZV9pbmRleCwKCQkJICAgUm90YXRpb24gcm90YXRpb24sCgkJCSAgIFRpbWUgdGltZXN0YW1wKTsKCi8qIGFkZGVkIGluIHYxLjEsIHNvcnJ5IGZvciB0aGUgbGFtZSBuYW1lICovClN0YXR1cyBYUlJTZXRTY3JlZW5Db25maWdBbmRSYXRlIChEaXNwbGF5ICpkcHksIAoJCQkJICBYUlJTY3JlZW5Db25maWd1cmF0aW9uICpjb25maWcsCgkJCQkgIERyYXdhYmxlIGRyYXcsCgkJCQkgIGludCBzaXplX2luZGV4LAoJCQkJICBSb3RhdGlvbiByb3RhdGlvbiwKCQkJCSAgc2hvcnQgcmF0ZSwKCQkJCSAgVGltZSB0aW1lc3RhbXApOwoKClJvdGF0aW9uIFhSUkNvbmZpZ1JvdGF0aW9ucyhYUlJTY3JlZW5Db25maWd1cmF0aW9uICpjb25maWcsIFJvdGF0aW9uICpjdXJyZW50X3JvdGF0aW9uKTsKClRpbWUgWFJSQ29uZmlnVGltZXMgKFhSUlNjcmVlbkNvbmZpZ3VyYXRpb24gKmNvbmZpZywgVGltZSAqY29uZmlnX3RpbWVzdGFtcCk7CgpYUlJTY3JlZW5TaXplICpYUlJDb25maWdTaXplcyhYUlJTY3JlZW5Db25maWd1cmF0aW9uICpjb25maWcsIGludCAqbnNpemVzKTsKCnNob3J0ICpYUlJDb25maWdSYXRlcyAoWFJSU2NyZWVuQ29uZmlndXJhdGlvbiAqY29uZmlnLCBpbnQgc2l6ZUlELCBpbnQgKm5yYXRlcyk7CgpTaXplSUQgWFJSQ29uZmlnQ3VycmVudENvbmZpZ3VyYXRpb24gKFhSUlNjcmVlbkNvbmZpZ3VyYXRpb24gKmNvbmZpZywgCgkJCSAgICAgIFJvdGF0aW9uICpyb3RhdGlvbik7CiAgICAKc2hvcnQgWFJSQ29uZmlnQ3VycmVudFJhdGUgKFhSUlNjcmVlbkNvbmZpZ3VyYXRpb24gKmNvbmZpZyk7CgppbnQgWFJSUm9vdFRvU2NyZWVuKERpc3BsYXkgKmRweSwgV2luZG93IHJvb3QpOwoKLyogCiAqIHJldHVybnMgdGhlIHNjcmVlbiBjb25maWd1cmF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHNjcmVlbjsgZG9lcyBhIGxhenkKICogZXZhbHV0aW9uIHRvIGRlbGF5IGdldHRpbmcgdGhlIGluZm9ybWF0aW9uLCBhbmQgY2FjaGVzIHRoZSByZXN1bHQuCiAqIFRoZXNlIHJvdXRpbmVzIHNob3VsZCBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8gWFJSR2V0U2NyZWVuSW5mbwogKiB0byBhdm9pZCB1bm5lZWRlZCByb3VuZCB0cmlwcyB0byB0aGUgWCBzZXJ2ZXIuICBUaGVzZSBhcmUgbmV3CiAqIGluIHByb3RvY29sIHZlcnNpb24gMC4xLgogKi8KCgpYUlJTY3JlZW5Db25maWd1cmF0aW9uICpYUlJTY3JlZW5Db25maWcoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuKTsKWFJSU2NyZWVuQ29uZmlndXJhdGlvbiAqWFJSQ29uZmlnKFNjcmVlbiAqc2NyZWVuKTsKdm9pZCBYUlJTZWxlY3RJbnB1dChEaXNwbGF5ICpkcHksIFdpbmRvdyB3aW5kb3csIGludCBtYXNrKTsKCi8qIAogKiB0aGUgZm9sbG93aW5nIGFyZSBhbHdheXMgc2FmZSB0byBjYWxsLCBldmVuIGlmIFJhbmRSIGlzIG5vdCBpbXBsZW1lbnRlZCAKICogb24gYSBzY3JlZW4gCiAqLwoKClJvdGF0aW9uIFhSUlJvdGF0aW9ucyhEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIFJvdGF0aW9uICpjdXJyZW50X3JvdGF0aW9uKTsKWFJSU2NyZWVuU2l6ZSAqWFJSU2l6ZXMoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgKm5zaXplcyk7CnNob3J0ICpYUlJSYXRlcyAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgc2l6ZUlELCBpbnQgKm5yYXRlcyk7ClRpbWUgWFJSVGltZXMgKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgVGltZSAqY29uZmlnX3RpbWVzdGFtcCk7CgoKLyogCiAqIGludGVuZGVkIHRvIHRha2UgUlJTY3JlZW5DaGFuZ2VOb3RpZnksICBvciAKICogQ29uZmlndXJlTm90aWZ5IChvbiB0aGUgcm9vdCB3aW5kb3cpCiAqIHJldHVybnMgMSBpZiBpdCBpcyBhbiBldmVudCB0eXBlIGl0IHVuZGVyc3RhbmRzLCAwIGlmIG5vdAogKi8KaW50IFhSUlVwZGF0ZUNvbmZpZ3VyYXRpb24oWEV2ZW50ICpldmVudCk7CgpfWEZVTkNQUk9UT0VORAoKI2VuZGlmIC8qIF9YUkFORFJfSF8gKi8K