LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpZm5kZWYgX0RPU19IXwojZGVmaW5lIF9ET1NfSF8KCi8qIERlZmluaXRpb25zIGZvciBEb3MgZGlza2V0dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCi8qIEdlbmVyYWwgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBTWl9TVERfU0VDVE9SICAgNTEyICAgICAgICAgICAgIC8qIFN0YW5kYXJkIHNlY3RvciBzaXplICAgICAgICAgICAgICAqLwojZGVmaW5lIE1ESVJfU0laRQkzMgkJLyogRGlyZW50cnkgc2l6ZSAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgRkFUX0JJVFMgICAgICAgIDEyICAgICAgICAgICAgICAvKiBEaXNrZXR0ZSB1c2UgMTIgYml0cyBmYXQgICAgICAgICAgKi8KCiNkZWZpbmUgTUFYX1BBVEgJMTI4CQkvKiBNYXggc2l6ZSBvZiB0aGUgTVNET1MgUEFUSCAgICAgICAgKi8KI2RlZmluZSBNQVhfRElSX1NFQ1MJNjQJCS8qIFRhaWxsZSBtYXggZCd1biByZXBlcnRvaXJlIChlbiAgICAqLwoJCQkJCS8qIHNlY3RldXJzKSAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiBNaXNjLiBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgREVMTUFSSyAgICAgICAgICdceGU1JwojZGVmaW5lIEVYVEVOREVEX0JPT1QgICAoMHgyOSkKI2RlZmluZSBNRURJQV9TVEQgICAgICAgKDB4ZjApCiNkZWZpbmUgSlVNUF8wXzEgICAgICAgICgweGU5KQojZGVmaW5lIEpVTVBfMF8yICAgICAgICAoMHhlYikKCi8qIEJvb3Qgc2l6ZSBpcyAyNTYgYnl0ZXMsIGJ1dCB3ZSBuZWVkIHRvIHJlYWQgYWxtb3N0IGEgc2VjdG9yLCB0aGVuCiAgIGFzc3VtZSBib290c2l6ZSBpcyA1MTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBCT09UU0laRSAgICAgICAgNTEyCgovKiBGYXQgZGVmaW5pdGlvbnMgZm9yIDEyIGJpdHMgZmF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgRkFUMTJfTUFYX05CICAgIDQwODYKI2RlZmluZSBGQVQxMl9MQVNUICAgICAgMHgwZmY2CiNkZWZpbmUgRkFUMTJfRU5EICAgICAgIDB4MGZmZgoKLyogZmlsZSBhdHRyaWJ1dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIEFUVFJfUkVBRE9OTFkgICAgICAgICAgIDB4MDEKI2RlZmluZSBBVFRSX0hJRERFTiAgICAgICAgICAgICAweDAyCiNkZWZpbmUgQVRUUl9TWVNURU0gICAgICAgICAgICAgMHgwNAojZGVmaW5lIEFUVFJfVk9MVU1FICAgICAgICAgICAgIDB4MDgKI2RlZmluZSBBVFRSX0RJUkVDVE9SWSAgICAgICAgICAweDEwCiNkZWZpbmUgQVRUUl9BUkNISVZFICAgICAgICAgICAgMHgyMAojZGVmaW5lIEFUVFJfVlNFICAgICAgICAgICAgICAgIDB4MGYKCi8qIE5hbWUgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBFWFRDQVNFICAgICAgICAgICAgICAgICAweDEwCiNkZWZpbmUgQkFTRUNBU0UgICAgICAgICAgICAgICAgMHg4CgovKiBEZWZpbml0aW9uIG9mIHRoZSBib290IHNlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgQkFOTkVSX0xHICAgICAgICAgICAgICAgOAojZGVmaW5lIExBQkVMX0xHICAgICAgICAgICAgICAgIDExCgp0eXBlZGVmIHN0cnVjdCBib290c2VjdG9yCnsKICAgIHVuc2lnbmVkIGNoYXIganVtcCBbM107CS8qIDAgIEp1bXAgdG8gYm9vdCBjb2RlICAgICAgICAgICAgICAgICAgICAgICovCiAgICBjaGFyIGJhbm5lciBbQkFOTkVSX0xHXTsJLyogMyAgT0VNIG5hbWUgJiB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHVuc2lnbmVkIHNob3J0IHNlY3NpejsJLyogMTEgQnl0ZXMgcGVyIHNlY3RvciBob3BlZnVsbHkgNTEyICAgICAgICAgKi8KICAgIHVuc2lnbmVkIGNoYXIgY2xzaXo7CS8qIDEzIENsdXN0ZXIgc2l6ZSBpbiBzZWN0b3JzICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBzaG9ydCBucnN2c2VjdDsJLyogMTQgTnVtYmVyIG9mIHJlc2VydmVkIChib290KSBzZWN0b3JzICAgICAgKi8KICAgIHVuc2lnbmVkIGNoYXIgbmZhdDsJCS8qIDE2IE51bWJlciBvZiBGQVQgdGFibGVzIGhvcGVmdWxseSAyICAgICAgICovCiAgICB1bnNpZ25lZCBzaG9ydCBkaXJlbnRzOwkvKiAxNyBOdW1iZXIgb2YgZGlyZWN0b3J5IHNsb3RzICAgICAgICAgICAgICAqLwogICAgdW5zaWduZWQgc2hvcnQgcHNlY3Q7CS8qIDE5IFRvdGFsIHNlY3RvcnMgb24gZGlzayAgICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBjaGFyIGRlc2NyOwkvKiAyMSBNZWRpYSBkZXNjcmlwdG9yPWZpcnN0IGJ5dGUgb2YgRkFUICAgICAqLwogICAgdW5zaWduZWQgc2hvcnQgZmF0bGVuOwkvKiAyMiBTZWN0b3JzIGluIEZBVCAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgdW5zaWduZWQgc2hvcnQgbnNlY3Q7CS8qIDI0IFNlY3RvcnMvdHJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBzaG9ydCBuaGVhZHM7CS8qIDI2IEhlYWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBpbnQgbmhzOwkgICAgICAgIC8qIDI4IG51bWJlciBvZiBoaWRkZW4gc2VjdG9ycyAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBpbnQgYmlnc2VjdDsJLyogMzIgYmlnIHRvdGFsIHNlY3RvcnMgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHVuc2lnbmVkIGNoYXIgcGh5c2RyaXZlOwkvKiAzNiBwaHlzaWNhbCBkcml2ZSA/ICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgdW5zaWduZWQgY2hhciByZXNlcnZlZDsJLyogMzcgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHVuc2lnbmVkIGNoYXIgZG9zNDsJCS8qIDM4IGRvcyA+IDQuMCBkaXNrZXR0ZSAgICAgICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBpbnQgc2VyaWFsOyAgICAgICAgLyogMzkgc2VyaWFsIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGNoYXIgbGFiZWwgW0xBQkVMX0xHXTsJLyogNDMgZGlzayBsYWJlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGNoYXIgZmF0X3R5cGUgWzhdOwkJLyogNTQgRkFUIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHVuc2lnbmVkIGNoYXIgcmVzXzJtOwkvKiA2MiByZXNlcnZlZCBieSAyTSAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgdW5zaWduZWQgY2hhciBDaGVja1N1bTsJLyogNjMgMk0gY2hlY2tzdW0gKG5vdCB1c2VkKSAgICAgICAgICAgICAgICAgKi8KICAgIHVuc2lnbmVkIGNoYXIgZm10XzJtZjsJLyogNjQgMk1GIGZvcm1hdCB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHVuc2lnbmVkIGNoYXIgd3Q7CQkvKiA2NSAxIGlmIHdyaXRlIHRyYWNrIGFmdGVyIGZvcm1hdCAgICAgICAgICAqLwogICAgdW5zaWduZWQgY2hhciByYXRlXzA7CS8qIDY2IGRhdGEgdHJhbnNmZXIgcmF0ZSBvbiB0cmFjayAwICAgICAgICAgICovCiAgICB1bnNpZ25lZCBjaGFyIHJhdGVfYW55OwkvKiA2NyBkYXRhIHRyYW5zZmVyIHJhdGUgb24gdHJhY2s8PjAgICAgICAgICAqLwogICAgdW5zaWduZWQgc2hvcnQgQm9vdFA7CS8qIDY4IG9mZnNldCB0byBib290IHByb2dyYW0gICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBzaG9ydCBJbmZwMDsJLyogNzAgVDE6IGluZm9ybWF0aW9uIGZvciB0cmFjayAwICAgICAgICAgICAgKi8KICAgIHVuc2lnbmVkIHNob3J0IEluZnBYOwkvKiA3MiBUMjogaW5mb3JtYXRpb24gZm9yIHRyYWNrPD4wICAgICAgICAgICAqLwogICAgdW5zaWduZWQgc2hvcnQgSW5mVG07CS8qIDc0IFQzOiB0cmFjayBzZWN0b3JzIHNpemUgdGFibGUgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBzaG9ydCBEYXRlRjsJLyogNzYgRm9ybWF0IGRhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHVuc2lnbmVkIHNob3J0IFRpbWVGOwkvKiA3OCBGb3JtYXQgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgdW5zaWduZWQgY2hhciBqdW5rIFtCT09UU0laRSAtIDgwXTsJLyogODAgcmVtYWluaW5nIGRhdGEgICAgICAgICAgICAgICAgICovCn0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIEJvb3RTZWN0b3JfdDsKCi8qIFN0cnVjdHVyZSBkJ3VuZSBlbnRyZWUgZGUgcmVwZXJ0b2lyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KdHlwZWRlZiBzdHJ1Y3QgZGlyZWN0b3J5IHsKICAgIGNoYXIgbmFtZSBbOF07CQkvKiBmaWxlIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgY2hhciBleHQgWzNdOwkJLyogZmlsZSBleHRlbnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHVuc2lnbmVkIGNoYXIgYXR0cjsJCS8qIGF0dHJpYnV0ZSBieXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBjaGFyIENhc2U7CQkvKiBjYXNlIG9mIHNob3J0IGZpbGVuYW1lICAgICAgICAgICAgICAgICAgICAqLwogICAgdW5zaWduZWQgY2hhciByZXNlcnZlZCBbOV07CS8qID8/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBjaGFyIHRpbWUgWzJdOwkvKiB0aW1lIHN0YW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgdW5zaWduZWQgY2hhciBkYXRlIFsyXTsJLyogZGF0ZSBzdGFtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHVuc2lnbmVkIHNob3J0IHN0YXJ0OwkvKiBzdGFydGluZyBjbHVzdGVyIG51bWJlciAgICAgICAgICAgICAgICAgICAqLwogICAgdW5zaWduZWQgaW50IHNpemU7CSAgICAgICAgLyogc2l6ZSBvZiB0aGUgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIERpcmVjdG9yeV90OwoKCiNkZWZpbmUgTUFYX1ZGQVRfU1VCRU5UUklFUyAyMAojZGVmaW5lIFZTRV9OQU1FTEVOIDEzCgojZGVmaW5lIFZTRTFTSVpFIDUKI2RlZmluZSBWU0UyU0laRSA2CiNkZWZpbmUgVlNFM1NJWkUgMgoKI2RlZmluZSBWQlVGU0laRSAoKE1BWF9WRkFUX1NVQkVOVFJJRVMgKiBWU0VfTkFNRUxFTikgKyAxKQoKI2RlZmluZSBNQVhfVk5BTUVMRU4gKDI1NSkKCiNkZWZpbmUgVlNFX1BSRVNFTlQgMHgwMQojZGVmaW5lIFZTRV9MQVNUIDB4NDAKI2RlZmluZSBWU0VfTUFTSyAweDFmCgovKiBGbGFnIHVzZWQgYnkgdmZhdF9sb29rdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgRE9fT1BFTiAgICAgICAgIDEKI2RlZmluZSBBQ0NFUFRfUExBSU4gICAgMHgyMAojZGVmaW5lIEFDQ0VQVF9ESVIgICAgICAweDEwCiNkZWZpbmUgQUNDRVBUX0xBQkVMICAgIDB4MDgKI2RlZmluZSBTSU5HTEUgICAgICAgICAgMgojZGVmaW5lIE1BVENIX0FOWSAgICAgICAweDQwCgpzdHJ1Y3QgdmZhdF9zdWJlbnRyeSB7CiAgICB1bnNpZ25lZCBjaGFyIGlkOwkJICAgICAgICAvKiBWU0VfTEFTVCBwb3VyIGxhIGZpbiwgVlNFX01BU0sgICAgKi8KCQkJCQkvKiBwb3VyIHVuIFZTRSAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGNoYXIgdGV4dDEgW1ZTRTFTSVpFICogMl07ICAgICAgICAgIC8qIENhcmFjdGVyZXMgZW5jb2RlcyBzdXIgMTYgYml0cyAgICAqLwogICAgdW5zaWduZWQgY2hhciBhdHRyaWJ1dGU7CSAgICAgICAgLyogMHgwZiBwb3VyIGxlcyBWRkFUICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBjaGFyIGhhc2gxOwkJLyogdG91am91cnMgMCAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBjaGFyIHN1bTsJCSAgICAgICAgLyogQ2hlY2tzdW0gZHUgbm9tIGNvdXJ0ICAgICAgICAgICAgICovCiAgICBjaGFyIHRleHQyIFtWU0UyU0laRSAqIDJdOyAgICAgICAgICAvKiBDYXJhY3RlcmVzIGVuY29kZXMgc3VyIDE2IGJpdHMgICAgKi8KICAgIHVuc2lnbmVkIGNoYXIgc2VjdG9yX2w7ICAgICAgICAgICAgIC8qIDAgcG91ciBsZXMgVkZBVCAgICAgICAgICAgICAgICAgICAqLwogICAgdW5zaWduZWQgY2hhciBzZWN0b3JfdTsJCS8qIDAgcG91ciBsZXMgVkZBVCAgICAgICAgICAgICAgICAgICAqLwogICAgY2hhciB0ZXh0MyBbVlNFM1NJWkUgKiAyXTsgICAgICAgICAgLyogQ2FyYWN0ZXJlcyBlbmNvZGVzIHN1ciAxNiBiaXRzICAgICovCn0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIDsKCnN0cnVjdCB2ZmF0X3N0YXRlIHsKICAgIGNoYXIgbmFtZSBbVkJVRlNJWkVdOwogICAgaW50IHN0YXR1czsgICAgICAgICAgICAgLyogaXMgbm93IGEgYml0IG1hcCBvZiAzMiBiaXRzICAgICAgICAgICAgICAgICAgICovCiAgICBpbnQgc3ViZW50cmllczsKICAgIHVuc2lnbmVkIGNoYXIgc3VtOyAgICAgIC8qIG5vIG5lZWQgdG8gcmVtZW1iZXIgdGhlIHN1bSBmb3IgZWFjaCAgICAgICAgICAqLwoJCQkgICAgLyogICBlbnRyeSwgaXQgaXMgdGhlIHNhbWUgYW55d2F5cyAgICAgICAgICAgICAgICovCn0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIDsKCi8qIENvbnZlcnNpb24gbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZQlET1NfWUVBUihkaXIpICgoKGRpciktPmRhdGVbMV0gPj4gMSkgKyAxOTgwKQojZGVmaW5lCURPU19NT05USChkaXIpICgoKCgoZGlyKS0+ZGF0ZVsxXSYweDEpIDw8IDMpICsgKChkaXIpLT5kYXRlWzBdID4+IDUpKSkKI2RlZmluZQlET1NfREFZKGRpcikgKChkaXIpLT5kYXRlWzBdICYgMHgxZikKI2RlZmluZQlET1NfSE9VUihkaXIpICgoZGlyKS0+dGltZVsxXSA+PiAzKQojZGVmaW5lCURPU19NSU5VVEUoZGlyKSAoKCgoKGRpciktPnRpbWVbMV0mMHg3KSA8PCAzKSArICgoZGlyKS0+dGltZVswXSA+PiA1KSkpCiNkZWZpbmUJRE9TX1NFQyhkaXIpICgoKGRpciktPnRpbWVbMF0gJiAweDFmKSAqIDIpCgoKI2VuZGlmCg==