Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgRkRLIHJlc2FtcGxlciB0b29sIGJveDogCiAgXGF1dGhvciBNLiBXZXJuZXIKKi8KCiNpbmNsdWRlICJyZXNhbXBsZXIuaCIKCiNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgQklRVUFEIEZpbHRlciBTcGVjaWZpY2F0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIEIxIDAKI2RlZmluZSBCMiAxCiNkZWZpbmUgQTEgMgojZGVmaW5lIEEyIDMKCiNkZWZpbmUgQlFDKHgpIEZMMkZYQ09OU1RfU0dMKHgvMikKCgpzdHJ1Y3QgRklMVEVSX1BBUkFNIHsKICBjb25zdCBGSVhQX1NHTCAqY29lZmZhOyAgICAvKiEgU09TIG1hdHJpeCBPbmUgcm93L3NlY3Rpb24uIFNjYWxlZCB1c2luZyBCUUMoKS4gT3JkZXIgb2YgY29lZmZpY2llbnRzOiBCMSxCMixBMSxBMi4gQjA9QTA9MS4wICovCiAgRklYUF9EQkwgZzsgICAgICAgICAgICAgICAgLyohIG92ZXJhbGwgZ2FpbiAqLwogIGludCBXYzsgICAgICAgICAgICAgICAgICAgIC8qISBub3JtYWxpemVkIHBhc3NiYW5kIGJhbmR3aWR0aCBhdCBpbnB1dCBzYW1wbGVyYXRlICogMTAwMCAqLwogIGludCBub0NvZWZmczsgICAgICAgICAgICAgIC8qISBudW1iZXIgb2YgZmlsdGVyIGNvZWZmcyAqLwogIGludCBkZWxheTsgICAgICAgICAgICAgICAgIC8qISBkZWxheSBpbiBzYW1wbGVzIGF0IGlucHV0IHNhbXBsZXJhdGUgKi8KfTsKCiNkZWZpbmUgQklRVUFEX0NPRUZTVEVQIDQKCi8qKgogKlxicmllZiBMb3cgUGFzcwogV2MgPSAwLDUsIG9yZGVyIDMwLCBTdG9wIEJhbmQgLTk2ZEIuIFdjIGNyaXRlcmlhIGlzICJhbG1vc3QgMGRCIHBhc3NiYW5kIiwgbm90IHRoZSB1c3VhbCAtM2RiIGdhaW4gcG9pbnQuCiBbYixhXT1jaGVieTIoMzAsOTYsMC41MDUpCiBbc29zLGddPXRmMnNvcyhiLGEpCiBiYW5kd2lkdGggMC40OAogKi8Kc3RhdGljIGNvbnN0IEZJWFBfU0dMIHNvczQ4W10gPSB7CiBCUUMoMS45ODk0MTA3NTY4MTkzOCksICAgQlFDKDAuOTk5OTk5OTk2ODkwODExKSwgQlFDKDAuODYzMjY0NTI3MjAxOTYzKSwgICAgIEJRQyggMC4xODk1NTM3OTk5NjA2NjMpLAogQlFDKDEuOTA3MzM4MDQ4MjI0NDUpLCAgIEJRQygxLjAwMDAwMDAxNzM2MTg5KSwgIEJRQygwLjgzNjMyMTU3NTg0MTY5MSksICAgICBCUUMoIDAuMjAzNTA1ODA5MjY2NTY0KSwKIEJRQygxLjc1NjE2NjY1NDk1MzI1KSwgICBCUUMoMC45OTk5OTk5NDYwNzk3MjEpLCBCUUMoMC43ODQ2OTkyMjUxMjE1ODgpLCAgICAgQlFDKCAwLjIzMDQ3MTI2NTUwNjk4NiksCiBCUUMoMS41NTcyNzc0NTUxMjcyNiksICAgQlFDKDEuMDAwMDAwMTE3Mzc4MTUpLCAgQlFDKDAuNzEyNTE1NDIzNTg4MzUxKSwgICAgIEJRQyggMC4yNjg3NTI3MjM5MDA0OTgpLAogQlFDKDEuMzM0MDc1OTE5NDM2NDMpLCAgIEJRQygwLjk5OTk5OTc5NTk1MzIyOCksIEJRQygwLjYyNTA1OTExNzMzMDk4OSksICAgICBCUUMoIDAuMzE2MTk0Njg1Mjg4OTY1KSwKIEJRQygxLjEwNjg5ODk4NDEyNDU4KSwgICBCUUMoMS4wMDAwMDAzNTA1NzExNCksICBCUUMoMC41MjgwMzUxNDM2NjM5OCksICAgICAgQlFDKCAwLjM3MDUxNzg0MzIyNDY2OSksCiBCUUMoMC44OTA2MDM3MTA3ODQ1NCksICAgQlFDKDAuOTk5OTk5MzQzOTYyODIyKSwgQlFDKDAuNDI2OTIwNDYyMTY1MjU3KSwgICAgIEJRQyggMC40Mjk2MDgyMDAyMDc3NDYpLAogQlFDKDAuNjk0NDM4MjYxMjA5NDMzKSwgIEJRQyggMS4wMDAwMDA4NjI5NzkyKSwgIEJRQygwLjMyNjUzMDY5OTU2MTcxNiksICAgICBCUUMoIDAuNDkxNzE0NDUwNjU0MTc0KSwKIEJRQygwLjUyMzIzNzgwMDkzNTMyMiksICBCUUMoMS4wMDAwMDEwMTM0OTc4MiksICBCUUMoMC4yMzA4Mjk1NTYyNzQ4NTEpLCAgICAgQlFDKCAwLjU1NTU1OTAzNDg0MzI4MSksCiBCUUMoMC4zNzg2MzExNjU5Mjk1NjMpLCAgQlFDKDAuOTk5OTg5ODY0ODI2NjUpLCAgQlFDKDAuMTQyOTA2NDIyMDM2MDk1KSwgICAgIEJRQyggMC42MjAzMzg4NzQ0NDI0MTEpLAogQlFDKDAuMjYwNzg2OTExMzA4NDM3KSwgIEJRQygxLjAwMDAzMjYxNDYwMTc4KSwgIEJRQygwLjA2NTEwMDg1NzYyNTY1MDUpLCAgICBCUUMoIDAuNjg1NzU5OTIzOTI2MjYyKSwKIEJRQygwLjE2ODQwOTQyOTE4ODA5OCksICBCUUMoMC45OTk5MzMwNDk2OTU4MjgpLCBCUUMoLTAuMDAwNzkwMDY3Nzg5OTc1NTYyKSwgQlFDKCAwLjc1MTkwNTg5NjYwMjMyNSksCiBCUUMoMC4xMDA3MjQ1MzM4MTg2MjgpLCAgQlFDKDEuMDAwMDk0NzI2Njk4NzIpLCAgQlFDKC0wLjA1MzM3NzI4MzAyNTcwNDEpLCAgIEJRQyggMC44MTkzMDc0NDM4NDUyNSksCiBCUUMoMC4wNTYxNDM0MzU3ODY3MzYzKSwgQlFDKDAuOTk5OTExNjM2MzA0Mjc2KSwgQlFDKC0wLjA5MTM1NTAyOTkyMzY0MDUpLCAgIEJRQyggMC44ODg4MzYyNTg3NTkxNSksCiBCUUMoMC4wMzQxNjgwNjc4NjYyMDU3KSwgQlFDKDEuMDAwMDM2Njc1MDg2NzYpLCAgQlFDKC0wLjExMzQwNTE4NTUzNjY5NyksICAgIEJRQyggMC45NjE3NTY2MzgyNjg0NDYpCn07CgojaWZkZWYgUlNfQklRVUFEX1NDQVRURVJHQUlOCnN0YXRpYyBjb25zdCBGSVhQX0RCTCBnNDggPSBGTDJGWENPTlNUX0RCTCgwLjY3NDM2NTMyMDYxMTYxOTkyNjgyNDA0NDgwNzE3NjcxIC0gMC4wMDEpOwojZWxzZQpzdGF0aWMgY29uc3QgRklYUF9EQkwgZzQ4ID0gRkwyRlhDT05TVF9EQkwoMC4wMDI3MTI4NjY1MzAwNDcpIC0gKEZJWFBfREJMKTB4ODAwMDsKI2VuZGlmCgpzdGF0aWMgY29uc3Qgc3RydWN0IEZJTFRFUl9QQVJBTSBwYXJhbV9zZXQ0OCA9IHsKICBzb3M0OCwKICBnNDgsCiAgNDgwLAogIDE1LAogIDQgLyogTEYgMiAqLwp9OwoKLyoqCiAqXGJyaWVmIExvdyBQYXNzCiBXYyA9IDAsNSwgb3JkZXIgMjQsIFN0b3AgQmFuZCAtOTZkQi4gV2MgY3JpdGVyaWEgaXMgImFsbW9zdCAwZEIgcGFzc2JhbmQiLCBub3QgdGhlIHVzdWFsIC0zZGIgZ2FpbiBwb2ludC4KIFtiLGFdPWNoZWJ5MigyNCw5NiwwLjUpCiBbc29zLGddPXRmMnNvcyhiLGEpCiBiYW5kd2lkdGggMC40NQogKi8Kc3RhdGljIGNvbnN0IEZJWFBfU0dMIHNvczQ1W10gPSB7CiAgQlFDKDEuOTgyOTYyNjAxNDQ0KSwgICAgIEJRQygxLjAwMDAwMDAwMDA3NTA0KSwgIEJRQygwLjY0NjExMzMwMzczNzgzNiksICAgQlFDKCAwLjEwODUxMTQ5OTc5OTgxKSwKICBCUUMoMS44NTMzNDA5NDI4MTExMSksICAgQlFDKDAuOTk5OTk5OTk5Njc3MTkyKSwgQlFDKDAuNjEyMDczMjIwMTAyMDA2KSwgICBCUUMoIDAuMTMwMDIyMTQxNjk4MDQ0KSwKICBCUUMoMS42MjU0MTA1MTQxNTQyNSksICAgQlFDKDEuMDAwMDAwMDAwODAzOTgpLCAgQlFDKDAuNTQ3ODc5NzAyODU1OTU5KSwgICBCUUMoIDAuMTcxMTY1ODI1MTMzMTkyKSwKICBCUUMoMS4zNDU1NDY1NjkyMzI0NyksICAgQlFDKDAuOTk5OTk5OTk4MDE2OSksICAgQlFDKDAuNDYwMzczOTE0NTA4NDkxKSwgICBCUUMoIDAuMjI4Njc3NDYzMzc2MzU0KSwKICBCUUMoMS4wNTY1NjU2ODUwMzExNiksICAgQlFDKDEuMDAwMDAwMDA1NjkzNjMpLCAgQlFDKDAuMzU3ODkxODk0MDM4Mjg3KSwgICBCUUMoIDAuMjk4Njc2ODQzOTEyMTg1KSwKICBCUUMoMC43ODc5Njc1ODc4NzczMTIpLCAgQlFDKDAuOTk5OTk5OTg0NDE1MDE3KSwgQlFDKDAuMjQ4ODI2ODkzMjExODc3KSwgICBCUUMoIDAuMzc3NDQxODAzNTEyOTc4KSwKICBCUUMoMC41NTU0ODA5NzExMjA0OTcpLCAgQlFDKDEuMDAwMDAwMDM1ODMzMDcpLCAgQlFDKDAuMTQwNjE0MjYzMzQ1MzE1KSwgICBCUUMoIDAuNDYxOTc5MzAyMjEzNjc5KSwKICBCUUMoMC4zNjQ5ODYyMDcwNzA5NjQpLCAgQlFDKDAuOTk5OTk5OTMyMDg0MzAzKSwgQlFDKDAuMDM5MjY2OTQ0NjA3NDUxNiksICBCUUMoIDAuNTUwMzM0NTExODA4MjUpLAogIEJRQygwLjIxNjgyNzI2NzYzMTU1OCksICBCUUMoMS4wMDAwMDAxMDUzNDY4MiksICBCUUMoLTAuMDUwNjIzMjIyODg2NTEwMyksIEJRQyggMC42NDE2OTE1ODE1NjA5NDYpLAogIEJRQygwLjEwODk1MTY3MjI3NzExOSksICBCUUMoMC45OTk5OTk4NzExNjc1MTYpLCBCUUMoLTAuMTI1NTg0ODQwMTgzMjI1KSwgIEJRQyggMC43MzYzNjc3NDg3NzE4MDMpLAogIEJRQygwLjAzODc5ODg2MDcyMjkwMzUpLCBCUUMoMS4wMDAwMDAxMTIwNTU3NCksICBCUUMoLTAuMTgyODE0ODQ5MDk3OTc0KSwgIEJRQyggMC44MzU4MDIxMDg3MTQ5NjQpLAogIEJRQygwLjAwNDI4NjYxNzU4MDkyMjUpLCBCUUMoMC45OTk5OTk5NTQ4MzA4MTMpLCBCUUMoLTAuMjE5NjU3NDA2MTcxNTEpLCAgIEJRQyggMC45NDI2MjMwNDc3ODIzNjMpCn07CgojaWZkZWYgUlNfQklRVUFEX1NDQVRURVJHQUlOCnN0YXRpYyBjb25zdCBGSVhQX0RCTCBnNDUgPSBGTDJGWENPTlNUX0RCTCgwLjYwNTQ3NDI4ODkxMzQxMzE5MDUxMTQyNjI5NzA2NzIzIC0gMC4wMDEpOwojZWxzZQpzdGF0aWMgY29uc3QgRklYUF9EQkwgZzQ1ID0gRkwyRlhDT05TVF9EQkwoMC4wMDI0Mjc0Mzk4MDkwOTUyNCkgLSAoRklYUF9EQkwpMHg4MDAwOwojZW5kaWYKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgRklMVEVSX1BBUkFNIHBhcmFtX3NldDQ1ID0gewogIHNvczQ1LAogIGc0NSwKICA0NTAsCiAgMTIsCiAgNCAvKiBMRiAyICovCn07CgovKgogQ3JlYXRlZCBieSBPY3RhdmUgMi4xLjczLCBNb24gT2N0IDEzIDE3OjMxOjMyIDIwMDggQ0VTVAogV2MgPSAwLDUsIG9yZGVyIDE2LCBTdG9wIEJhbmQgLTk2ZEIgZGFtcGluZy4KIFtiLGFdPWNoZWJ5MigxNiw5NiwwLjUpCiBbc29zLGddPXRmMnNvcyhiLGEpCiBiYW5kd2lkdGggPSAwLjQxCiAqLwoKc3RhdGljIGNvbnN0IEZJWFBfU0dMIHNvczQxW10gPQp7CiAgQlFDKDEuOTYxOTM2MjUyOTIpLCAgICAgICBCUUMoMC45OTk5OTk5OTk5OTk5NjQpLCBCUUMoMC4xNjkyNjYxNzg3ODY3ODkpLCAgIEJRQygwLjAxMjg4MjMzMDA0NzU5MDcpLAogIEJRQygxLjY4OTEzNDM3NjYyMDkyKSwgICAgQlFDKDEuMDAwMDAwMDAwMDAwNTMpLCAgQlFDKDAuMTI0NzUxNTAzMjA2NTUyKSwgICBCUUMoMC4wNTM3NDcyMjczOTUwOTg5KSwKICBCUUMoMS4yNzI3NDY5MjM2NjAxNyksICAgIEJRQygwLjk5OTk5OTk5OTk5NTY3NCksIEJRQygwLjA0MzMxMDg2MjUxNzgzNTcpLCAgQlFDKDAuMTMxMDE1NzUzMjM2MzE3KSwKICBCUUMoMC44NTIxNDE3NTA4ODM5NSksICAgIEJRQygxLjAwMDAwMDAwMDAxODEzKSwgIEJRQygtMC4wNjI1NjU4MTUyNTUwNDA4KSwgQlFDKDAuMjM3NzYzNzc4OTkzODA2KSwKICBCUUMoMC41MDM4NDE1Nzk5MzkwMDkpLCAgIEJRQygwLjk5OTk5OTk5OTk1MzIyMyksIEJRQygtMC4xNzkxNzYxMjg3MjI4NjUpLCAgQlFDKDAuMzY3NDc1MjM2NDI0NDc0KSwKICBCUUMoMC4yNDk5OTA3MTE5ODYxNjIpLCAgIEJRQygxLjAwMDAwMDAwMDA3OTUyKSwgIEJRQygtMC4yOTQ0MjUxNjU4MjQ2NzYpLCAgQlFDKDAuNTE2NTk0ODU3MTcwMjEyKSwKICBCUUMoMC4wODc5NzE2Njg2ODAyODYpLCAgIEJRQygwLjk5OTk5OTk5OTkxNTUyOCksIEJRQygtMC4zOTg5NTY1NjY3Nzc5MjgpLCAgQlFDKDAuNjg2NDE3NzY3ODAxMTIzKSwKICBCUUMoMC4wMDk2NTM3MzMyNTM1MDI5NCksIEJRQygxLjAwMDAwMDAwMDAzNzQ0KSwgIEJRQygtMC40ODU3OTE3Mzc2NDgxNyksICAgQlFDKDAuODg0OTMxNTM0MjM5MDY4KQp9OwoKI2lmZGVmIFJTX0JJUVVBRF9TQ0FUVEVSR0FJTgpzdGF0aWMgY29uc3QgRklYUF9EQkwgZzQxID0gRkwyRlhDT05TVF9EQkwoMC40NDU3ODUxNDQ3NjQ3NjY3OTc1MDgxMTIyMjEyMzU2OSk7CiNlbHNlCnN0YXRpYyBjb25zdCBGSVhQX0RCTCBnNDEgPSBGTDJGWENPTlNUX0RCTCgwLjAwMTU1OTU2OTUxMTY5MjQ4KTsKI2VuZGlmCgpzdGF0aWMgY29uc3Qgc3RydWN0IEZJTFRFUl9QQVJBTSBwYXJhbV9zZXQ0MSA9IHsKICBzb3M0MSwKICBnNDEsCiAgNDEwLAogIDgsCiAgNSAvKiBMRiAzICovCn07CgovKgogIyBDcmVhdGVkIGJ5IE9jdGF2ZSAyLjEuNzMsIE1vbiBPY3QgMTMgMTc6NTU6MzMgMjAwOCBDRVNUCiBXYyA9IDAsNSwgb3JkZXIgMTIsIFN0b3AgQmFuZCAtOTZkQiBkYW1waW5nLgogW2IsYV09Y2hlYnkyKDEyLDk2LDAuNSk7CiBbc29zLGddPXRmMnNvcyhiLGEpCiovCnN0YXRpYyBjb25zdCBGSVhQX1NHTCBzb3MzNVtdID0KewogIEJRQygxLjkzMjk5MzI1MjM1NzYyKSwgICBCUUMoMC45OTk5OTk5OTk5OTk5ODUpLCBCUUMoLTAuMTQwNzMzMTg3MjQ2NTk2KSwgQlFDKDAuMDEyNDEzOTQ5NzgzNjA2MiksCiAgQlFDKDEuNDg5MDQxNjc2NDEwOSksICAgIEJRQygxLjAwMDAwMDAwMDAwMDExKSwgIEJRQygtMC4xOTgyMTU0MDI1ODg1MDQpLCBCUUMoMC4wNzQ2NzMwNjE2NTg0MTM4KSwKICBCUUMoMC45MTg0NTAxNjEzMDk3OTUpLCAgQlFDKDAuOTk5OTk5OTk5OTk5NjE5KSwgQlFDKC0wLjMwMTMzOTEyNzkxOTQxKSwgIEJRQygwLjE5MjI3NjQ2ODgzOTUyOSksCiAgQlFDKDAuNDU0ODc3MDI0MjQ2ODE4KSwgIEJRQygxLjAwMDAwMDAwMDAwMDg2KSwgIEJRQygtMC40MzIzMzczMjg4MDk4MTUpLCBCUUMoMC4zNTY4NTI5MzM2NDI4MTUpLAogIEJRQygwLjE1ODAxNzE0NzExODUwNyksICBCUUMoMC45OTk5OTk5OTk5OTg4NzYpLCBCUUMoLTAuNTc0ODE3NDk0MjQ5Nzc3KSwgQlFDKDAuNTY2MzgwNDM2OTcwODMzKSwKICBCUUMoMC4wMTcxODM0NjQ5NDc4NzQ5KSwgQlFDKDEuMDAwMDAwMDAwMDAwNTUpLCAgQlFDKC0wLjcxODU4MTE3ODA0MTE2NSksIEJRQygwLjgzMzY3NDg0NDg3ODg5KQp9OwoKI2lmZGVmIFJTX0JJUVVBRF9TQ0FUVEVSR0FJTgpzdGF0aWMgY29uc3QgRklYUF9EQkwgZzM1ID0gRkwyRlhDT05TVF9EQkwoMC4zNDI5MDg1MzU3NDk3Mzg5ODY5NDUyMTI2NzYwNjc5Mik7CiNlbHNlCnN0YXRpYyBjb25zdCBGSVhQX0RCTCBnMzUgPSBGTDJGWENPTlNUX0RCTCgwLjAwMTYyNTgwOTk0MTI1MTMxKTsKI2VuZGlmCgpzdGF0aWMgY29uc3Qgc3RydWN0IEZJTFRFUl9QQVJBTSBwYXJhbV9zZXQzNSA9IHsKICBzb3MzNSwKICBnMzUsCiAgMzUwLAogIDYsCiAgNAp9OwoKLyoKICMgQ3JlYXRlZCBieSBPY3RhdmUgMi4xLjczLCBNb24gT2N0IDEzIDE4OjE1OjM4IDIwMDggQ0VTVAogV2MgPSAwLDUsIG9yZGVyIDgsIFN0b3AgQmFuZCAtOTZkQiBkYW1waW5nLgogW2IsYV09Y2hlYnkyKDgsOTYsMC41KTsKIFtzb3MsZ109dGYyc29zKGIsYSkKKi8Kc3RhdGljIGNvbnN0IEZJWFBfU0dMIHNvczI1W10gPQp7CiAgQlFDKDEuODUzMzQwOTQzMDEyMjUpLCAgIEJRQygxLjApLCAgICAgICAgICAgICAgIEJRQygtMC43MDIxMjcyMTQyMTI2NjMpLCBCUUMoMC4xMzI0NTI0MDM5OTg3NjcpLAogIEJRQygxLjA1NjU2NTY4MjE2NyksICAgICBCUUMoMC45OTk5OTk5OTk5OTk5OTcpLCBCUUMoLTAuNzg5NTAzNjY3ODgwNzg1KSwgQlFDKDAuMjM2MzI4NjkzNTY5MTI4KSwKICBCUUMoMC4zNjQ5ODYzMDc0NTU0ODkpLCAgQlFDKDAuOTk5OTk5OTk5OTk5OTk2KSwgQlFDKC0wLjk1NTE5MTE4OTg0MzM3NSksIEJRQygwLjQ0Mjk2NjQ1NzkzNjM3OSksCiAgQlFDKDAuMDM4Nzk4NTc1MTY0MjEyNSksIEJRQygxLjApLCAgICAgICAgICAgICAgIEJRQygtMS4xOTgxNzc4NjA4ODA4NCksICBCUUMoMC43NzA0OTM4OTU0NTYzMjgpCn07CgojaWZkZWYgUlNfQklRVUFEX1NDQVRURVJHQUlOCnN0YXRpYyBjb25zdCBGSVhQX0RCTCBnMjUgPSBGTDJGWENPTlNUX0RCTCgwLjE3NTMzOTE3NDA4OTM2MzQ2OTYwMDgwMjU5OTUwNDcxKTsKI2Vsc2UKc3RhdGljIGNvbnN0IEZJWFBfREJMIGcyNSA9IEZMMkZYQ09OU1RfREJMKDAuMDAwOTQ1MTgyODM1Mjk0NTU5KTsKI2VuZGlmCgpzdGF0aWMgY29uc3Qgc3RydWN0IEZJTFRFUl9QQVJBTSBwYXJhbV9zZXQyNSA9IHsKICBzb3MyNSwKICBnMjUsCiAgMjUwLAogIDQsCiAgNQp9OwoKLyogTXVzdCBiZSBzb3J0ZWQgaW4gZGVzY2VuZGluZyBvcmRlciAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IEZJTFRFUl9QQVJBTSAqY29uc3QgZmlsdGVyX3BhcmFtU2V0W10gPSB7CiAgJnBhcmFtX3NldDQ4LAogICZwYXJhbV9zZXQ0NSwKICAmcGFyYW1fc2V0NDEsCiAgJnBhcmFtX3NldDM1LAogICZwYXJhbV9zZXQyNQp9OwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgUmVzYW1wbGVyIEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKLyohCiAgXGJyaWVmICAgUmVzZXQgZG93bnNhbXBsZXIgaW5zdGFuY2UgYW5kIGNsZWFyIGRlbGF5IGxpbmVzCgogIFxyZXR1cm4gIHN1Y2Nlc3Mgb2Ygb3BlcmF0aW9uCiovCgpJTlQgRkRLYWFjRW5jX0luaXREb3duc2FtcGxlcihET1dOU0FNUExFUiAqRG93blNhbXBsZXIsIC8qITwgcG9pbnRlciB0byBkb3duc2FtcGxlciBpbnN0YW5jZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgV2MsICAgICAgICAgICAgICAgICAgIC8qITwgbm9ybWFsaXplZCBjdXRvZmYgZnJlcSAqIDEwMDAqICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF0aW8pICAgICAgICAgICAgICAgIC8qITwgZG93bnNhbXBsZXIgcmF0aW8gKG9ubHkgMiBzdXBwb3J0ZWQgYXQgdGhlIG1vbW1lbnQpICovCgp7CiAgVUlOVCBpOwogIGNvbnN0IHN0cnVjdCBGSUxURVJfUEFSQU0gKmN1cnJlbnRTZXQ9TlVMTDsKCiAgRkRLX0FTU0VSVChyYXRpbyA9PSAyKTsKICBGREttZW1jbGVhcihEb3duU2FtcGxlci0+ZG93bkZpbHRlci5zdGF0ZXMsIHNpemVvZihEb3duU2FtcGxlci0+ZG93bkZpbHRlci5zdGF0ZXMpKTsKICBEb3duU2FtcGxlci0+ZG93bkZpbHRlci5wdHIgICA9ICAgMDsKCiAgLyoKICAgIGZpbmQgYXBwbGljYWJsZSBwYXJhbWV0ZXIgc2V0CiAgKi8KICBjdXJyZW50U2V0ID0gZmlsdGVyX3BhcmFtU2V0WzBdOwogIGZvcihpPTE7aTxzaXplb2YoZmlsdGVyX3BhcmFtU2V0KS9zaXplb2Yoc3RydWN0IEZJTFRFUl9QQVJBTSAqKTtpKyspewogICAgaWYgKGZpbHRlcl9wYXJhbVNldFtpXS0+V2MgPD0gV2MpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjdXJyZW50U2V0ID0gZmlsdGVyX3BhcmFtU2V0W2ldOwogIH0KCiAgRG93blNhbXBsZXItPmRvd25GaWx0ZXIuY29lZmZhID0gY3VycmVudFNldC0+Y29lZmZhOwoKCiAgRG93blNhbXBsZXItPmRvd25GaWx0ZXIuZ2FpbiA9IGN1cnJlbnRTZXQtPmc7CiAgRkRLX0FTU0VSVChjdXJyZW50U2V0LT5ub0NvZWZmcyA8PSBNQVhOUl9TRUNUSU9OUyoyKTsKCiAgRG93blNhbXBsZXItPmRvd25GaWx0ZXIubm9Db2VmZnMgPSBjdXJyZW50U2V0LT5ub0NvZWZmczsKICBEb3duU2FtcGxlci0+ZGVsYXkgPSBjdXJyZW50U2V0LT5kZWxheTsKICBEb3duU2FtcGxlci0+ZG93bkZpbHRlci5XYyA9IGN1cnJlbnRTZXQtPldjOwoKICBEb3duU2FtcGxlci0+cmF0aW8gPSAgIHJhdGlvOwogIERvd25TYW1wbGVyLT5wZW5kaW5nID0gcmF0aW8tMTsKICByZXR1cm4oMSk7Cn0KCgovKiEKICBcYnJpZWYgICBmYXN0ZXIgc2ltcGxlIGZvbGRpbmcgb3BlcmF0aW9uCiAgICAgICAgICAgRmlsdGVyOgogICAgICAgICAgIEgoeikgPSBBKHopL0IoeikKICAgICAgICAgICB3aXRoCiAgICAgICAgICAgQSh6KSA9IGFbMF0qel4wICsgYVsxXSp6XjEgKyBhWzJdKnpeMiAuLi4gYVtuXSp6Xm4KCiAgXHJldHVybiAgZmlsdGVyZWQgdmFsdWUKKi8KCnN0YXRpYyBpbmxpbmUgSU5UX1BDTSBBZHZhbmNlRmlsdGVyKExQX0ZJTFRFUiAqZG93bkZpbHRlciwgIC8qITwgcG9pbnRlciB0byBpaXIgZmlsdGVyIGluc3RhbmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAqcElucHV0LCAgICAgICAgICAvKiE8IGlucHV0IG9mIGZpbHRlciAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvd25SYXRpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpblN0cmlkZSkKewogIElOVF9QQ00gb3V0cHV0OwogIGludCBpLCBuOwoKCiNpZmRlZiBSU19CSVFVQURfU0NBVFRFUkdBSU4KI2RlZmluZSBCSVFVQURfU0NBTEUgMwojZWxzZQojZGVmaW5lIEJJUVVBRF9TQ0FMRSAxMgojZW5kaWYKCiAgRklYUF9EQkwgeSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogIEZJWFBfREJMIGlucHV0OwoKICBmb3IgKG49MDsgbjxkb3duUmF0aW87IG4rKykKICB7CiAgICBGSVhQX0JRUyAoKnN0YXRlcylbMl0gPSBkb3duRmlsdGVyLT5zdGF0ZXM7CiAgICBjb25zdCBGSVhQX1NHTCAqY29lZmYgPSBkb3duRmlsdGVyLT5jb2VmZmE7CiAgICBpbnQgczEsczI7CgogICAgczEgPSBkb3duRmlsdGVyLT5wdHI7CiAgICBzMiA9IHMxIF4gMTsKCiNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCiAgICBpbnB1dCA9ICAoKEZJWFBfREJMKXBJbnB1dFtuKmluU3RyaWRlXSkgPDwgKERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLUJJUVVBRF9TQ0FMRSk7CiNlbGlmIChTQU1QTEVfQklUUyA9PSAzMikKICAgIGlucHV0ID0gIHBJbnB1dFtuKmluU3RyaWRlXSA+PiBCSVFVQURfU0NBTEU7CiNlbHNlCiNlcnJvciBOT1QgSU1QTEVNRU5URUQKI2VuZGlmCgojaWZuZGVmIFJTX0JJUVVBRF9TQ0FUVEVSR0FJTiAvKiBNZXJnZWQgRGlyZWN0IGZvcm0gSSAqLwoKICAgIEZJWFBfQlFTIHN0YXRlMSwgc3RhdGUyLCBzdGF0ZTFiLCBzdGF0ZTJiOwoKICAgIHN0YXRlMSA9IHN0YXRlc1swXVtzMV07CiAgICBzdGF0ZTIgPSBzdGF0ZXNbMF1bczJdOwoKICAgIC8qIExvb3Agb3ZlciBzZWN0aW9ucyAqLwogICAgZm9yIChpPTA7IGk8ZG93bkZpbHRlci0+bm9Db2VmZnM7IGkrKykKICAgIHsKICAgICAgRklYUF9EQkwgc3RhdGUwOwoKICAgICAgLyogTG9hZCBtZXJnZWQgc3RhdGVzIChmcm9tIG5leHQgc2VjdGlvbikgKi8KICAgICAgc3RhdGUxYiA9IHN0YXRlc1tpKzFdW3MxXTsKICAgICAgc3RhdGUyYiA9IHN0YXRlc1tpKzFdW3MyXTsKCiAgICAgIHN0YXRlMCA9IGlucHV0ICArIGZNdWx0KHN0YXRlMSwgY29lZmZbQjFdKSArIGZNdWx0KHN0YXRlMiwgY29lZmZbQjJdKTsKICAgICAgeSAgICAgID0gc3RhdGUwIC0gZk11bHQoc3RhdGUxYiwgY29lZmZbQTFdKSAtIGZNdWx0KHN0YXRlMmIsIGNvZWZmW0EyXSk7CgogICAgICAvKiBTdG9yZSBuZXcgZmVlZCBmb3J3YXJkIG1lcmdlIHN0YXRlICovCiAgICAgIHN0YXRlc1tpKzFdW3MyXSA9IHk8PDE7CiAgICAgIC8qIFN0b3JlIG5ldyBmZWVkIGJhY2t3YXJkIHN0YXRlICovCiAgICAgIHN0YXRlc1tpXVtzMl0gPSBpbnB1dDw8MTsKCiAgICAgIC8qIEZlZWRiYWNrIG91dHB1dCB0byBuZXh0IHNlY3Rpb24uICovCiAgICAgIGlucHV0ID0geTsKCiAgICAgIC8qIFRyYW5zZmVyIG1lcmdlZCBzdGF0ZXMgKi8KICAgICAgc3RhdGUxID0gc3RhdGUxYjsKICAgICAgc3RhdGUyID0gc3RhdGUyYjsKCiAgICAgIC8qIFN0ZXAgdG8gbmV4dCBjb2VmIHNldCAqLwogICAgICBjb2VmZiArPSBCSVFVQURfQ09FRlNURVA7CiAgICB9CiAgICBkb3duRmlsdGVyLT5wdHIgXj0gMTsKICB9CiAgLyogQXBwbHkgZ2xvYmFsIGdhaW4gKi8KICB5ID0gZk11bHQoeSwgZG93bkZpbHRlci0+Z2Fpbik7CgojZWxzZSAvKiBEaXJlY3QgZm9ybSBJSSAqLwoKICAgIC8qIExvb3Agb3ZlciBzZWN0aW9ucyAqLwogICAgZm9yIChpPTA7IGk8ZG93bkZpbHRlci0+bm9Db2VmZnM7IGkrKykKICAgIHsKICAgICAgRklYUF9CUVMgc3RhdGUxLCBzdGF0ZTI7CiAgICAgIEZJWFBfREJMIHN0YXRlMDsKCiAgICAgIC8qIExvYWQgc3RhdGVzICovCiAgICAgIHN0YXRlMSA9IHN0YXRlc1tpXVtzMV07CiAgICAgIHN0YXRlMiA9IHN0YXRlc1tpXVtzMl07CgogICAgICBzdGF0ZTAgPSBpbnB1dCAgLSBmTXVsdChzdGF0ZTEsIGNvZWZmW0ExXSkgLSBmTXVsdChzdGF0ZTIsIGNvZWZmW0EyXSk7CiAgICAgIHkgPSBzdGF0ZTAgICAgICArIGZNdWx0KHN0YXRlMSwgY29lZmZbQjFdKSArIGZNdWx0KHN0YXRlMiwgY29lZmZbQjJdKTsKICAgICAgLyogQXBwbHkgc2NhdHRlcmVkIGdhaW4gKi8KICAgICAgeSA9IGZNdWx0KHksIGRvd25GaWx0ZXItPmdhaW4pOwoKICAgICAgLyogU3RvcmUgbmV3IHN0YXRlIGluIG5vcm1hbGl6ZWQgZm9ybSAqLwojaWZkZWYgUlNfQklRVUFEX1NUQVRFUzE2CiAgICAgIC8qIERvIG5vdCBzYXR1cmF0ZSBhbnkgc3RhdGUgdmFsdWUgISBUaGUgcmVzdWx0IHdvdWxkIGJlIHVuYWNjZXB0YWJsZS4gUm91bmRpbmcgbWFrZXMgU05SIGFyb3VuZCAxMGRCIGJldHRlci4gKi8KICAgICAgc3RhdGVzW2ldW3MyXSA9IChGSVhQX0JRUykoTE9ORykoKHN0YXRlMCArIChGSVhQX0RCTCkoMTw8KERGUkFDVF9CSVRTLUZSQUNUX0JJVFMtMikpKSA+PiAoREZSQUNUX0JJVFMtRlJBQ1RfQklUUy0xKSk7CiNlbHNlCiAgICAgIHN0YXRlc1tpXVtzMl0gPSBzdGF0ZTA8PDE7CiNlbmRpZgoKICAgICAgLyogRmVlZGJhY2sgb3V0cHV0IHRvIG5leHQgc2VjdGlvbi4gKi8KICAgICAgaW5wdXQ9eTsKCiAgICAgIC8qIFN0ZXAgdG8gbmV4dCBjb2VmIHNldCAqLwogICAgICBjb2VmZiArPSBCSVFVQURfQ09FRlNURVA7CiAgICB9CiAgICBkb3duRmlsdGVyLT5wdHIgXj0gMTsKICB9CgojZW5kaWYKCiAgLyogQXBwbHkgZmluYWwgZ2Fpbi9zY2FsaW5nIHRvIG91dHB1dCAqLwojaWYgKFNBTVBMRV9CSVRTID09IDE2KQogIG91dHB1dCA9IChJTlRfUENNKSBTQVRVUkFURV9SSUdIVF9TSElGVCh5KyhGSVhQX0RCTCkoMTw8KERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLUJJUVVBRF9TQ0FMRS0xKSksIERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLUJJUVVBRF9TQ0FMRSwgU0FNUExFX0JJVFMpOwogIC8vb3V0cHV0ID0gKElOVF9QQ00pIFNBVFVSQVRFX1JJR0hUX1NISUZUKHksIERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLUJJUVVBRF9TQ0FMRSwgU0FNUExFX0JJVFMpOwojZWxzZQogIG91dHB1dCA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoeSwgQklRVUFEX1NDQUxFLCBTQU1QTEVfQklUUyk7CiNlbmRpZgoKCiAgcmV0dXJuIG91dHB1dDsKfQoKCgoKLyohCiAgXGJyaWVmICAgRkRLYWFjRW5jX0Rvd25zYW1wbGUgbnVtSW5TYW1wbGVzIG9mIHR5cGUgSU5UX1BDTQogICAgICAgICAgIFJldHVybnMgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzIGluIG51bU91dFNhbXBsZXMKCiAgXHJldHVybiAgc3VjY2VzcyBvZiBvcGVyYXRpb24KKi8KCklOVCBGREthYWNFbmNfRG93bnNhbXBsZShET1dOU0FNUExFUiAqRG93blNhbXBsZXIsICAvKiE8IHBvaW50ZXIgdG8gZG93bnNhbXBsZXIgaW5zdGFuY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKmluU2FtcGxlcywgICAgICAgIC8qITwgcG9pbnRlciB0byBpbnB1dCBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtSW5TYW1wbGVzLCAgICAgICAgICAvKiE8IG51bWJlciAgb2YgaW5wdXQgc2FtcGxlcyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBpblN0cmlkZSwgICAgICAgICAgICAgIC8qITwgaW5jcmVtZW50IG9mIGlucHV0IHNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKm91dFNhbXBsZXMsICAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpudW1PdXRTYW1wbGVzLCAgICAgICAgLyohPCBwb2ludGVyIHRwIG51bWJlciBvZiBvdXRwdXQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG91dFN0cmlkZSAgICAgICAgICAgICAgLyohPCBpbmNyZW1lbnQgb2Ygb3V0cHV0IHNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICkKewogICAgSU5UIGk7CiAgICAqbnVtT3V0U2FtcGxlcz0wOwoKICAgIGZvcihpPTA7IGk8bnVtSW5TYW1wbGVzOyBpKz1Eb3duU2FtcGxlci0+cmF0aW8pCiAgICB7CiAgICAgICpvdXRTYW1wbGVzID0gQWR2YW5jZUZpbHRlcigmKERvd25TYW1wbGVyLT5kb3duRmlsdGVyKSwgJmluU2FtcGxlc1tpKmluU3RyaWRlXSwgRG93blNhbXBsZXItPnJhdGlvLCBpblN0cmlkZSk7CiAgICAgIG91dFNhbXBsZXMgKz0gb3V0U3RyaWRlOwogICAgfQogICAgKm51bU91dFNhbXBsZXMgPSBudW1JblNhbXBsZXMvRG93blNhbXBsZXItPnJhdGlvOwoKICAgIHJldHVybiAwOwp9Cgo=