LyoKICogcmVzZXJ2ZWQgY29tbWVudCBibG9jawogKiBETyBOT1QgUkVNT1ZFIE9SIEFMVEVSIQogKi8KLyoKICogJFhGcmVlODY6IHhjL2xpYi9YcmFuZHIvWHJhbmRyLmgsdiAxLjkgMjAwMi8wOS8yOSAyMzozOTo0NCBrZWl0aHAgRXhwICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBDb21wYXEgQ29tcHV0ZXIgQ29ycG9yYXRpb24sIEluYy4KICogQ29weXJpZ2h0IKkgMjAwMiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgQ29tcGFxIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCiAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKICogd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgSFAgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQogKiBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKICogd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEhQIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMCiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIENPTVBBUQogKiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgogKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCiAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqCiAqIEF1dGhvcjogIEppbSBHZXR0eXMsIEhQIExhYnMsIEhQLgogKi8KCiNpZm5kZWYgX1hSQU5EUl9IXwojZGVmaW5lIF9YUkFORFJfSF8KCi8qI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3JhbmRyLmg+Ki8KI2luY2x1ZGUgInJhbmRyLmgiCgojaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KCl9YRlVOQ1BST1RPQkVHSU4KCgp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgd2lkdGgsIGhlaWdodDsKICAgIGludCBtd2lkdGgsIG1oZWlnaHQ7Cn0gWFJSU2NyZWVuU2l6ZTsKCi8qCiAqICBFdmVudHMuCiAqLwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50IHR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIGV2ZW50IGJhc2UgKi8KICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCiAgICBCb29sIHNlbmRfZXZlbnQ7ICAgICAgICAgICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCiAgICBEaXNwbGF5ICpkaXNwbGF5OyAgICAgICAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLwogICAgV2luZG93IHdpbmRvdzsgICAgICAgICAgICAgIC8qIHdpbmRvdyB3aGljaCBzZWxlY3RlZCBmb3IgdGhpcyBldmVudCAqLwogICAgV2luZG93IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIFJvb3Qgd2luZG93IGZvciBjaGFuZ2VkIHNjcmVlbiAqLwogICAgVGltZSB0aW1lc3RhbXA7ICAgICAgICAgICAgIC8qIHdoZW4gdGhlIHNjcmVlbiBjaGFuZ2Ugb2NjdXJyZWQgKi8KICAgIFRpbWUgY29uZmlnX3RpbWVzdGFtcDsgICAgICAvKiB3aGVuIHRoZSBsYXN0IGNvbmZpZ3VyYXRpb24gY2hhbmdlICovCiAgICBTaXplSUQgc2l6ZV9pbmRleDsKICAgIFN1YnBpeGVsT3JkZXIgc3VicGl4ZWxfb3JkZXI7CiAgICBSb3RhdGlvbiByb3RhdGlvbjsKICAgIGludCB3aWR0aDsKICAgIGludCBoZWlnaHQ7CiAgICBpbnQgbXdpZHRoOwogICAgaW50IG1oZWlnaHQ7Cn0gWFJSU2NyZWVuQ2hhbmdlTm90aWZ5RXZlbnQ7CgoKLyogaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gaXMgcHJpdmF0ZSB0byB0aGUgbGlicmFyeSAqLwp0eXBlZGVmIHN0cnVjdCBfWFJSU2NyZWVuQ29uZmlndXJhdGlvbiBYUlJTY3JlZW5Db25maWd1cmF0aW9uOwoKQm9vbCBYUlJRdWVyeUV4dGVuc2lvbiAoRGlzcGxheSAqZHB5LCBpbnQgKmV2ZW50X2Jhc2VwLCBpbnQgKmVycm9yX2Jhc2VwKTsKU3RhdHVzIFhSUlF1ZXJ5VmVyc2lvbiAoRGlzcGxheSAqZHB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAqbWFqb3JfdmVyc2lvbnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICptaW5vcl92ZXJzaW9ucCk7CgpYUlJTY3JlZW5Db25maWd1cmF0aW9uICpYUlJHZXRTY3JlZW5JbmZvIChEaXNwbGF5ICpkcHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyYXcpOwoKdm9pZCBYUlJGcmVlU2NyZWVuQ29uZmlnSW5mbyAoWFJSU2NyZWVuQ29uZmlndXJhdGlvbiAqY29uZmlnKTsKCi8qCiAqIE5vdGUgdGhhdCBzY3JlZW4gY29uZmlndXJhdGlvbiBjaGFuZ2VzIGFyZSBvbmx5IHBlcm1pdHRlZCBpZiB0aGUgY2xpZW50IGNhbgogKiBwcm92ZSBpdCBoYXMgdXAgdG8gZGF0ZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAgV2UgYXJlIHRyeWluZyB0bwogKiBpbnNpc3QgdGhhdCBpdCBiZWNvbWUgcG9zc2libGUgZm9yIHNjcmVlbnMgdG8gY2hhbmdlIGR5bmFtaWNhbGx5LCBzbwogKiB3ZSB3YW50IHRvIGVuc3VyZSB0aGUgY2xpZW50IGtub3dzIHdoYXQgaXQgaXMgdGFsa2luZyBhYm91dCB3aGVuIHJlcXVlc3RpbmcKICogY2hhbmdlcy4KICovClN0YXR1cyBYUlJTZXRTY3JlZW5Db25maWcgKERpc3BsYXkgKmRweSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgWFJSU2NyZWVuQ29uZmlndXJhdGlvbiAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZSBkcmF3LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUm90YXRpb24gcm90YXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgdGltZXN0YW1wKTsKCi8qIGFkZGVkIGluIHYxLjEsIHNvcnJ5IGZvciB0aGUgbGFtZSBuYW1lICovClN0YXR1cyBYUlJTZXRTY3JlZW5Db25maWdBbmRSYXRlIChEaXNwbGF5ICpkcHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUlJTY3JlZW5Db25maWd1cmF0aW9uICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZSBkcmF3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3RhdGlvbiByb3RhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lIHRpbWVzdGFtcCk7CgoKUm90YXRpb24gWFJSQ29uZmlnUm90YXRpb25zKFhSUlNjcmVlbkNvbmZpZ3VyYXRpb24gKmNvbmZpZywgUm90YXRpb24gKmN1cnJlbnRfcm90YXRpb24pOwoKVGltZSBYUlJDb25maWdUaW1lcyAoWFJSU2NyZWVuQ29uZmlndXJhdGlvbiAqY29uZmlnLCBUaW1lICpjb25maWdfdGltZXN0YW1wKTsKClhSUlNjcmVlblNpemUgKlhSUkNvbmZpZ1NpemVzKFhSUlNjcmVlbkNvbmZpZ3VyYXRpb24gKmNvbmZpZywgaW50ICpuc2l6ZXMpOwoKc2hvcnQgKlhSUkNvbmZpZ1JhdGVzIChYUlJTY3JlZW5Db25maWd1cmF0aW9uICpjb25maWcsIGludCBzaXplSUQsIGludCAqbnJhdGVzKTsKClNpemVJRCBYUlJDb25maWdDdXJyZW50Q29uZmlndXJhdGlvbiAoWFJSU2NyZWVuQ29uZmlndXJhdGlvbiAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3RhdGlvbiAqcm90YXRpb24pOwoKc2hvcnQgWFJSQ29uZmlnQ3VycmVudFJhdGUgKFhSUlNjcmVlbkNvbmZpZ3VyYXRpb24gKmNvbmZpZyk7CgppbnQgWFJSUm9vdFRvU2NyZWVuKERpc3BsYXkgKmRweSwgV2luZG93IHJvb3QpOwoKLyoKICogcmV0dXJucyB0aGUgc2NyZWVuIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgc2NyZWVuOyBkb2VzIGEgbGF6eQogKiBldmFsdXRpb24gdG8gZGVsYXkgZ2V0dGluZyB0aGUgaW5mb3JtYXRpb24sIGFuZCBjYWNoZXMgdGhlIHJlc3VsdC4KICogVGhlc2Ugcm91dGluZXMgc2hvdWxkIGJlIHVzZWQgaW4gcHJlZmVyZW5jZSB0byBYUlJHZXRTY3JlZW5JbmZvCiAqIHRvIGF2b2lkIHVubmVlZGVkIHJvdW5kIHRyaXBzIHRvIHRoZSBYIHNlcnZlci4gIFRoZXNlIGFyZSBuZXcKICogaW4gcHJvdG9jb2wgdmVyc2lvbiAwLjEuCiAqLwoKClhSUlNjcmVlbkNvbmZpZ3VyYXRpb24gKlhSUlNjcmVlbkNvbmZpZyhEaXNwbGF5ICpkcHksIGludCBzY3JlZW4pOwpYUlJTY3JlZW5Db25maWd1cmF0aW9uICpYUlJDb25maWcoU2NyZWVuICpzY3JlZW4pOwp2b2lkIFhSUlNlbGVjdElucHV0KERpc3BsYXkgKmRweSwgV2luZG93IHdpbmRvdywgaW50IG1hc2spOwoKLyoKICogdGhlIGZvbGxvd2luZyBhcmUgYWx3YXlzIHNhZmUgdG8gY2FsbCwgZXZlbiBpZiBSYW5kUiBpcyBub3QgaW1wbGVtZW50ZWQKICogb24gYSBzY3JlZW4KICovCgoKUm90YXRpb24gWFJSUm90YXRpb25zKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgUm90YXRpb24gKmN1cnJlbnRfcm90YXRpb24pOwpYUlJTY3JlZW5TaXplICpYUlJTaXplcyhEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGludCAqbnNpemVzKTsKc2hvcnQgKlhSUlJhdGVzIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGludCBzaXplSUQsIGludCAqbnJhdGVzKTsKVGltZSBYUlJUaW1lcyAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBUaW1lICpjb25maWdfdGltZXN0YW1wKTsKCgovKgogKiBpbnRlbmRlZCB0byB0YWtlIFJSU2NyZWVuQ2hhbmdlTm90aWZ5LCAgb3IKICogQ29uZmlndXJlTm90aWZ5IChvbiB0aGUgcm9vdCB3aW5kb3cpCiAqIHJldHVybnMgMSBpZiBpdCBpcyBhbiBldmVudCB0eXBlIGl0IHVuZGVyc3RhbmRzLCAwIGlmIG5vdAogKi8KaW50IFhSUlVwZGF0ZUNvbmZpZ3VyYXRpb24oWEV2ZW50ICpldmVudCk7CgpfWEZVTkNQUk9UT0VORAoKI2VuZGlmIC8qIF9YUkFORFJfSF8gKi8K