Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBBdXRob3Iocyk6ICAgUm9iZXJ0IFdlaWRuZXIgKERTUCBTb2x1dGlvbnMpCiAgIERlc2NyaXB0aW9uOiBIQ1IgRGVjb2RlcjogSENSIGluaXRpYWxpemF0aW9uLCBwcmVwcm9jZXNzIEhDUiBzaWRlaW5mbywKICAgICAgICAgICAgICAgIGRlY29kZSBwcmlvcml0eSBjb2Rld29yZHMgKFBDV3MpCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImFhY2RlY19oY3IuaCIKCgoKI2luY2x1ZGUgImFhY2RlY19oY3JfdHlwZXMuaCIKI2luY2x1ZGUgImFhY2RlY19oY3JfYml0LmgiCiNpbmNsdWRlICJhYWNkZWNfaGNycy5oIgojaW5jbHVkZSAiYWFjX3JhbS5oIgojaW5jbHVkZSAiYWFjX3JvbS5oIgojaW5jbHVkZSAiY2hhbm5lbC5oIgojaW5jbHVkZSAiYmxvY2suaCIKCiNpbmNsdWRlICJhYWNkZWNvZGVyLmgiICAgICAvKiBmb3IgSURfQ1BFLCBJRF9TQ0UgLi4uICovCiNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCgpleHRlcm4gaW50IG1sRmlsZUNoQ3VycjsKCnN0YXRpYyB2b2lkIGVyckRldGVjdG9ySW5IY3JTaWRlaW5mb1NocnQoU0NIQVIgY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgbnVtTGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICplcnJvcldvcmQpOwoKc3RhdGljIHZvaWQgZXJyRGV0ZWN0b3JJbkhjckxlbmd0aHMoU0NIQVIgIGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAgbGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICplcnJvcldvcmQpOwoKc3RhdGljIHZvaWQgSGNyQ2FsY051bUNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAoSF9IQ1JfSU5GTyBwSGNyKTsKc3RhdGljIHZvaWQgSGNyU29ydENvZGVib29rQW5kTnVtQ29kZXdvcmRJblNlY3Rpb24oSF9IQ1JfSU5GTyBwSGNyKTsKc3RhdGljIHZvaWQgSGNyUHJlcGFyZVNlZ21lbnRhdGlvbkdyaWQgICAgICAgICAgICAoSF9IQ1JfSU5GTyBwSGNyKTsKc3RhdGljIHZvaWQgSGNyRXh0ZW5kZWRTZWN0aW9uSW5mbyAgICAgICAgICAgICAgICAoSF9IQ1JfSU5GTyBwSGNyKTsKCnN0YXRpYyB2b2lkIERlcml2ZU51bWJlck9mRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0cyhVSU5UICAgbnVtU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgKnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgKnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCk7CgpzdGF0aWMgSU5UICBEZWNvZGVFc2NhcGVTZXF1ZW5jZShIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNDb2VmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAqcExlZnRTdGFydE9mU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqcE51bURlY29kZWRCaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCnN0YXRpYyBpbnQgRGVjb2RlUENXX1NpZ24oSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICBjb2RlYm9va0RpbSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiAgICAgICAgICAqcFF1YW50VmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICpwUXVhbnRTcGVjQ29lZiwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqcXVhbnRTcGVjQ29lZklkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAqcExlZnRTdGFydE9mU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKnBOdW1EZWNvZGVkQml0cwogICAgICAgICAgICAgICAgICAgICAgICAgKTsKCnN0YXRpYyBjb25zdCBTQ0hBUiAqRGVjb2RlUENXX0JvZHkoSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICpwQ3VycmVudFRyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgICAgICAgICAgKnBRdWFudFZhbEJhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICpwTnVtRGVjb2RlZEJpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgpzdGF0aWMgdm9pZCBEZWNvZGVQQ1dzKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBIX0hDUl9JTkZPIHBIY3IpOwoKc3RhdGljIHZvaWQgSGNyUmVvcmRlclF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzKAogICAgICAgIEhfSENSX0lORk8gcEhjciwKICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAogICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvCiAgICAgICAgKTsKCgojaWYgQ0hFQ0tfU0VHTUVOVEFUSU9OX0lNTUVESUFURUxZCnN0YXRpYyBVQ0hBUiBlcnJEZXRlY3RQY3dTZWdtZW50YXRpb24oU0NIQVIgICAgICAgcmVtYWluaW5nQml0c0luU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIX0hDUl9JTkZPICBwSGNyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDV19UWVBFICAgIGtpbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAqcXNjX2Jhc2Vfb2ZfY3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgZGltZW5zaW9uKTsKI2VuZGlmCgojaWYgQ0hFQ0tfU0VHTUVOVEFUSU9OX0ZJTkFMCnN0YXRpYyB2b2lkIGVyckRldGVjdFdpdGhpblNlZ21lbnRhdGlvbkZpbmFsKEhfSENSX0lORk8gcEhjcik7CiNlbmRpZgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBkZXNjcmlwdGlvbjogICBDaGVjayBpZiBjb2RlYm9vayBhbmQgbnVtU2VjdCBhcmUgd2l0aGluIGFsbG93ZWQgcmFuZ2UgKHNob3J0IG9ubHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnN0YXRpYyB2b2lkIGVyckRldGVjdG9ySW5IY3JTaWRlaW5mb1NocnQoU0NIQVIgY2IsIFNIT1JUIG51bUxpbmUsVUlOVCogZXJyb3JXb3JkKQp7CgoKCiAgaWYgKCBjYiA8IFpFUk9fSENCIHx8IGNiID49IE1BWF9DQl9DSEVDSyB8fCBjYiA9PSBCT09LU0NMICkgewogICAgKmVycm9yV29yZCB8PSBDQl9PVVRfT0ZfUkFOR0VfU0hPUlRfQkxPQ0s7CiAgfQogIGlmICggbnVtTGluZSA8IDAgfHwgbnVtTGluZSA+IDEwMjQgKSB7CiAgICAqZXJyb3JXb3JkIHw9IExJTkVfSU5fU0VDVF9PVVRfT0ZfUkFOR0VfU0hPUlRfQkxPQ0s7CiAgfQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIGRlc2NyaXB0aW9uOiAgIENoZWNrIGJvdGggSENSIGxlbmd0aHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8Kc3RhdGljIHZvaWQgZXJyRGV0ZWN0b3JJbkhjckxlbmd0aHMoU0NIQVIgIGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAgbGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICplcnJvcldvcmQpCnsKICBpZiAoIGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhIDwgbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQgKSB7CiAgICAqZXJyb3JXb3JkIHw9IEhDUl9TSV9MRU5HVEhTX0ZBSUxVUkU7CiAgfQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIGRlc2NyaXB0aW9uOiAgIERlY29kZSAoYW5kIGFkYXB0IGlmIG5lY2Vzc2FyeSkgdGhlIHR3byBIQ1Igc2lkZWluZm8gY29tcG9uZW50czoKICAgICAgICAgICAgICAgICAgICAncmVvcmRlcmVkX3NwZWN0cmFsX2RhdGFfbGVuZ3RoJyBhbmQgJ2xvbmdlc3RfY29kZXdvcmRfbGVuZ3RoJwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKdm9pZCBDSGNyX1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMsCiAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pCnsKICBJTlQgICAgZ2xvYmFsSGNyVHlwZSA9IGdldEhjclR5cGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5lckhjckluZm8pOwogIFNIT1JUICBsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGE7CiAgU0NIQVIgIGxlbmdPZkxvbmdlc3RDb2Rld29yZDsKCiAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0gMDsKICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZMb25nZXN0Q29kZXdvcmQgICAgICAgPSAwOwoKCgogICAgLyogLS0tLS0tLSBTSS1WYWx1ZSBObyAxIC0tLS0tLS0gKi8KICAgIGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA9IEZES3JlYWRCaXRzKGJzLDE0KSArIEVSUk9SX0xPUlNEOwogICAgaWYgKCBnbG9iYWxIY3JUeXBlID09IElEX0NQRSApIHsKICAgICAgaWYgKChsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPj0gMCkgJiYgKGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA8PSBDUEVfVE9QX0xFTkdUSCkpIHsKICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPSBsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGE7IC8qIHRoZSBkZWNvZGVkIHZhbHVlIGlzIHdpdGhpbiByYW5nZSAqLwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGlmIChsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPiBDUEVfVE9QX0xFTkdUSCkgewogICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0gQ1BFX1RPUF9MRU5HVEg7ICAgICAgICAgICAgLyogdXNlIHZhbGlkIG1heGltdW0gKi8KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGdsb2JhbEhjclR5cGUgPT0gSURfU0NFIHx8IGdsb2JhbEhjclR5cGUgPT0gSURfTEZFIHx8IGdsb2JhbEhjclR5cGUgPT0gSURfQ0NFICkgewogICAgICBpZiAoKGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA+PSAwKSAmJiAobGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhIDw9IFNDRV9UT1BfTEVOR1RIKSkgewogICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5sZW5PZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA9IGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YTsgLyogdGhlIGRlY29kZWQgdmFsdWUgaXMgd2l0aGluIHJhbmdlICovCiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgaWYgKGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA+IFNDRV9UT1BfTEVOR1RIKSB7CiAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPSBTQ0VfVE9QX0xFTkdUSDsgICAgICAgICAgICAvKiB1c2UgdmFsaWQgbWF4aW11bSAqLwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qIC0tLS0tLS0gU0ktVmFsdWUgTm8gMiAtLS0tLS0tICovCiAgICBsZW5nT2ZMb25nZXN0Q29kZXdvcmQgPSBGREtyZWFkQml0cyhicyw2KSArIEVSUk9SX0xPTEM7CiAgICBpZiAoKGxlbmdPZkxvbmdlc3RDb2Rld29yZCA+PSAwKSAmJiAobGVuZ09mTG9uZ2VzdENvZGV3b3JkIDw9IExFTl9PRl9MT05HRVNUX0NXX1RPUF9MRU5HVEgpKSB7CiAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5sZW5PZkxvbmdlc3RDb2Rld29yZCA9IGxlbmdPZkxvbmdlc3RDb2Rld29yZDsgICAgICAgICAgICAgICAgLyogdGhlIGRlY29kZWQgdmFsdWUgaXMgd2l0aGluIHJhbmdlICovCiAgICB9CiAgICBlbHNlIHsKICAgICAgaWYgKGxlbmdPZkxvbmdlc3RDb2Rld29yZCA+IExFTl9PRl9MT05HRVNUX0NXX1RPUF9MRU5HVEgpIHsKICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZMb25nZXN0Q29kZXdvcmQgPSBMRU5fT0ZfTE9OR0VTVF9DV19UT1BfTEVOR1RIOyAgICAgICAvKiB1c2UgdmFsaWQgbWF4aW11bSAqLwogICAgICB9CiAgICB9Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIGRlc2NyaXB0aW9uOiAgIFNldHMgdXAgSENSIFJPTS1UYWJsZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnZvaWQgSGNySW5pdFJvbShIX0hDUl9JTkZPIHBIY3IpCnsKICBwSGNyLT5jYlBhaXJzLnBNaW5PZkNiUGFpciAgICAgPSBhTWluT2ZDYlBhaXI7CiAgcEhjci0+Y2JQYWlycy5wTWF4T2ZDYlBhaXIgICAgID0gYU1heE9mQ2JQYWlyOwoKICBwSGNyLT50YWJsZUluZm8ucE1heEN3TGVuZ3RoICAgPSBhTWF4Q3dMZW47CiAgcEhjci0+dGFibGVJbmZvLnBDYkRpbWVuc2lvbiAgID0gYURpbUNiOwogIHBIY3ItPnRhYmxlSW5mby5wQ2JEaW1TaGlmdCAgICA9IGFEaW1DYlNoaWZ0OwogIHBIY3ItPnRhYmxlSW5mby5wQ2JTaWduICAgICAgICA9IGFTaWduQ2I7CiAgcEhjci0+dGFibGVJbmZvLnBDYlByaW9yaXR5ICAgID0gYUNiUHJpb3JpdHk7CiAgcEhjci0+dGFibGVJbmZvLnBMYXJnZXN0QWJzVmFsID0gYUxhcmdlc3RBYnNvbHV0ZVZhbHVlOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIGRlc2NyaXB0aW9uOiAgIFNldCB1cCBIQ1IgLSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZXZlcnkgY2FsbCB0byBIY3JEZWNvZGVyKCkuCiAgICAgICAgICAgICAgICAgICAgRm9yIHNob3J0IGJsb2NrIGEgc29ydGluZyBhbGdvcml0aG0gaXMgYXBwbGllZCB0byBnZXQgdGhlIFNJIGluIHRoZSBvcmRlcgogICAgICAgICAgICAgICAgICAgIHRoYXQgSENSIGNvdWxkIGFzc2VtYmxlIHRoZSBxc2MncyBhcyBpZiBpdCBpcyBhIGxvbmcgYmxvY2suCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgcmV0dXJuOiAgICAgZXJyb3IgbG9nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpVSU5UIEhjckluaXQoSF9IQ1JfSU5GTyAgICAgICAgICAgICAgcEhjciwKICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCiAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgIGJzKQp7CiAgQ0ljc0luZm8gKnBJY3NJbmZvID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm87CiAgU0hPUlQgKnBOdW1MaW5lc0luU2VjOwogIFVDSEFSICpwQ29kZUJrOwogIFNIT1JUICBudW1TZWN0aW9uOwogIFNDSEFSICBjYjsKICBpbnQgIG51bUxpbmU7CiAgaW50ICBpOwoKICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhOwogIHBIY3ItPmRlY0luT3V0Lmxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkICAgICAgICAgICAgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZMb25nZXN0Q29kZXdvcmQ7CiAgcEhjci0+ZGVjSW5PdXQucFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50OwogIHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ICAgPSAwOwogIHBIY3ItPmRlY0luT3V0LnBDb2RlYm9vayAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMuYUNvZGVCb29rczRIY3I7CiAgcEhjci0+ZGVjSW5PdXQucE51bUxpbmVJblNlY3QgICAgICAgICAgICAgICAgICAgICA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5hTnVtTGluZUluU2VjNEhjcjsKICBwSGNyLT5kZWNJbk91dC5udW1TZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLm51bWJlclNlY3Rpb247CiAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgPSAwOwogIHBIY3ItPm5vblBjd1NpZGVpbmZvLnBSZXN1bHRCYXNlICAgICAgICAgICAgICAgICAgPSBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpOwoKICBGREtzeW5jQ2FjaGUoYnMpOwogIHBIY3ItPmRlY0luT3V0LmJpdHN0cmVhbUluZGV4ICAgICAgICAgICAgICAgICAgICAgPSBGREtnZXRCaXRDbnQoYnMpOwoKICBpZiAoIUlzTG9uZ0Jsb2NrKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSkgICAvKiBzaG9ydCBibG9jayAqLwogIHsKICAgIFNIT1JUICBiYW5kOwogICAgU0hPUlQgIG1heEJhbmQ7CiAgICBTQ0hBUiAgZ3JvdXA7CiAgICBTQ0hBUiAgd2luR3JvdXBMZW47CiAgICBTQ0hBUiAgd2luZG93OwogICAgU0NIQVIgIG51bVVuaXRJbkJhbmQ7CiAgICBTQ0hBUiAgY250VW5pdEluQmFuZDsKICAgIFNDSEFSICBncm91cFdpbjsKICAgIFNDSEFSICBjYl9wcmV2OwoKICAgIFVDSEFSICpwQ29kZUJvb2s7CiAgICBjb25zdCBTSE9SVCAqQmFuZE9mZnNldHM7CiAgICBTQ0hBUiAgbnVtT2ZHcm91cHM7CgoKICAgIHBDb2RlQm9vayAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9vazsgICAgICAgICAgICAgLyogaW4gKi8KICAgIHBOdW1MaW5lc0luU2VjID0gcEhjci0+ZGVjSW5PdXQucE51bUxpbmVJblNlY3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLwogICAgcENvZGVCayAgICAgICAgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovCiAgICBCYW5kT2Zmc2V0cyAgICA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMocEljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsgLyogYXV4ICovCiAgICBudW1PZkdyb3VwcyAgICA9IEdldFdpbmRvd0dyb3VwcyhwSWNzSW5mbyk7CgogICAgbnVtTGluZSA9IDA7CiAgICBudW1TZWN0aW9uID0gMDsKICAgIGNiICAgICAgPSBwQ29kZUJvb2tbMF07CiAgICBjYl9wcmV2ID0gcENvZGVCb29rWzBdOwoKICAgIC8qIGNvbnZlcnQgSENSLXNpZGVpbmZvIGludG8gYSB1bml0d2lzZSBtYW5uZXI6IFdoZW4gdGhlIGNiIGNoYW5nZXMsIGEgbmV3IHNlY3Rpb24gc3RhcnRzICovCgogICAgKnBDb2RlQmsrKyA9IGNiX3ByZXY7CgogICAgbWF4QmFuZCA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CiAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbWF4QmFuZDsgYmFuZCsrKSB7ICAvKiBmcm9tIGxvdyB0byBoaWdoIHNmYnMgaS5lLiBmcm9tIGxvdyB0byBoaWdoIGZyZXF1ZW5jaWVzICAqLwogICAgICBudW1Vbml0SW5CYW5kID0gKChCYW5kT2Zmc2V0c1tiYW5kKzFdIC0gQmFuZE9mZnNldHNbYmFuZF0pID4+IEZPVVJfTE9HX0RJVl9UV09fTE9HKTsgLyogZ2V0IHRoZSBudW1iZXIgb2YgdW5pdHMgaW4gY3VycmVudCBzZmIgKi8KICAgICAgZm9yIChjbnRVbml0SW5CYW5kID0gbnVtVW5pdEluQmFuZDsgIGNudFVuaXRJbkJhbmQgIT0gMDsgY250VW5pdEluQmFuZC0tICkgeyAvKiBmb3IgZXZlcnkgdW5pdCBpbiB0aGUgYmFuZCAqLwogICAgICAgIGZvciAod2luZG93ID0gMCwgZ3JvdXAgPSAwOyBncm91cCA8IG51bU9mR3JvdXBzOyBncm91cCsrKSB7CiAgICAgICAgICB3aW5Hcm91cExlbiA9IEdldFdpbmRvd0dyb3VwTGVuZ3RoKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLGdyb3VwKTsKICAgICAgICAgIGZvciAoZ3JvdXBXaW4gPSB3aW5Hcm91cExlbjsgZ3JvdXBXaW4gIT0gMDsgZ3JvdXBXaW4tLSwgd2luZG93KyspIHsKICAgICAgICAgICAgY2IgPSBwQ29kZUJvb2tbZ3JvdXAgKiAxNiArIGJhbmRdOwogICAgICAgICAgICBpZiAoY2IgIT0gY2JfcHJldikgewojaWYgQ0hFQ0tfVkFMSURfSENSX0lOUFVUIC8qIHNob3J0LWJsb2NrICAxIG9mIDIgKi8KICAgICAgICAgICAgICBlcnJEZXRlY3RvckluSGNyU2lkZWluZm9TaHJ0KGNiLG51bUxpbmUsJnBIY3ItPmRlY0luT3V0LmVycm9yTG9nICk7CiAgICAgICAgICAgICAgaWYgKHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICE9IDAgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKCBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOwogICAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgICAgICAgKnBDb2RlQmsrKyA9IGNiOwogICAgICAgICAgICAgICpwTnVtTGluZXNJblNlYysrID0gbnVtTGluZTsKICAgICAgICAgICAgICBudW1TZWN0aW9uKys7CgogICAgICAgICAgICAgIGNiX3ByZXYgPSBjYjsKICAgICAgICAgICAgICBudW1MaW5lID0gTElORVNfUEVSX1VOSVQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgbnVtTGluZSArPSBMSU5FU19QRVJfVU5JVDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIG51bVNlY3Rpb24rKzsKCiNpZiBDSEVDS19WQUxJRF9IQ1JfSU5QVVQgLyogc2hvcnQtYmxvY2sgIDIgb2YgMiAqLwogICAgZXJyRGV0ZWN0b3JJbkhjclNpZGVpbmZvU2hydChjYixudW1MaW5lLCZwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOwogICAgaWYgKCBudW1TZWN0aW9uIDw9IDAgfHwgbnVtU2VjdGlvbiA+IDEwMjQvMiApIHsKICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gTlVNX1NFQ1RfT1VUX09GX1JBTkdFX1NIT1JUX0JMT0NLOwogICAgfQogICAgZXJyRGV0ZWN0b3JJbkhjckxlbmd0aHMocEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBIY3ItPmRlY0luT3V0LmVycm9yTG9nKTsKICAgIGlmIChwSGNyLT5kZWNJbk91dC5lcnJvckxvZyAhPSAwICkgewogICAgICByZXR1cm4gKCBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOwogICAgfQojZW5kaWYKCiAgICAqcENvZGVCayA9IGNiOwogICAgKnBOdW1MaW5lc0luU2VjID0gbnVtTGluZTsKICAgIHBIY3ItPmRlY0luT3V0Lm51bVNlY3Rpb24gPSBudW1TZWN0aW9uOwoKICB9IGVsc2UgLyogZW5kIHNob3J0IGJsb2NrIHByZXBhcmUgU0kgKi8KICB7ICAgICAgLyogbG9uZyBibG9jayAqLwojaWYgQ0hFQ0tfVkFMSURfSENSX0lOUFVUIC8qIGxvbmctYmxvY2sgIDEgb2YgMSAqLwogICAgZXJyRGV0ZWN0b3JJbkhjckxlbmd0aHMocEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBIY3ItPmRlY0luT3V0LmVycm9yTG9nKTsKICAgIG51bVNlY3Rpb24gICAgID0gcEhjci0+ZGVjSW5PdXQubnVtU2VjdGlvbjsKICAgIHBOdW1MaW5lc0luU2VjID0gcEhjci0+ZGVjSW5PdXQucE51bUxpbmVJblNlY3Q7CiAgICBwQ29kZUJrICAgICAgICA9IHBIY3ItPmRlY0luT3V0LnBDb2RlYm9vazsKICAgIGlmICggbnVtU2VjdGlvbiA8PSAwIHx8IG51bVNlY3Rpb24gPiA2NCApIHsKICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gTlVNX1NFQ1RfT1VUX09GX1JBTkdFX0xPTkdfQkxPQ0s7CiAgICAgIG51bVNlY3Rpb24gPSAwOwogICAgfQoKICAgIGZvciAoIGkgPSBudW1TZWN0aW9uOyBpICE9IDA7IGktLSApCiAgICB7CiAgICAgIGNiID0gKnBDb2RlQmsrKzsKCiAgICAgIGlmICggY2IgPCBaRVJPX0hDQiB8fCBjYiA+PSBNQVhfQ0JfQ0hFQ0sgfHwgY2IgPT0gQk9PS1NDTCApIHsKICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBDQl9PVVRfT0ZfUkFOR0VfTE9OR19CTE9DSzsKICAgICAgfQoKICAgICAgbnVtTGluZSA9ICpwTnVtTGluZXNJblNlYysrOwogICAgICAvKiBGREtfQVNTRVJUKG51bUxpbmUgPiAwKTsgKi8KCiAgICAgIGlmICggKG51bUxpbmUgPD0gMCkgfHwgKG51bUxpbmUgPiAxMDI0KSApIHsKICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBMSU5FX0lOX1NFQ1RfT1VUX09GX1JBTkdFX0xPTkdfQkxPQ0s7CiAgICAgIH0KICAgIH0KICAgIGlmIChwSGNyLT5kZWNJbk91dC5lcnJvckxvZyAhPSAwICkgewogICAgICByZXR1cm4gKCBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOwogICAgfQojZW5kaWYgIC8qIENIRUNLX1ZBTElEX0hDUl9JTlBVVCAqLwogIH0KCiAgcENvZGVCayA9IHBIY3ItPmRlY0luT3V0LnBDb2RlYm9vazsKICBmb3IgKCBpID0gMDsgaSA8IG51bVNlY3Rpb247IGkrKyApIHsKICAgIGlmICgKICAgICAgICAgKCpwQ29kZUJrID09IE5PSVNFX0hDQikgICAgICB8fAogICAgICAgICAoKnBDb2RlQmsgPT0gSU5URU5TSVRZX0hDQjIpIHx8CiAgICAgICAgICgqcENvZGVCayA9PSBJTlRFTlNJVFlfSENCKSkKICAgIHsKICAgICAgKnBDb2RlQmsgPSAwOwogICAgfQogICAgcENvZGVCaysrOwogIH0KCiAgLyogSENSLXNpZGVpbmZvLWlucHV0IGlzIGNvbXBsZXRlIGFuZCBzZWVtcyB0byBiZSB2YWxpZCAqLwoKCgogIHJldHVybiAoIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICk7Cn0KCgoKCiNpZiBVU0VfSENSX0RVTU1ZCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICBkZXNjcmlwdGlvbjogICBUaGlzIEhDUiAtIGR1bW15ICAtIGZ1bmN0aW9uIHdyaXRlcyBvbmx5IGEgZGlyYWMtc2VxdWVuY2UgaW4gb3V0cHV0IGJ1ZmZlcgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KVUlOVCBIY3JEZWNvZGVyKEhfSENSX0lORk8gICAgICAgICAgICAgIHBIY3IsCiAgICAgICAgICAgICAgICBjb25zdCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAogICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMpCnsKICBmb3IgKFNIT1JUIGk9MDsgaSA8IDEwMjQ7IGkrKyApIHsKICAgIHBIY3ItPmRlY0luT3V0LnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cy0+TG9uZ1tpXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgaWYgKCBpICUgMzAgPT0gMCkgewogICAgICBwSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMtPkxvbmdbaV0gPSAoRklYUF9EQkwpSENSX0RJUkFDOwogICAgfQogIH0KICByZXR1cm4gMDsKfQoKI2Vsc2UgLyogVVNFX0hDUl9EVU1NWSAqLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgdGhlIGNvZGV3b3JkcyBvZiB0aGUgc3BlY3RyYWwgY29lZmZpY2llbnRzIGZyb20gdGhlCiAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtIGFjY29yZGluZyB0byB0aGUgSENSIGFsZ29yaXRobSBhbmQgc3RvcmVzIHRoZSBxdWFudGl6ZWQgc3BlY3RyYWwKICAgICAgICAgICAgICAgICAgICBjb2VmZmljaWVudHMgaW4gY29ycmVjdCBvcmRlciBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KClVJTlQgSGNyRGVjb2RlcihIX0hDUl9JTkZPICAgICAgICAgICAgICBwSGNyLAogICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gICAgICAgKnBTYW1wbGluZ1JhdGVJbmZvLAogICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMpCnsKICBpbnQgcFRtcDEsIHBUbXAyLCBwVG1wMywgcFRtcDQ7CiNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKICBpbnQgICAgICAgIHBUbXA1OwojZW5kaWYKCiAgSU5UICAgICAgICBiaXRDbnRPZmZzdDsKICBVSU5UICAgICAgIHNhdmVCaXRDbnQgPSBGREtnZXRCaXRDbnQoYnMpOyAgIC8qIHNhdmUgYml0c3RyZWFtIHBvc2l0aW9uICovCgogIEhjckNhbGNOdW1Db2Rld29yZChwSGNyKTsKCiAgSGNyU29ydENvZGVib29rQW5kTnVtQ29kZXdvcmRJblNlY3Rpb24ocEhjcik7CgogIEhjclByZXBhcmVTZWdtZW50YXRpb25HcmlkKHBIY3IpOwoKICBIY3JFeHRlbmRlZFNlY3Rpb25JbmZvKHBIY3IpOwoKICBpZiAoKCBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyAmIEhDUl9GQVRBTF9QQ1dfRVJST1JfTUFTSyApICE9IDAgKSB7CiAgICByZXR1cm4gKCBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOyAgLyogc2lkZWluZm8gaXMgbWFzc2l2ZWx5IGNvcnJ1cHQsIHJldHVybiBmcm9tIEhDUiB3aXRob3V0IGhhdmluZyBkZWNvZGVkIGFueXRoaW5nICovCiAgfQoKICBEZXJpdmVOdW1iZXJPZkV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMocEhjci0+c2VnbWVudEluZm8ubnVtU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhjci0+c2VjdGlvbkluZm8ucE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4KTsKCiAgLyogc3RvcmUgKi8KICBwVG1wMSA9IHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHg7CiAgcFRtcDIgPSBwSGNyLT5zZWN0aW9uSW5mby5leHRlbmRlZFNvcnRlZENvZGVib29rSWR4OwogIHBUbXAzID0gcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKICBwVG1wNCA9IHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4OwojaWYgREVURUNUX1RPT19MT05HX0NXX1JFQURTCiAgcFRtcDUgPSBwSGNyLT5zZWN0aW9uSW5mby5tYXhMZW5PZkNiSW5FeHRTcnRTZWNJZHg7CiNlbmRpZgoKICAvKiAtLS0tLS0tIGRlY29kZSBtZWFuaW5nZnVsIFBDV3MgLS0tLS0tICovCiAgRGVjb2RlUENXcyhicywgcEhjcik7CgogIGlmICgoIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICYgSENSX0ZBVEFMX1BDV19FUlJPUl9NQVNLICkgPT0gMCApIHsKICAgIC8qIC0tLS0tLSBkZWNvZGUgdGhlIG5vbi1QQ1dzIC0tLS0tLS0tICovCiAgICBEZWNvZGVOb25QQ1dzKGJzLCBwSGNyKTsKICB9CgoKI2lmIENIRUNLX1NFR01FTlRBVElPTl9GSU5BTAogIGVyckRldGVjdFdpdGhpblNlZ21lbnRhdGlvbkZpbmFsKHBIY3IpOwojZW5kaWYKCiAgLyogcmVzdG9yZSAqLwogIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPSBwVG1wMTsKICBwSGNyLT5zZWN0aW9uSW5mby5leHRlbmRlZFNvcnRlZENvZGVib29rSWR4ICAgICAgICAgICAgID0gcFRtcDI7CiAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCAgICA9IHBUbXAzOwogIHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ICAgICAgICAgPSBwVG1wNDsKI2lmIERFVEVDVF9UT09fTE9OR19DV19SRUFEUwogIHBIY3ItPnNlY3Rpb25JbmZvLm1heExlbk9mQ2JJbkV4dFNydFNlY0lkeCAgICAgICAgICAgICAgPSBwVG1wNTsKI2VuZGlmCgogIEhjclJlb3JkZXJRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cyhwSGNyLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyk7CgogIC8qIHJlc3RvcmUgYml0c3RyZWFtIHBvc2l0aW9uICovCiAgYml0Q250T2Zmc3QgPSBzYXZlQml0Q250IC0gRkRLZ2V0Qml0Q250KGJzKTsKICBpZiggYml0Q250T2Zmc3QgKSB7CiAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgYml0Q250T2Zmc3QpOwogIH0KCiAgcmV0dXJuICggcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgKTsKfQoKCiNlbmRpZiAgLyogVVNFX0hDUl9EVU1NWSAqLwoKCgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIHJlb3JkZXJzIHRoZSBxdWFudGl6ZWQgc3BlY3RyYWwgY29lZmZpY2llbnRzIHNlY3Rpb253aXNlIGZvcgogICAgICAgICAgICAgICAgICAgIGxvbmctIGFuZCBzaG9ydC1ibG9ja3MgYW5kIGNvbXBhcmVzIHRvIHRoZSBMQVYgKExhcmdlc3QgQWJzb2x1dGUgVmFsdWUgb2YKICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBjb2RlYm9vaykgLS0gYSBjb3VudGVyIGlzIGluY3JlbWVudGVkIGlmIHRoZXJlIGlzIGFuIGVycm9yCiAgICAgICAgICAgICAgICAgICAgZGV0ZWN0ZWQuCiAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBmb3Igc2hvcnQtYmxvY2tzIGEgdW5pdC1iYXNlZC1kZWludGVybGVhdmluZyBpcyBhcHBsaWVkLgogICAgICAgICAgICAgICAgICAgIE1vcmVvdmVyIChmb3Igc2hvcnQgYmxvY2tzKSB0aGUgc2NhbGluZyBpcyBkZXJpdmVkIChjb21wYXJlIHBsYWluIGh1ZmZtYW4KICAgICAgICAgICAgICAgICAgICBkZWNvZGVyKS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyB2b2lkIEhjclJlb3JkZXJRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cygKICAgICAgICBIX0hDUl9JTkZPIHBIY3IsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCiAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8KICAgICAgICApCnsKICBJTlQgICAgICAgcXNjOwogIFVJTlQgICAgICBhYnNfcXNjOwogIFVJTlQgICAgICBpLGo7CiAgVVNIT1JUICAgIG51bVNwZWN0cmFsVmFsdWVzSW5TZWN0aW9uOwogIEZJWFBfREJMICpwVGVWYTsKICBVU0hPUlQgICAgbGF2RXJyb3JDbnQgPSAwOwoKICBVSU5UICAgICAgbnVtU2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPmRlY0luT3V0Lm51bVNlY3Rpb247CiAgU1BFQ1RSQUxfUFRSICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlID0gcEhjci0+ZGVjSW5PdXQucFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZTsKICBGSVhQX0RCTCAqcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzICAgICA9IFNQRUNfTE9ORyhwSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlKTsKICBjb25zdCBVQ0hBUiAgICAqcENiRGltU2hpZnQgICAgICAgICAgICAgICAgICA9IHBIY3ItPnRhYmxlSW5mby5wQ2JEaW1TaGlmdDsKICBjb25zdCBVU0hPUlQgICAqcExhcmdlc3RBYnNWYWwgICAgICAgICAgICAgICA9IHBIY3ItPnRhYmxlSW5mby5wTGFyZ2VzdEFic1ZhbDsKICBVQ0hBUiAgICAqcFNvcnRlZENvZGVib29rICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBTb3J0ZWRDb2RlYm9vazsKICBVU0hPUlQgICAqcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKICBVU0hPUlQgICAqcFJlb3JkZXJPZmZzZXQgICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBSZW9yZGVyT2Zmc2V0OwogIEZJWFBfREJMICpwVGVtcFZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFRlbXBWYWx1ZXM7CiAgRklYUF9EQkwgKnBCYWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wVGVtcFZhbHVlczsKCiAgRkRLbWVtY2xlYXIocFRlbXBWYWx1ZXMsMTAyNCpzaXplb2YoRklYUF9EQkwpKTsKCiAgLyogbG9uZyBhbmQgc2hvcnQ6IGNoZWNrIGlmIGRlY29kZWQgaHVmZm1hbi12YWx1ZXMgKHF1YW50aXplZCBzcGVjdHJhbCBjb2VmZmljaWVudHMpIGFyZSB3aXRoaW4gcmFuZ2UgKi8KICBmb3IgKCBpPW51bVNlY3Rpb247IGkgIT0gMDsgaS0tICkgewogICAgbnVtU3BlY3RyYWxWYWx1ZXNJblNlY3Rpb24gPSAqcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uKysgPDwgcENiRGltU2hpZnRbKnBTb3J0ZWRDb2RlYm9va107CiAgICBwVGVWYSA9ICZwVGVtcFZhbHVlc1sqcFJlb3JkZXJPZmZzZXQrK107CiAgICBmb3IoIGogPSBudW1TcGVjdHJhbFZhbHVlc0luU2VjdGlvbjsgaiAhPSAwOyBqLS0gKSB7CiAgICAgIHFzYyA9ICpwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMrKzsKICAgICAgYWJzX3FzYyA9IEZES2Ficyhxc2MpOwojaWYgVkFMSURfTEFWX0VSUk9SX1RSSUdHRVIKICAgICAgaWYgKCBhYnNfcXNjIDw9IHBMYXJnZXN0QWJzVmFsWypwU29ydGVkQ29kZWJvb2tdICkgewogICAgICAgICpwVGVWYSsrID0gKEZJWFBfREJMKXFzYzsgIC8qIHRoZSBxc2MgdmFsdWUgaXMgd2l0aGluIHJhbmdlICovCiAgICAgIH0KICAgICAgZWxzZSB7IC8qIGxpbmUgaXMgdG9vIGhpZ2ggLi4gKi8KICAgICAgICBpZiAoIGFic19xc2MgPT0gUV9WQUxVRV9JTlZBTElEICkgeyAvKiAuLiBiZWNhdXNlIG9mIHByZXZpb3VzIG1hcmtpbmcgLS0+IGRvbnQgc2V0IExBViBmbGFnICh3b3VsZCBiZSBjb25mdXNpbmcpLCBqdXN0IGNvcHkgb3V0IHRoZSBhbHJlYWR5IG1hcmtlZCB2YWx1ZSAqLwogICAgICAgICAgKnBUZVZhKysgPSAoRklYUF9EQkwpIHFzYzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLi4gYmVjYXVzZSBhIHRvbyBoaWdoIHZhbHVlIHdhcyBkZWNvZGVkIGZvciB0aGlzIGNiIC0tPiBzZXQgTEFWIGZsYWcgKi8KICAgICAgICAgICpwVGVWYSsrID0gKEZJWFBfREJMKSBRX1ZBTFVFX0lOVkFMSUQ7CiAgICAgICAgICBsYXZFcnJvckNudCArPSAxOwogICAgICAgIH0KICAgICAgfQojZWxzZQogICAgICBpZiAoIGFic19xc2MgPD0gcExhcmdlc3RBYnNWYWxbKnBTb3J0ZWRDb2RlYm9va10gKSB7CiAgICAgICAgKnBUZVZhKysgPSBxc2M7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgKnBUZVZhKysgPSBRX1ZBTFVFX0lOVkFMSUQ7CiAgICAgICAgbGF2RXJyb3JDbnQgKz0gMTsKICAgICAgfQojZW5kaWYKICAgIH0KICAgIHBTb3J0ZWRDb2RlYm9vaysrOwogIH0KCiAgaWYgKCFJc0xvbmdCbG9jaygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpCiAgewogICAgRklYUF9EQkwgKnBPdXQ7CiAgICBGSVhQX0RCTCAgbG9jTWF4OwogICAgRklYUF9EQkwgIHRtcDsKICAgIFNDSEFSICAgICBncm91cG9mZnNldDsKICAgIFNDSEFSICAgICBncm91cDsKICAgIFNDSEFSICAgICBiYW5kOwogICAgU0NIQVIgICAgIGdyb3Vwd2luOwogICAgU0NIQVIgICAgIHdpbmRvdzsKICAgIFNDSEFSICAgICBudW1XaW5Hcm91cDsKICAgIFNIT1JUICAgICBpbnRlcm07CiAgICBTQ0hBUiAgICAgbnVtU2ZiVHJhbnNtOwogICAgU0NIQVIgICAgIHdpbkdyb3VwTGVuOwogICAgU0hPUlQgICAgIGluZGV4OwogICAgSU5UICAgICAgIG1zYjsKICAgIElOVCAgICAgICBsc2I7CgogICAgU0hPUlQgICAqcFNjYWxlRmFjSGNyID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcjsKICAgIFNIT1JUICAgKnBTZmJTY2xIY3IgICA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2ZiU2NhbGU7CiAgICBjb25zdCBTSE9SVCAqQmFuZE9mZnNldHMgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyk7CgogICAgcEJhayA9IHBIY3ItPnNlZ21lbnRJbmZvLnBUZW1wVmFsdWVzOwogICAgLyogZGVpbnRlcmxlYXZlIHVuaXR3aXNlIGZvciBzaG9ydCBibG9ja3MgKi8KICAgIGZvciAoIHdpbmRvdyA9IDA7IHdpbmRvdyA8ICg4KTsgd2luZG93KysgKSB7CiAgICAgIHBPdXQgPSBTUEVDKHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UsIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCk7CiAgICAgIGZvciAoIGk9MDsgaSA8IChMSU5FU19QRVJfVU5JVF9HUk9VUCk7IGkrKyApIHsKICAgICAgICBwVGVWYSA9IHBCYWsgKyAod2luZG93IDw8IEZPVVJfTE9HX0RJVl9UV09fTE9HKSArIGkgKiAzMjsJLyogZGlzdGFuY2Ugb2YgbGluZXMgYmV0d2VlbiB1bml0IGdyb3VwcyBoYXMgdG8gYmUgY29uc3RhbnQgZm9yIGV2ZXJ5IGZyYW1lbGVuZ3RoICgzMikhICAqLwogICAgICAgIGZvciAoIGo9KExJTkVTX1BFUl9VTklUKTsgaiAhPSAwOyBqLS0gKSB7CiAgICAgICAgICAqcE91dCsrID0gKnBUZVZhKys7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyogc2hvcnQgYmxvY2tzIG9ubHkgKi8KICAgIC8qIGRlcml2ZSBnbG9iYWwgc2NhbGluZy12YWx1ZSBmb3IgZXZlcnkgc2ZiIGFuZCBldmVyeSB3aW5kb3cgKGFzIGl0IGlzIGRvbmUgaW4gcGxhaW4taHVmZm1hbi1kZWNvZGVyIGF0IHNob3J0IGJsb2NrcykgKi8KICAgIGdyb3Vwb2Zmc2V0ID0gMDsKCiAgICBudW1XaW5Hcm91cCA9IEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CiAgICBudW1TZmJUcmFuc20gPSBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOwoKICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IG51bVdpbkdyb3VwOyBncm91cCsrKSB7CiAgICAgIHdpbkdyb3VwTGVuID0gR2V0V2luZG93R3JvdXBMZW5ndGgoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sZ3JvdXApOwogICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbnVtU2ZiVHJhbnNtOyBiYW5kKyspIHsKICAgICAgICBpbnRlcm0gPSBncm91cCAqIDE2ICsgYmFuZDsKICAgICAgICBtc2IgPSBwU2NhbGVGYWNIY3JbaW50ZXJtXSA+PiAyOwogICAgICAgIGxzYiA9IHBTY2FsZUZhY0hjcltpbnRlcm1dICYgMzsKICAgICAgICBmb3IgKGdyb3Vwd2luID0gMDsgZ3JvdXB3aW4gPCB3aW5Hcm91cExlbjsgZ3JvdXB3aW4rKykgewogICAgICAgICAgd2luZG93ID0gZ3JvdXBvZmZzZXQgKyBncm91cHdpbjsKICAgICAgICAgIHBCYWsgPSBTUEVDKHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UsIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCk7CiAgICAgICAgICBsb2NNYXggPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgICAgIGZvciAoaW5kZXggPSBCYW5kT2Zmc2V0c1tiYW5kXTsgaW5kZXggPCBCYW5kT2Zmc2V0c1tiYW5kKzFdOyBpbmRleCArPSBMSU5FU19QRVJfVU5JVCkgewogICAgICAgICAgICBwVGVWYSA9ICZwQmFrW2luZGV4XTsKICAgICAgICAgICAgZm9yICggaSA9IExJTkVTX1BFUl9VTklUOyBpICE9IDA7IGkgLS0pIHsKICAgICAgICAgICAgICB0bXAgPSAoKnBUZVZhIDwgRkwyRlhDT05TVF9EQkwoMC4wZikpPyAtKnBUZVZhKysgOiAqcFRlVmErKzsKICAgICAgICAgICAgICBsb2NNYXggPSBmaXhNYXgodG1wLGxvY01heCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICggZml4cF9hYnMobG9jTWF4KSA+IChGSVhQX0RCTClNQVhfUVVBTlRJWkVEX1ZBTFVFICkgewogICAgICAgICAgICBsb2NNYXggPSAoRklYUF9EQkwpTUFYX1FVQU5USVpFRF9WQUxVRTsKICAgICAgICAgIH0KICAgICAgICAgIHBTZmJTY2xIY3Jbd2luZG93KjE2K2JhbmRdID0gbXNiIC0gR2V0U2NhbGVGcm9tVmFsdWUobG9jTWF4LCBsc2IpOyAgLyogc2F2ZSBnbG9iYWwgc2NhbGUgbWF4aW1hIGluIHRoaXMgc2ZiICovCiAgICAgICAgfQogICAgICB9CiAgICAgIGdyb3Vwb2Zmc2V0ICs9IEdldFdpbmRvd0dyb3VwTGVuZ3RoKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLGdyb3VwKTsKICAgIH0KICB9IGVsc2UKICB7CiAgICAvKiBjb3B5IHN0cmFpZ2h0IGZvciBsb25nLWJsb2NrcyAqLwogICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzID0gU1BFQ19MT05HKHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UpOwogICAgZm9yICggaSA9IDEwMjQ7IGkgIT0gMDsgaS0tICkgewogICAgICAqcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzKysgPSAqcEJhaysrOwogICAgfQogIH0KCiAgaWYgKCBsYXZFcnJvckNudCAhPSAwICkgewogICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gTEFWX1ZJT0xBVElPTjsKICB9Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIGNvZGV3b3JkcwogICAgICAgICAgICAgICAgICAgIGZvciBlYWNoIHNlY3Rpb24gKG51bUNvZGV3b3JkSW5TZWN0aW9uKSBhbmQgdGhlIG51bWJlciBvZiBjb2Rld29yZHMKICAgICAgICAgICAgICAgICAgICBmb3IgYWxsIHNlY3Rpb25zIChudW1Db2Rld29yZCkuCiAgICAgICAgICAgICAgICAgICAgRm9yIHplcm8gYW5kIGludGVuc2l0eSBjb2RlYm9va3MgYSBlbnRyeSBpcyBhbHNvIGRvbmUgaW4gdGhlIHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgICAgbnVtQ29kZXdvcmRJblNlY3Rpb24uIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgY29kZWJvb2sgaXMgYSB0d28gdHVwbGVzCiAgICAgICAgICAgICAgICAgICAgY29kZWJvb2suIFRoaXMgaXMgbmVlZGVkIGxhdGVyIGZvciB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGJhc2UgYWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSByZW9yZGVyaW5nIG9mIHRoZSBxdWFudGl6ZSBzcGVjdHJhbCBjb2VmZmljaWVudHMgYXQgdGhlIGVuZCBvZiB0aGUKICAgICAgICAgICAgICAgICAgICBoY3IgdG9vbC4KICAgICAgICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgbnVtQ29kZXdvcmQgY29udGFpbiB0aGUgbnVtYmVyIG9mIGNvZGV3b3JkcyB3aGljaCBhcmUgcmVhbGx5CiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdHN0cmVhbS4gWmVybyBvciBpbnRlbnNpdHkgY29kZWJvb2tzIGRvZXMgbm90IGluY3JlYXNlIHRoZQogICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG51bUNvZGV3b3Jkcy4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICByZXR1cm46ICAgLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHZvaWQgSGNyQ2FsY051bUNvZGV3b3JkKEhfSENSX0lORk8gcEhjcikKewogIGludCAgICAgaGNyU2VjdGlvbjsKICBVSU5UICAgIG51bUNvZGV3b3JkOwoKICBVSU5UICAgIG51bVNlY3Rpb24gICAgICAgICAgICA9ICAgcEhjci0+ZGVjSW5PdXQubnVtU2VjdGlvbjsKICBVQ0hBUiAgKnBDb2RlYm9vayAgICAgICAgICAgICA9ICAgcEhjci0+ZGVjSW5PdXQucENvZGVib29rOwogIFNIT1JUICAqcE51bUxpbmVJblNlY3Rpb24gICAgID0gICBwSGNyLT5kZWNJbk91dC5wTnVtTGluZUluU2VjdDsKICBjb25zdCBVQ0hBUiAgKnBDYkRpbVNoaWZ0ICAgICA9ICAgcEhjci0+dGFibGVJbmZvLnBDYkRpbVNoaWZ0OwogIFVTSE9SVCAqcE51bUNvZGV3b3JkSW5TZWN0aW9uID0gICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtQ29kZXdvcmRJblNlY3Rpb247CgogIG51bUNvZGV3b3JkID0gMDsKICBmb3IgKCBoY3JTZWN0aW9uID0gbnVtU2VjdGlvbjsgaGNyU2VjdGlvbiAhPSAwOyBoY3JTZWN0aW9uLS0gKSB7CiAgICAqcE51bUNvZGV3b3JkSW5TZWN0aW9uID0gKnBOdW1MaW5lSW5TZWN0aW9uKysgPj4gcENiRGltU2hpZnRbKnBDb2RlYm9va107CiAgICBpZiAoICpwQ29kZWJvb2sgIT0gMCApIHsKICAgICAgbnVtQ29kZXdvcmQgKz0gKnBOdW1Db2Rld29yZEluU2VjdGlvbjsKICAgIH0KICAgIHBOdW1Db2Rld29yZEluU2VjdGlvbisrOwogICAgcENvZGVib29rKys7CiAgfQogIHBIY3ItPnNlY3Rpb25JbmZvLm51bUNvZGV3b3JkID0gbnVtQ29kZXdvcmQ7Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgb2Ygc29ydGVkIGNvZGVib29rcyBhbmQgc29ydHMgdGhlIGNvZGVib29rcyBhbmQgdGhlIG51bUNvZGV3b3JkSW5TZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBwcmlvcml0eS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyB2b2lkIEhjclNvcnRDb2RlYm9va0FuZE51bUNvZGV3b3JkSW5TZWN0aW9uKEhfSENSX0lORk8gcEhjcikKewoKICBVSU5UICAgIGksaixrOwogIFVDSEFSICAgdGVtcDsKICBVSU5UICAgIGNvdW50ZXI7CiAgVUlOVCAgICBzdGFydE9mZnNldDsKICBVSU5UICAgIG51bVplcm9TZWN0aW9uOwogIFVDSEFSICAqcERlc3Q7CiAgVUlOVCAgICBudW1TZWN0aW9uRGVjOwoKICBVSU5UICAgIG51bVNlY3Rpb24gICAgICAgICAgICAgICAgICA9ICAgcEhjci0+ZGVjSW5PdXQubnVtU2VjdGlvbjsKICBVQ0hBUiAgKnBDb2RlYm9vayAgICAgICAgICAgICAgICAgICA9ICAgcEhjci0+ZGVjSW5PdXQucENvZGVib29rOwogIFVDSEFSICAqcFNvcnRlZENvZGVib29rICAgICAgICAgICAgID0gICBwSGNyLT5zZWN0aW9uSW5mby5wU29ydGVkQ29kZWJvb2s7CiAgVVNIT1JUICpwTnVtQ29kZXdvcmRJblNlY3Rpb24gICAgICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1Db2Rld29yZEluU2VjdGlvbjsKICBVU0hPUlQgKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbiA9ICAgcEhjci0+c2VjdGlvbkluZm8ucE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOwogIFVDSEFSICAqcENvZGVib29rU3dpdGNoICAgICAgICAgICAgID0gICBwSGNyLT5zZWN0aW9uSW5mby5wQ29kZWJvb2tTd2l0Y2g7CiAgVVNIT1JUICpwUmVvcmRlck9mZnNldCAgICAgICAgICAgICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBSZW9yZGVyT2Zmc2V0OwogIGNvbnN0IFVDSEFSICAgKnBDYlByaW9yaXR5ICAgICAgICAgID0gICBwSGNyLT50YWJsZUluZm8ucENiUHJpb3JpdHk7CiAgY29uc3QgVUNIQVIgICAqcE1pbk9mQ2JQYWlyICAgICAgICAgPSAgIHBIY3ItPmNiUGFpcnMucE1pbk9mQ2JQYWlyOwogIGNvbnN0IFVDSEFSICAgKnBNYXhPZkNiUGFpciAgICAgICAgID0gICBwSGNyLT5jYlBhaXJzLnBNYXhPZkNiUGFpcjsKICBjb25zdCBVQ0hBUiAgICpwQ2JEaW1TaGlmdCAgICAgICAgICA9ICAgcEhjci0+dGFibGVJbmZvLnBDYkRpbVNoaWZ0OwoKICBVSU5UIHNlYXJjaFN0YXJ0ID0gMDsKCiAgLyogY2FsY3VsYXRlICpwTnVtU29ydGVkU2VjdGlvbiBhbmQgc3RvcmUgdGhlIHByaW9yaXRpZXMgaW4gYXJyYXkgcFNvcnRlZENkZWJvb2sgKi8KICBwRGVzdCA9IHBTb3J0ZWRDb2RlYm9vazsKICBudW1aZXJvU2VjdGlvbiA9IDA7CiAgZm9yICggaT1udW1TZWN0aW9uOyBpICE9IDA7IGktLSApIHsKICAgIGlmICggcENiUHJpb3JpdHlbKnBDb2RlYm9va10gPT0gMCApIHsKICAgICAgbnVtWmVyb1NlY3Rpb24gKz0gMTsKICAgIH0KICAgICpwRGVzdCsrID0gcENiUHJpb3JpdHlbKnBDb2RlYm9vaysrXTsKICB9CiAgcEhjci0+c2VjdGlvbkluZm8ubnVtU29ydGVkU2VjdGlvbiA9IG51bVNlY3Rpb24gLSBudW1aZXJvU2VjdGlvbjsgICAgLyogbnVtU29ydGVkU2VjdGlvbiBjb250YWlucyBubyB6ZXJvIG9yIGludGVuc2l0eSBzZWN0aW9uICovCiAgcENvZGVib29rID0gcEhjci0+ZGVjSW5PdXQucENvZGVib29rOwoKICAvKiBzb3J0IHByaW9yaXRpZXMgb2YgdGhlIGNvZGVib29rcyBpbiBhcnJheSBwU29ydGVkQ2RlYm9va1tdICovCiAgbnVtU2VjdGlvbkRlYyA9IG51bVNlY3Rpb24gLSAxOwogIGlmICggbnVtU2VjdGlvbkRlYyA+IDAgKSB7CiAgICBjb3VudGVyID0gbnVtU2VjdGlvbkRlYzsKICAgIGZvciAoIGo9bnVtU2VjdGlvbkRlYzsgaiAhPSAwOyBqLS0gKSB7CiAgICAgIGZvciAoIGk9MDsgaSA8IGNvdW50ZXI7IGkrKyApIHsKICAgICAgICAvKiBzd2FwIHByaW9yaXRpZXMgKi8KICAgICAgICBpZiAoIHBTb3J0ZWRDb2RlYm9va1tpKzFdID4gcFNvcnRlZENvZGVib29rW2ldICkgewogICAgICAgICAgdGVtcCAgICAgICAgICAgICAgICAgPSBwU29ydGVkQ29kZWJvb2tbaV07CiAgICAgICAgICBwU29ydGVkQ29kZWJvb2tbaV0gICA9IHBTb3J0ZWRDb2RlYm9va1tpKzFdOwogICAgICAgICAgcFNvcnRlZENvZGVib29rW2krMV0gPSB0ZW1wOwogICAgICAgIH0KICAgICAgfQogICAgICBjb3VudGVyIC09IDE7CiAgICB9CiAgfQoKICAvKiBjbGVhciBjb2RlYm9va1N3aXRjaCBhcnJheSAqLwogIGZvciAoIGkgPSBudW1TZWN0aW9uOyBpICE9IDA7IGktLSkgewogICAgKnBDb2RlYm9va1N3aXRjaCsrID0gMDsKICB9CiAgcENvZGVib29rU3dpdGNoID0gcEhjci0+c2VjdGlvbkluZm8ucENvZGVib29rU3dpdGNoOwoKICAvKiBzb3J0IHNlY3Rpb25Db2RlYm9va3MgYW5kIG51bUNvZHdvcmRzSW5TZWN0aW9uIGFuZCBjYWxjdWxhdGUgcFJlb3JkZXJPZmZzdFtqXSAqLwogIGZvciAoIGogPSAwOyBqIDwgbnVtU2VjdGlvbjsgaisrICkgewogICAgZm9yICggaSA9IHNlYXJjaFN0YXJ0OyBpIDwgbnVtU2VjdGlvbjsgaSsrICkgewogICAgICBpZiAoIHBDb2RlYm9va1N3aXRjaFtpXSA9PSAwICYmICggcE1pbk9mQ2JQYWlyW3BTb3J0ZWRDb2RlYm9va1tqXV0gPT0gcENvZGVib29rW2ldICB8fCAgcE1heE9mQ2JQYWlyW3BTb3J0ZWRDb2RlYm9va1tqXV0gPT0gcENvZGVib29rW2ldICkpIHsKICAgICAgICBwQ29kZWJvb2tTd2l0Y2hbaV0gPSAxOwogICAgICAgIHBTb3J0ZWRDb2RlYm9va1tqXSA9IHBDb2RlYm9va1tpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb3J0IGNvZGVib29rICovCiAgICAgICAgcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW2pdID0gcE51bUNvZGV3b3JkSW5TZWN0aW9uW2ldOyAgICAgIC8qIHNvcnQgTnVtQ29kZXdvcmRJblNlY3Rpb24gKi8KCiAgICAgICAgc3RhcnRPZmZzZXQgPSAwOwogICAgICAgIGZvciAoIGsgPSAwOyBrIDwgaTsgaysrICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIGVudHJ5IGluIHBSZW9yZGVyT2Zmc3QgKi8KICAgICAgICAgIHN0YXJ0T2Zmc2V0ICs9IHBOdW1Db2Rld29yZEluU2VjdGlvbltrXSA8PCBwQ2JEaW1TaGlmdFtwQ29kZWJvb2tba11dOwogICAgICAgIH0KICAgICAgICBwUmVvcmRlck9mZnNldFtqXSA9IHN0YXJ0T2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IGZvciByZW9yZGVyaW5nIHRoZSBjb2Rld29yZHMgKi8KCiAgICAgICAgaWYoaSA9PSBzZWFyY2hTdGFydCkgewogICAgICAgICAgVUlOVCBrID0gaTsKICAgICAgICAgIHdoaWxlKHBDb2RlYm9va1N3aXRjaFtrKytdID09IDEpIHNlYXJjaFN0YXJ0Kys7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQp9CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHNlZ21lbnRhdGlvbiwgd2hpY2ggaW5jbHVkZXMgbnVtU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICBsZWZ0U3RhcnRPZlNlZ21lbnQsIHJpZ2h0U3RhcnRPZlNlZ21lbnQgYW5kIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQuCiAgICAgICAgICAgICAgICAgICAgVGhlIHNlZ21lbnRhdGlvbiBjb3VsZCBiZSB2aXN1YWxpemVkIGEgYXMga2luZCBvZiAnb3ZlcmxheS1ncmlkJyBmb3IgdGhlCiAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtLWJsb2NrIGhvbGRpbmcgdGhlIEhDUi1lbmNvZGVkIHF1YW50aXplZC1zcGVjdHJhbC1jb2VmZmljaWVudHMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgdm9pZCBIY3JQcmVwYXJlU2VnbWVudGF0aW9uR3JpZChIX0hDUl9JTkZPIHBIY3IpCnsKICBVU0hPUlQgICBpLGo7CiAgVVNIT1JUICAgbnVtU2VnbWVudCA9IDA7CiAgVVNIT1JUICAgc2VnbWVudFN0YXJ0ID0gMDsKICBVQ0hBUiAgICBzZWdtZW50V2lkdGg7CiAgVUNIQVIgICAgbGFzdFNlZ21lbnRXaWR0aDsKICBVQ0hBUiAgICBzb3J0ZWRDb2RlYm9vazsKICBVQ0hBUiAgICBlbmRGbGFnID0gMDsKICBVU0hPUlQgICBpbnRlcm1lZGlhdGVSZXN1bHQ7CgogIFNDSEFSICAgIGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkICAgICAgID0gICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZkxvbmdlc3RDb2Rld29yZDsKICBTSE9SVCAgICBsZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA9ICAgcEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGE7CiAgVUlOVCAgICAgbnVtU29ydGVkU2VjdGlvbiAgICAgICAgICAgICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLm51bVNvcnRlZFNlY3Rpb247CiAgVUNIQVIgICAqcFNvcnRlZENvZGVib29rICAgICAgICAgICAgICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBTb3J0ZWRDb2RlYm9vazsKICBVU0hPUlQgICpwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb24gICA9ICAgcEhjci0+c2VjdGlvbkluZm8ucE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOwogIFVTSE9SVCAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQgICAgICAgICAgID0gICBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OwogIFVTSE9SVCAgKnBSaWdodFN0YXJ0T2ZTZWdtZW50ICAgICAgICAgID0gICBwSGNyLT5zZWdtZW50SW5mby5wUmlnaHRTdGFydE9mU2VnbWVudDsKICBTQ0hBUiAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCAgICAgICA9ICAgcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7CiAgVVNIT1JUICAgYml0c3RyZWFtSW5kZXggICAgICAgICAgICAgICAgPSAgIHBIY3ItPmRlY0luT3V0LmJpdHN0cmVhbUluZGV4OwogIGNvbnN0IFVDSEFSICpwTWF4Q3dMZW5ndGggICAgICAgICAgICAgID0gICBwSGNyLT50YWJsZUluZm8ucE1heEN3TGVuZ3RoOwoKICBmb3IgKCBpPW51bVNvcnRlZFNlY3Rpb247IGkgIT0gMDsgaS0tICkgewogICAgc29ydGVkQ29kZWJvb2sgPSAqcFNvcnRlZENvZGVib29rKys7CiAgICBzZWdtZW50V2lkdGggPSBGREttaW4ocE1heEN3TGVuZ3RoW3NvcnRlZENvZGVib29rXSxsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCk7CgogICAgZm9yICggaiA9ICpwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb247IGogIT0gMCA7IGotLSApIHsKICAgICAgLyogd2lkdGggYWxsb3dzIGEgbmV3IHNlZ21lbnQgKi8KICAgICAgaW50ZXJtZWRpYXRlUmVzdWx0ID0gYml0c3RyZWFtSW5kZXggKyBzZWdtZW50U3RhcnQ7CiAgICAgIGlmICggKHNlZ21lbnRTdGFydCArIHNlZ21lbnRXaWR0aCkgPD0gbGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgKSB7CiAgICAgICAgLyogc3RvcmUgc2VnbWVudCBzdGFydCwgc2VnbWVudCBsZW5ndGggYW5kIGluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzICovCiAgICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQrKyA9IGludGVybWVkaWF0ZVJlc3VsdDsKICAgICAgICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQrKyA9IGludGVybWVkaWF0ZVJlc3VsdCArIHNlZ21lbnRXaWR0aCAtIDE7CiAgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50KysgPSBzZWdtZW50V2lkdGg7CiAgICAgICAgc2VnbWVudFN0YXJ0ICs9IHNlZ21lbnRXaWR0aDsKICAgICAgICBudW1TZWdtZW50ICs9IDE7CiAgICAgIH0KICAgICAgLyogd2lkdGggZG9lcyBub3QgYWxsb3cgYSBuZXcgc2VnbWVudCAqLwogICAgICBlbHNlIHsKICAgICAgICAvKiBjb3JyZWN0IHRoZSBsYXN0IHNlZ21lbnQgbGVuZ3RoICovCiAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudC0tOwogICAgICAgIHBSaWdodFN0YXJ0T2ZTZWdtZW50LS07CiAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQtLTsKICAgICAgICBzZWdtZW50U3RhcnQgPSAqcExlZnRTdGFydE9mU2VnbWVudCAtIGJpdHN0cmVhbUluZGV4OwoKICAgICAgICBsYXN0U2VnbWVudFdpZHRoID0gbGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgLSBzZWdtZW50U3RhcnQ7CiAgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50ID0gbGFzdFNlZ21lbnRXaWR0aDsKICAgICAgICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQgPSBiaXRzdHJlYW1JbmRleCArIHNlZ21lbnRTdGFydCArIGxhc3RTZWdtZW50V2lkdGggLSAxOwogICAgICAgIGVuZEZsYWcgPSAxOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb24rKzsKICAgIGlmIChlbmRGbGFnICE9IDApIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHBIY3ItPnNlZ21lbnRJbmZvLm51bVNlZ21lbnQgPSBudW1TZWdtZW50OwoKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBhZGFwdHMgdGhlIHNvcnRlZCBzZWN0aW9uIGJvdW5kYXJpZXMgdG8gdGhlIGJvdW5kYXJpZXMgb2YKICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb24uIElmIHRoZSBzZWN0aW9uIGxlbmd0aHMgZG9lcyBub3QgZml0IGNvbXBsZXRlbHkgaW50byB0aGUKICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHNlZ21lbnQsIHRoZSBzZWN0aW9uIGlzIHNwaXR0ZWQgaW50byB0d28gc28gY2FsbGVkICdleHRlbmRlZAogICAgICAgICAgICAgICAgICAgIHNlY3Rpb25zJy4gVGhlIGV4dGVuZGVkLXNlY3Rpb24taW5mbyAocE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3RpbgogICAgICAgICAgICAgICAgICAgIGFuZCBwRXh0ZW5kZWRTb3J0ZWRDb2RlYm9vaykgaXMgdXBkYXRlZCBpbiB0aGlzIGNhc2UuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHZvaWQgSGNyRXh0ZW5kZWRTZWN0aW9uSW5mbyhIX0hDUl9JTkZPIHBIY3IpCnsKICBVSU5UICAgIHNydFNlY0NudCA9IDA7ICAgICAgICAgLyogY291bnRlciBmb3Igc29ydGVkIHNlY3Rpb25zICovCiAgVUlOVCAgICB4U3J0U2NDbnQgPSAwOyAgICAgICAgIC8qIGNvdW50ZXIgZm9yIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9ucyAqLwogIFVJTlQgICAgcmVtYWluTnVtQ3dJblNvcnRTZWM7CiAgVUlOVCAgICBpblNlZ21lbnRSZW1haW5OdW1DVzsKCiAgVUlOVCAgICBudW1Tb3J0ZWRTZWN0aW9uICAgICAgICAgICAgPSBwSGNyLT5zZWN0aW9uSW5mby5udW1Tb3J0ZWRTZWN0aW9uOwogIFVDSEFSICAqcFNvcnRlZENvZGVib29rICAgICAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ucFNvcnRlZENvZGVib29rOwogIFVTSE9SVCAqcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uID0gcEhjci0+c2VjdGlvbkluZm8ucE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOwogIFVDSEFSICAqcEV4dGVuZGVkU29ydGVkQ29CbyAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ucEV4dGVuZGVkU29ydGVkQ29kZWJvb2s7CiAgVVNIT1JUICpwTnVtRXh0U29ydEN3SW5TZWN0ICAgICAgICAgPSBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKICBVSU5UICAgIG51bVNlZ21lbnQgICAgICAgICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLm51bVNlZ21lbnQ7CiNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKICBVQ0hBUiAgKnBNYXhMZW5PZkNiSW5FeHRTcnRTZWMgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBNYXhMZW5PZkNiSW5FeHRTcnRTZWM7CiAgU0NIQVIgICBsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCAgICAgPSBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZkxvbmdlc3RDb2Rld29yZDsKICBjb25zdCBVQ0hBUiAgICpwTWF4Q3dMZW5ndGggICAgICAgICA9IHBIY3ItPnRhYmxlSW5mby5wTWF4Q3dMZW5ndGg7CiNlbmRpZgoKICByZW1haW5OdW1Dd0luU29ydFNlYyA9IHBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbltzcnRTZWNDbnRdOwogIGluU2VnbWVudFJlbWFpbk51bUNXID0gbnVtU2VnbWVudDsKCiAgd2hpbGUgKHNydFNlY0NudCA8IG51bVNvcnRlZFNlY3Rpb24pIHsKICAgIGlmIChpblNlZ21lbnRSZW1haW5OdW1DVyA8IHJlbWFpbk51bUN3SW5Tb3J0U2VjKSB7CgogICAgICBwTnVtRXh0U29ydEN3SW5TZWN0W3hTcnRTY0NudF0gPSBpblNlZ21lbnRSZW1haW5OdW1DVzsKICAgICAgcEV4dGVuZGVkU29ydGVkQ29Cb1t4U3J0U2NDbnRdID0gcFNvcnRlZENvZGVib29rW3NydFNlY0NudF07CgogICAgICByZW1haW5OdW1Dd0luU29ydFNlYyAtPSBpblNlZ21lbnRSZW1haW5OdW1DVzsKICAgICAgaW5TZWdtZW50UmVtYWluTnVtQ1cgPSBudW1TZWdtZW50OwogICAgICAvKiBkYXRhIG9mIGEgc29ydGVkIHNlY3Rpb24gd2FzIG5vdCBpbnRlZ3JhdGVkIGluIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9uICovCiAgICB9CiAgICBlbHNlIGlmIChpblNlZ21lbnRSZW1haW5OdW1DVyA9PSByZW1haW5OdW1Dd0luU29ydFNlYykgewogICAgICBwTnVtRXh0U29ydEN3SW5TZWN0W3hTcnRTY0NudF0gPSBpblNlZ21lbnRSZW1haW5OdW1DVzsKICAgICAgcEV4dGVuZGVkU29ydGVkQ29Cb1t4U3J0U2NDbnRdID0gcFNvcnRlZENvZGVib29rW3NydFNlY0NudF07CgogICAgICBzcnRTZWNDbnQrKzsKICAgICAgcmVtYWluTnVtQ3dJblNvcnRTZWMgPSBwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb25bc3J0U2VjQ250XTsKICAgICAgaW5TZWdtZW50UmVtYWluTnVtQ1cgPSBudW1TZWdtZW50OwogICAgICAvKiBkYXRhIG9mIGEgc29ydGVkIHNlY3Rpb24gd2FzIGludGVncmF0ZWQgaW4gZXh0ZW5kZWQgc29ydGVkIHNlY3Rpb24gKi8KICAgIH0KICAgIGVsc2UgeyAvKiBpblNlZ21lbnRSZW1haW5OdW1DVyA+IHJlbWFpbk51bUN3SW5Tb3J0U2VjICovCiAgICAgIHBOdW1FeHRTb3J0Q3dJblNlY3RbeFNydFNjQ250XSA9IHJlbWFpbk51bUN3SW5Tb3J0U2VjOwogICAgICBwRXh0ZW5kZWRTb3J0ZWRDb0JvW3hTcnRTY0NudF0gPSBwU29ydGVkQ29kZWJvb2tbc3J0U2VjQ250XTsKCgogICAgICBpblNlZ21lbnRSZW1haW5OdW1DVyAtPSByZW1haW5OdW1Dd0luU29ydFNlYzsKICAgICAgc3J0U2VjQ250Kys7CiAgICAgIHJlbWFpbk51bUN3SW5Tb3J0U2VjID0gcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW3NydFNlY0NudF07CiAgICAgIC8qIGRhdGEgb2YgYSBzb3J0ZWQgc2VjdGlvbiB3YXMgaW50ZWdyYXRlZCBpbiBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbiAqLwogICAgfQojaWYgREVURUNUX1RPT19MT05HX0NXX1JFQURTCiAgICBwTWF4TGVuT2ZDYkluRXh0U3J0U2VjW3hTcnRTY0NudF0gPSBGREttaW4ocE1heEN3TGVuZ3RoW3BFeHRlbmRlZFNvcnRlZENvQm9beFNydFNjQ250XV0sbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQpOwojZW5kaWYKCgoKICAgIHhTcnRTY0NudCArPSAxOwoKICAgIGlmICggeFNydFNjQ250ID49IChNQVhfU0ZCX0hDUiArIE1BWF9IQ1JfU0VUUykgKSB7CiAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IEVYVEVOREVEX1NPUlRFRF9DT1VOVEVSX09WRVJGTE9XOwogICAgICByZXR1cm47CiAgICB9CgogIH0KICBwTnVtRXh0U29ydEN3SW5TZWN0W3hTcnRTY0NudF0gPSAwOwoKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgZXh0ZW5kZWQgc29ydGVkIHNlY3Rpb25zIHdoaWNoCiAgICAgICAgICAgICAgICAgICAgYmVsb25nIHRvIHRoZSBzZXRzLiBFYWNoIHNldCBmcm9tIHNldCAwIChvbmUgYW5kIG9ubHkgc2V0IGZvciB0aGUgUENXcykKICAgICAgICAgICAgICAgICAgICB0aWxsIHRvIHRoZSBsYXN0IHNldCBnZXRzIGEgZW50cnkgaW4gdGhlIGFycmF5IHRvIHdoaWNoCiAgICAgICAgICAgICAgICAgICAgJ3BOdW1FeHRlbmRlZFNvcnRlZFNlY3RpbnNJblNldHMnIHBvaW50cyB0by4KCiAgICAgICAgICAgICAgICAgICAgQ2FsY3VsYXRpb246IFRoZSBlbnRyeXMgaW4gcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3RpbiBhcmUgYWRkZWQKICAgICAgICAgICAgICAgICAgICB1bnRpbGwgdGhlIHZhbHVlIG51bVNlZ21lbnQgaXMgcmVhY2hlZC4gVGhlbiB0aGUgc3VtX3ZhcmlhYmxlIGlzIGNsZWFyZWQKICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIGNhbGN1bGF0aW9uIHN0YXJ0cyBmcm9tIHRoZSBiZWdpbm5pbmcuIEFzIG11Y2ggZXh0ZW5kZWQgc29ydGVkCiAgICAgICAgICAgICAgICAgICAgU2VjdGlvbnMgYXJlIHN1bW1lZCB1cCB0byByZWFjaCB0aGUgdmFsdWUgbnVtU2VnbWVudCwgYXMgbXVjaCBpcyB0aGUKICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGVudHJ5IGluICpwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpzdGF0aWMgdm9pZCBEZXJpdmVOdW1iZXJPZkV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMoVUlOVCAgICBudW1TZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICpwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAqcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgIG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHgpCnsKICBVU0hPUlQgIGNvdW50ZXIgPSAwOwogIFVJTlQgICAgY3dTdW0gICA9IDA7CiAgVVNIT1JUICpwTnVtRXhTb3J0Q3dJblNlYyAgID0gcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb247CiAgVVNIT1JUICpwTnVtRXhTb3J0U2VjSW5TZXRzID0gcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHM7CgogIHdoaWxlIChwTnVtRXhTb3J0Q3dJblNlY1tudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4XSAhPSAwKQogIHsKICAgIGN3U3VtICs9IHBOdW1FeFNvcnRDd0luU2VjW251bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHhdOwogICAgbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCsrOwogICAgaWYgKG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPj0gKE1BWF9TRkJfSENSK01BWF9IQ1JfU0VUUykpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGN3U3VtID4gbnVtU2VnbWVudCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb3VudGVyKys7CiAgICBpZiAoY291bnRlciA+IDEwMjQvNCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIGN3U3VtID09IG51bVNlZ21lbnQgKSB7CiAgICAgIHBOdW1FeFNvcnRTZWNJblNldHNbbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeF0gPSBjb3VudGVyOwogICAgICBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4Kys7CiAgICAgIGlmIChudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4ID49IE1BWF9IQ1JfU0VUUykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb3VudGVyID0gMDsKICAgICAgY3dTdW0gPSAwOwogICAgfQogIH0KICBwTnVtRXhTb3J0U2VjSW5TZXRzW251bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHhdID0gY291bnRlcjsgICAvKiBzYXZlIGxhc3QgZW50cnkgZm9yIHRoZSBsYXN0IC0gcHJvYmFibHkgc2hvcnRlciAtIHNldCAqLwp9CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgYWxsIHByaW9yaXR5IGNvZGV3b3JkcyAoUENXcykgaW4gYSBzcGVjdHJ1bSAod2l0aGluCiAgICAgICAgICAgICAgICAgICAgc2V0IDApLiBUaGUgY2FsY3VsYXRpb24gb2YgdGhlIFBDV3MgaXMgbWFuYWdlZCBpbiB0d28gbG9vcHMuIFRoZQogICAgICAgICAgICAgICAgICAgIGxvb3Bjb3VudGVyIG9mIHRoZSBvdXRlciBsb29wIGlzIHNldCB0byB0aGUgZmlyc3QgdmFsdWUgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgIHBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzIHBvaW50cyB0by4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbnMgd2l0aGluIHNldCAwLgogICAgICAgICAgICAgICAgICAgIFRoZSBsb29wY291bnRlciBvZiB0aGUgaW5uZXIgbG9vcCBpcyBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICBwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluIHBvaW50cyB0by4gVGhlIHZhbHVlIHJlcHJlc2VudHMgdGhlCiAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGV4dGVuZGVkIHNvcnRlZCBjb2Rld29yZHMgaW4gc2VjdGlvbnMgKHRoZSBvcmlnaW5hbCBzZWN0aW9ucyBoYXZlCiAgICAgICAgICAgICAgICAgICAgYmVlbiBzcGxpdHRlZCB0byBnbyBhbG9uZyB3aXRoIHRoZSBib3JkZXJzIG9mIHRoZSBzZXRzKS4KICAgICAgICAgICAgICAgICAgICBFYWNoIHRpbWUgdGhlIG51bWJlciBvZiB0aGUgZXh0ZW5kZWQgc29ydGVkIGNvZGV3b3JkcyBpbiBzZWN0aW9ucyBhcmUgZGUtCiAgICAgICAgICAgICAgICAgICAgY29kZWQsIHRoZSBwb2ludGVyICdwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluJyBpcyBpbmNyZW1lbnRlZCBieQogICAgICAgICAgICAgICAgICAgIG9uZS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8Kc3RhdGljIHZvaWQgRGVjb2RlUENXcyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgSF9IQ1JfSU5GTyBwSGNyKQp7CiAgVUlOVCAgICAgICAgIGk7CiAgVVNIT1JUICAgICAgIGV4dFNvcnRTZWM7CiAgVVNIT1JUICAgICAgIGN1ckV4dFNvcnRDd0luU2VjOwogIFVDSEFSICAgICAgICBjb2RlYm9vazsKICBVQ0hBUiAgICAgICAgZGltZW5zaW9uOwogIGNvbnN0IFVJTlQgICpwQ3VycmVudFRyZWU7CiAgY29uc3QgU0NIQVIgKnBRdWFudFZhbEJhc2U7CiAgY29uc3QgU0NIQVIgKnBRdWFudFZhbDsKCiAgVVNIT1JUICAgICAgKnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uID0gcEhjci0+c2VjdGlvbkluZm8ucE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb247CiAgaW50ICAgICAgICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPSBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4OwogIFVDSEFSICAgICAgICpwRXh0ZW5kZWRTb3J0ZWRDb2RlYm9vayAgICAgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBFeHRlbmRlZFNvcnRlZENvZGVib29rOwogIGludCAgICAgICAgICBleHRlbmRlZFNvcnRlZENvZGVib29rSWR4ICAgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLmV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHg7CiAgVVNIT1JUICAgICAgKnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzICAgID0gcEhjci0+c2VjdGlvbkluZm8ucE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHM7CiAgaW50ICAgICAgICAgIG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggID0gcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKICBGSVhQX0RCTCAgICAqcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzICAgICAgPSBTUEVDX0xPTkcocEhjci0+ZGVjSW5PdXQucFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZSk7CiAgaW50ICAgICAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ICAgID0gcEhjci0+ZGVjSW5PdXQucXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHg7CiAgVVNIT1JUICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQgICAgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKICBTQ0hBUiAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKI2lmIERFVEVDVF9UT09fTE9OR19DV19SRUFEUwogIFVDSEFSICAgICAgICpwTWF4TGVuT2ZDYkluRXh0U3J0U2VjICAgICAgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBNYXhMZW5PZkNiSW5FeHRTcnRTZWM7CiAgaW50ICAgICAgICAgIG1heExlbk9mQ2JJbkV4dFNydFNlY0lkeCAgICAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ubWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4OwogIFVDSEFSICAgICAgICBtYXhBbGxvd2VkQ3dMZW47CiAgaW50ICAgICAgICAgIG51bURlY29kZWRCaXRzOwojZW5kaWYKICBjb25zdCBVQ0hBUiAqcENiRGltZW5zaW9uID0gIHBIY3ItPnRhYmxlSW5mby5wQ2JEaW1lbnNpb247CiAgY29uc3QgVUNIQVIgKnBDYlNpZ24gICAgICA9ICBwSGNyLT50YWJsZUluZm8ucENiU2lnbjsKCiAgLyogY2xlYXIgcmVzdWx0IGFycmF5ICovCiAgLy9wUVNDID0gJnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c1txdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF07CiAgLy9wUVNDID0gKnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50czsKCiAgRkRLbWVtY2xlYXIocFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzK3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4LDEwMjQqc2l6ZW9mKEZJWFBfREJMKSk7CgogIC8qIGRlY29kZSBhbGwgUENXcyBpbiB0aGUgZXh0ZW5kZWQgc29ydGVkIHNlY3Rpb24ocykgYmVsb25naW5nIHRvIHNldCAwICovCiAgZm9yICggZXh0U29ydFNlYyA9IHBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzW251bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHhdOyBleHRTb3J0U2VjICE9IDA7IGV4dFNvcnRTZWMtLSApIHsKCiAgICBjb2RlYm9vayAgICAgICAgPSAgcEV4dGVuZGVkU29ydGVkQ29kZWJvb2tbZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeF07ICAgLyogZ2V0IGNvZGVib29rIGZvciB0aGlzIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9uIGFuZCBpbmNyZW1lbnQgcHRyIHRvIGNiIG9mIG5leHQgZXh0LiBzb3J0IHNlYyAqLwogICAgZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeCsrOwogICAgaWYgKGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHggPj0gKE1BWF9TRkJfSENSK01BWF9IQ1JfU0VUUykpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZGltZW5zaW9uICAgICAgID0gIHBDYkRpbWVuc2lvbltjb2RlYm9va107ICAgICAgICAgLyogZ2V0IGRpbWVuc2lvbiBvZiBjb2RlYm9vayBvZiB0aGlzIGV4dGVuZGVkIHNvcnQuIHNlYy4gKi8KICAgIHBDdXJyZW50VHJlZSAgICA9ICBhSHVmZlRhYmxlICBbY29kZWJvb2tdOyAgICAgICAgIC8qIGNvbnZlcnQgY29kZWJvb2sgdG8gcG9pbnRlciB0byBRU0NzICovCiAgICBwUXVhbnRWYWxCYXNlICAgPSAgYVF1YW50VGFibGUgW2NvZGVib29rXTsgICAgICAgICAvKiBjb252ZXJ0IGNvZGVib29rIHRvIGluZGV4IHRvIHRhYmxlIG9mIFFTQ3MgKi8KI2lmIERFVEVDVF9UT09fTE9OR19DV19SRUFEUwogICAgbWF4QWxsb3dlZEN3TGVuID0gcE1heExlbk9mQ2JJbkV4dFNydFNlY1ttYXhMZW5PZkNiSW5FeHRTcnRTZWNJZHhdOwogICAgbWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4Kys7CiAgICBpZiAobWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4ID49IChNQVhfU0ZCX0hDUitNQVhfSENSX1NFVFMpKSB7CiAgICAgIHJldHVybjsKICAgIH0KI2VuZGlmCgogICAgLyogc3dpdGNoIGZvciBkZWNvZGluZyB3aXRoIGRpZmZlcmVudCBjb2RlYm9va3M6ICovCiAgICBpZiAoIHBDYlNpZ25bY29kZWJvb2tdID09IDAgKSB7ICAgICAgICAgICAgICAgICAgICAvKiBubyBzaWduIGJpdHMgZm9sbG93IGFmdGVyIHRoZSBjb2Rld29yZC1ib2R5ICovCiAgICAgIC8qIFBDV19Cb2R5T05MWSAqLwogICAgICAvKj09PT09PT09PT09PT09Ki8KCiAgICAgIGZvciAoIGN1ckV4dFNvcnRDd0luU2VjID0gcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25bbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeF0gOyBjdXJFeHRTb3J0Q3dJblNlYyAhPSAwOyBjdXJFeHRTb3J0Q3dJblNlYy0tKSB7CiAgICAgICAgbnVtRGVjb2RlZEJpdHMgPSAwOwoKICAgICAgICAvKiBkZWNvZGUgUENXX0JPRFkgKi8KICAgICAgICBwUXVhbnRWYWwgPSBEZWNvZGVQQ1dfQm9keShicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudFRyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1YW50VmFsQmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bURlY29kZWRCaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAvKiByZXN1bHQgaXMgd3JpdHRlbiBvdXQgaGVyZSBiZWNhdXNlIE5PIHNpZ24gYml0cyBmb2xsb3cgdGhlIGJvZHkgKi8KICAgICAgICBmb3IoIGk9ZGltZW5zaW9uOyBpICE9IDAgOyBpLS0gKSB7CiAgICAgICAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNbcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHhdID0gKEZJWFBfREJMKSAqcFF1YW50VmFsKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIHF1YW50LiBzcGVjLiBjb2VmLiBpbnRvIHNwZWN0cnVtOyBzaWduIGlzIGFscmVhZHkgdmFsaWQgKi8KICAgICAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4Kys7CiAgICAgICAgICBpZiAocXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggPj0gMTAyNCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBvbmUgbW9yZSBQQ1cgc2hvdWxkIGJlIGRlY29kZWQgKi8KCiNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKICAgICAgICBpZiAoIG1heEFsbG93ZWRDd0xlbiA8IChudW1EZWNvZGVkQml0cyArIEVSUk9SX1BDV19CT0RZX09OTFlfVE9PX0xPTkcpICkgewogICAgICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gVE9PX01BTllfUENXX0JPRFlfQklUU19ERUNPREVEOwogICAgICAgIH0KI2VuZGlmCgojaWYgQ0hFQ0tfU0VHTUVOVEFUSU9OX0lNTUVESUFURUxZCiAgICAgICAgaWYgKDEgPT0gZXJyRGV0ZWN0UGN3U2VnbWVudGF0aW9uKCpwUmVtYWluaW5nQml0c0luU2VnbWVudC1FUlJPUl9QQ1dfQk9EWSxwSGNyLFBDV19CT0RZLHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cytxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeC1kaW1lbnNpb24sZGltZW5zaW9uKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBwb2ludGVyIGZvciBkZWNvZGluZyB0aGUgbmV4dCBQQ1cgKi8KICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHBvaW50ZXIgZm9yIGRlY29kaW5nIHRoZSBuZXh0IFBDVyAqLwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmICgoIHBDYlNpZ25bY29kZWJvb2tdID09IDEgKSAmJiAoIGNvZGVib29rIDwgMTEgKSkgeyAgLyogcG9zc2libHkgdGhlcmUgZm9sbG93IDEsMiwzIG9yIDQgc2lnbiBiaXRzIGFmdGVyIHRoZSBjb2Rld29yZC1ib2R5ICovCiAgICAgIC8qIFBDV19Cb2R5IGFuZCBQQ1dfU2lnbiAqLwogICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09Ki8KCiAgICAgIGZvciAoIGN1ckV4dFNvcnRDd0luU2VjID0gcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25bbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeF0gOyBjdXJFeHRTb3J0Q3dJblNlYyAhPSAwOyBjdXJFeHRTb3J0Q3dJblNlYy0tKQogICAgICB7CiAgICAgICAgaW50IGVycjsKICAgICAgICBudW1EZWNvZGVkQml0cyAgPSAwOwoKICAgICAgICBwUXVhbnRWYWwgPSBEZWNvZGVQQ1dfQm9keShicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudFRyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1YW50VmFsQmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bURlY29kZWRCaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICBlcnIgPSBEZWNvZGVQQ1dfU2lnbiggYnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1YW50VmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRGVjb2RlZEJpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgIGlmIChlcnIgIT0gMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvKiBvbmUgbW9yZSBQQ1cgc2hvdWxkIGJlIGRlY29kZWQgKi8KCiNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKICAgICAgICBpZiAoIG1heEFsbG93ZWRDd0xlbiA8IChudW1EZWNvZGVkQml0cyArIEVSUk9SX1BDV19CT0RZX1NJR05fVE9PX0xPTkcpICkgewogICAgICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gVE9PX01BTllfUENXX0JPRFlfU0lHTl9CSVRTX0RFQ09ERUQ7CiAgICAgICAgfQojZW5kaWYKCiNpZiBDSEVDS19TRUdNRU5UQVRJT05fSU1NRURJQVRFTFkKICAgICAgICBpZiAoMSA9PSBlcnJEZXRlY3RQY3dTZWdtZW50YXRpb24oKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LUVSUk9SX1BDV19CT0RZX1NJR04scEhjcixQQ1dfQk9EWV9TSUdOLCBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMrcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgtZGltZW5zaW9uLGRpbWVuc2lvbikpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiNlbmRpZgogICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQrKzsKICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCsrOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmICgoIHBDYlNpZ25bY29kZWJvb2tdID09IDEgKSAmJiAoIGNvZGVib29rID49IDExICkpIHsgLyogcG9zc2libHkgdGhlcmUgZm9sbG93IHNvbWUgc2lnbiBiaXRzIGFuZCBtYXliZSBvbmUgb3IgdHdvIGVzY2FwZSBzZXF1ZW5jZXMgYWZ0ZXIgdGhlIGN3LWJvZHkgKi8KICAgICAgLyogUENXX0JvZHksIFBDV19TaWduIGFuZCBtYXliZSBQQ1dfRXNjYXBlICovCiAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKICAgICAgZm9yICggY3VyRXh0U29ydEN3SW5TZWMgPSBwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbltudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4XSA7IGN1ckV4dFNvcnRDd0luU2VjICE9IDA7IGN1ckV4dFNvcnRDd0luU2VjLS0pCiAgICAgIHsKICAgICAgICBpbnQgZXJyOwogICAgICAgIG51bURlY29kZWRCaXRzICA9IDA7CgogICAgICAgIC8qIGRlY29kZSBQQ1dfQk9EWSAqLwogICAgICAgIHBRdWFudFZhbCA9IERlY29kZVBDV19Cb2R5KGJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50VHJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVhbnRWYWxCYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRGVjb2RlZEJpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgIGVyciA9IERlY29kZVBDV19TaWduKCBicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVhbnRWYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1EZWNvZGVkQml0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvKiBkZWNvZGUgUENXX0VTQ0FQRSBpZiBwcmVzZW50ICovCiAgICAgICAgcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggLT0gRElNRU5TSU9OX09GX0VTQ0FQRV9DT0RFQk9PSzsKCiAgICAgICAgaWYgKCBmaXhwX2FicyhwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNbcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHhdKSA9PSAoRklYUF9EQkwpRVNDQVBFX1ZBTFVFICkgewogICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSA9IChGSVhQX0RCTCkgRGVjb2RlRXNjYXBlU2VxdWVuY2UoIGJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNbcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRGVjb2RlZEJpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4Kys7CiAgICAgICAgaWYgKHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ID49IDEwMjQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICggZml4cF9hYnMocFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSkgPT0gKEZJWFBfREJMKUVTQ0FQRV9WQUxVRSApIHsKICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c1txdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF0gPSAoRklYUF9EQkwpIERlY29kZUVzY2FwZVNlcXVlbmNlKCBicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bURlY29kZWRCaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCsrOwogICAgICAgIGlmIChxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCA+PSAxMDI0KSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvKiBvbmUgbW9yZSBQQ1cgc2hvdWxkIGJlIGRlY29kZWQgKi8KCiNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKICAgICAgICBpZiAoIG1heEFsbG93ZWRDd0xlbiA8IChudW1EZWNvZGVkQml0cyArIEVSUk9SX1BDV19CT0RZX1NJR05fRVNDX1RPT19MT05HKSApIHsKICAgICAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IFRPT19NQU5ZX1BDV19CT0RZX1NJR05fRVNDX0JJVFNfREVDT0RFRDsKICAgICAgICB9CiNlbmRpZgoKI2lmIENIRUNLX1NFR01FTlRBVElPTl9JTU1FRElBVEVMWQogICAgICAgIGlmICgxID09IGVyckRldGVjdFBjd1NlZ21lbnRhdGlvbigqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQtRVJST1JfUENXX0JPRFlfU0lHTl9FU0MscEhjcixQQ1dfQk9EWV9TSUdOX0VTQyxwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMrcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgtRElNRU5TSU9OX09GX0VTQ0FQRV9DT0RFQk9PSyxESU1FTlNJT05fT0ZfRVNDQVBFX0NPREVCT09LKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCsrOwogICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50Kys7CiAgICAgIH0KICAgIH0KCiAgICAvKiBhbGwgUENXcyBiZWxvbmdpbmcgdG8gdGhpcyBleHRlbmRlZCBzZWN0aW9uIHNob3VsZCBiZSBkZWNvZGVkICovCiAgICBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4Kys7CiAgICBpZiAobnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA+PSBNQVhfU0ZCX0hDUitNQVhfSENSX1NFVFMpIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0KICAvKiBhbGwgUENXcyBzaG91bGQgYmUgZGVjb2RlZCAqLwoKICBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4Kys7CiAgaWYgKG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggPj0gTUFYX0hDUl9TRVRTKSB7CiAgICByZXR1cm47CiAgfQoKICAvKiBXcml0ZSBiYWNrIGluZGV4ZXMgaW50byBzdHJ1Y3R1cmUgKi8KICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID0gbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKICBwSGNyLT5zZWN0aW9uSW5mby5leHRlbmRlZFNvcnRlZENvZGVib29rSWR4ID0gZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeDsKICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4ID0gbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKICBwSGNyLT5kZWNJbk91dC5xdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCA9IHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4OwogIHBIY3ItPnNlY3Rpb25JbmZvLm1heExlbk9mQ2JJbkV4dFNydFNlY0lkeCA9IG1heExlbk9mQ2JJbkV4dFNydFNlY0lkeDsKfQoKI2lmIENIRUNLX1NFR01FTlRBVElPTl9JTU1FRElBVEVMWQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGltbWVkaWF0ZWx5IGFmdGVyIGV2ZXJ5IGRlY29kZWQgUENXLCB3aGV0aGVyIG91dCBvZgogICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IHNlZ21lbnQgdG9vIG1hbnkgYml0cyBoYXZlIGJlZW4gcmVhZCBvciBub3QuIElmIGFuIGVycm9yIG9jY3VycnMsCiAgICAgICAgICAgICAgICAgICAgcHJvYmFibHkgdGhlIHNpZGVpbmZvIG9yIHRoZSBIQ1ItYml0c3RyZWFtIGJsb2NrIGhvbGRpbmcgdGhlIGh1ZmZtYW4KICAgICAgICAgICAgICAgICAgICBlbmNvZGVkIHF1YW50aXplZCBzcGVjdHJhbCBjb2VmZmljaWVudHMgaXMgZGlzdG9ydGVkLiBJbiB0aGlzIGNhc2UgdGhlIHR3bwogICAgICAgICAgICAgICAgICAgIG9yIGZvdXIgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cyBiZWxvbmdpbmcgdG8gdGhlIGN1cnJlbnQgY29kZXdvcmQKICAgICAgICAgICAgICAgICAgICBhcmUgbWFya2VkIChmb3IgYmVpbmcgZGV0ZWN0ZWQgYnkgY29uY2VhbG1lbnQgbGF0ZXIpLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpzdGF0aWMgVUNIQVIgZXJyRGV0ZWN0UGN3U2VnbWVudGF0aW9uKFNDSEFSICAgICAgIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSF9IQ1JfSU5GTyAgcEhjciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ1dfVFlQRSAgICBraW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKnFzY19iYXNlX29mX2N3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgIGRpbWVuc2lvbikKewogIFNDSEFSIGk7CiAgaWYgKCByZW1haW5pbmdCaXRzSW5TZWdtZW50IDwgMCApIHsKICAgIC8qIGxvZyB0aGUgZXJyb3IgKi8KICAgIHN3aXRjaCAoa2luZCkgewogICAgY2FzZSBQQ1dfQk9EWToKICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTRUdNRU5UX09WRVJSSURFX0VSUl9QQ1dfQk9EWTsKICAgICAgICBicmVhazsKICAgIGNhc2UgUENXX0JPRFlfU0lHTjoKICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTRUdNRU5UX09WRVJSSURFX0VSUl9QQ1dfQk9EWV9TSUdOOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBQQ1dfQk9EWV9TSUdOX0VTQzoKICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTRUdNRU5UX09WRVJSSURFX0VSUl9QQ1dfQk9EWV9TSUdOX0VTQzsKICAgICAgICBicmVhazsKICAgIH0KICAgIC8qIG1hcmsgdGhlIGVycmVkIGxpbmVzICovCiAgICBmb3IgKCBpID0gZGltZW5zaW9uOyBpICE9IDA7IGktLSApIHsKICAgICAgKnFzY19iYXNlX29mX2N3KysgPSAoRklYUF9EQkwpIFFfVkFMVUVfSU5WQUxJRDsKICAgIH0KICAgIHJldHVybiAxOwogIH0KICByZXR1cm4gMDsKfQojZW5kaWYKCiNpZiBDSEVDS19TRUdNRU5UQVRJT05fRklOQUwKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBhbGwgc2VnbWVudHMgYXJlIGVtcHR5IGFmdGVyIGRlY29kaW5nLiBUaGVyZQogICAgICAgICAgICAgICAgICAgIGFyZSBfbm8gbGluZXMgbWFya2RlZF8gYXMgaW52YWxpZCBiZWNhdXNlIGl0IGNvdWxkIG5vdCBiZSB0cmFjZWQgYmFjawogICAgICAgICAgICAgICAgICAgIHdoZXJlIGZyb20gdGhlIHJlbWFpbmluZyBiaXRzIGFyZS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8Kc3RhdGljIHZvaWQgZXJyRGV0ZWN0V2l0aGluU2VnbWVudGF0aW9uRmluYWwoSF9IQ1JfSU5GTyBwSGNyKQp7CiAgVUNIQVIgICBzZWdtZW50YXRpb25FcnJvckZsYWcgICA9IDA7CiAgVVNIT1JUICBpOwogIFNDSEFSICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKICBVSU5UICAgIG51bVNlZ21lbnQgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ubnVtU2VnbWVudDsKCiAgZm9yICggaT1udW1TZWdtZW50OyBpICE9IDAgOyBpLS0pIHsKICAgIGlmICgqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQrKyAhPSAwKSB7CiAgICAgIHNlZ21lbnRhdGlvbkVycm9yRmxhZyA9IDE7CiAgICB9CiAgfQogIGlmIChzZWdtZW50YXRpb25FcnJvckZsYWcgPT0gMSkgewogICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gQklUX0lOX1NFR01FTlRBVElPTl9FUlJPUjsKICB9Cn0KI2VuZGlmCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gd2Fsa3Mgb25lIHN0ZXAgd2l0aGluIHRoZSBkZWNvZGluZyB0cmVlLiBXaGljaCBicmFuY2ggaXMKICAgICAgICAgICAgICAgICAgICB0YWtlbiBkZXBlbmRzIG9uIHRoZSBkZWNvZGVkIGNhcnJ5Qml0IGlucHV0IHBhcmFtZXRlci4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8Kdm9pZCAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKFVDSEFSICBjYXJyeUJpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICB0cmVlTm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICpicmFuY2hWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICpicmFuY2hOb2RlKQp7CiAgaWYgKGNhcnJ5Qml0ID09IDApIHsKICAgICpicmFuY2hOb2RlID0gKHRyZWVOb2RlICYgTUFTS19MRUZUKSA+PiBMRUZUX09GRlNFVDsgLyogTUFTS19MRUZUOiAgMDBGRkYwMDAgKi8KICB9CiAgZWxzZSB7CiAgICAqYnJhbmNoTm9kZSA9IHRyZWVOb2RlICYgTUFTS19SSUdIVDsgICAgICAgICAgICAgICAgIC8qIE1BU0tfUklHSFQ6IDAwMDAwRkZGICovCiAgfQoKICAqYnJhbmNoVmFsdWUgPSAqYnJhbmNoTm9kZSAmIENMUl9CSVRfMTA7ICAgICAgICAgICAgICAgLyogY2xlYXIgYml0IDEwIChpZiBzZXQpICovCn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIGRlc2NyaXB0aW9uOiAgIERlY29kZXMgdGhlIGJvZHkgb2YgYSBwcmlvcml0eSBjb2Rld29yZCAoUENXKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIHJldHVybjogICAtIHJldHVybiB2YWx1ZSBpcyBwb2ludGVyIHRvIGZpcnN0IG9mIHR3byBvciBmb3VyIHF1YW50aXplZCBzcGVjdHJhbAogICAgICAgICAgICAgICAgICAgIGNvZWZmaWNpZW50cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpzdGF0aWMgY29uc3QgU0NIQVIgKkRlY29kZVBDV19Cb2R5KEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAqcEN1cnJlbnRUcmVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSICAgICAgICAgICpwUXVhbnRWYWxCYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAqcE51bURlY29kZWRCaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICBVQ0hBUiBjYXJyeUJpdDsKICBVSU5UICBicmFuY2hOb2RlOwogIFVJTlQgIHRyZWVOb2RlOwogIFVJTlQgIGJyYW5jaFZhbHVlOwogIGNvbnN0ICBTQ0hBUiAqcFF1YW50VmFsOwoKICAvKiBkZWNvZGUgUENXX0JPRFkgKi8KICB0cmVlTm9kZSA9ICpwQ3VycmVudFRyZWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBmaXJzdCBub2RlIG9mIGN1cnJlbnQgdHJlZSBiZWxvbmdpbmcgdG8gY3VycmVudCBjb2RlYm9vayAqLwoKICAvKiBkZWNvZGUgd2hvbGUgUENXLWNvZGV3b3JkLWJvZHkgKi8KICB3aGlsZSAoMSkgewoKICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oYnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsICAgICAgICAgICAgICAgICAvKiBkdW1teSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NX0xFRlRfVE9fUklHSFQpOwogICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50IC09IDE7CiAgICAqcE51bURlY29kZWRCaXRzICs9IDE7CgogICAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKGNhcnJ5Qml0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICZicmFuY2hWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoTm9kZSk7CgogICAgaWYgKChicmFuY2hOb2RlICYgVEVTVF9CSVRfMTApID09IFRFU1RfQklUXzEwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdCBiaXQgMTAgOyBpZiBzZXQgLS0+IGNvZGV3b3JkLWJvZHkgaXMgY29tcGxldGUgKi8KICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBicmFuY2ggaW4gdHJlZSByZWFjaGVkICBpLmUuIGEgd2hvbGUgUENXLUJvZHkgaXMgZGVjb2RlZCAqLwogICAgfQogICAgZWxzZSB7CiAgICAgIHRyZWVOb2RlID0gKihwQ3VycmVudFRyZWUgKyBicmFuY2hWYWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCiAgICB9CgogIH0KCiAgcFF1YW50VmFsID0gcFF1YW50VmFsQmFzZSArIGJyYW5jaFZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgcG9pbnRlciB0byB2YWxpZCBmaXJzdCBvZiAyIG9yIDQgcXVhbnRpemVkIHZhbHVlcyAqLwoKICByZXR1cm4gcFF1YW50VmFsOwp9CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgb25lIGVzY2FwZSBzZXF1ZW5jZS4gSW4gY2FzZSBvZiBhIGVzY2FwZSBjb2RlYm9vawogICAgICAgICAgICAgICAgICAgIGFuZCBpbiBjYXNlIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgcXVhbnRpemVkIHNwZWN0cmFsIHZhbHVlID09IDE2LAogICAgICAgICAgICAgICAgICAgIGEgZXNjYXBlU2VxdWVuY2UgaXMgZGVjb2RlZCBpbiB0d28gc3RlcHM6CiAgICAgICAgICAgICAgICAgICAgICAxLiBlc2NhcGUgcHJlZml4CiAgICAgICAgICAgICAgICAgICAgICAyLiBlc2NhcGUgd29yZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIElOVCAgRGVjb2RlRXNjYXBlU2VxdWVuY2UoSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjQ29lZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKnBOdW1EZWNvZGVkQml0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogIFVJTlQgIGk7CiAgSU5UICAgc2lnbjsKICBVSU5UICBlc2NhcGVPbmVzQ291bnRlciA9IDA7CiAgVUlOVCAgY2FycnlCaXQ7CiAgSU5UICAgZXNjYXBlX3dvcmQgPSAwOwoKICAvKiBkZWNvZGUgZXNjYXBlIHByZWZpeCAqLwogIHdoaWxlICgxKSB7CiAgICBjYXJyeUJpdCA9IEhjckdldEFCaXRGcm9tQml0c3RyZWFtKGJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LCAgICAgICAgICAgICAgICAvKiBkdW1teSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NX0xFRlRfVE9fUklHSFQpOwogICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50IC09IDE7CiAgICAqcE51bURlY29kZWRCaXRzICs9IDE7CgogICAgaWYgKGNhcnJ5Qml0ICE9IDApIHsKICAgICAgZXNjYXBlT25lc0NvdW50ZXIgKz0gMTsKICAgIH0KICAgIGVsc2UgewogICAgICBlc2NhcGVPbmVzQ291bnRlciArPSA0OwogICAgICBicmVhazsKICAgIH0KICB9CgogIC8qIGRlY29kZSBlc2NhcGUgd29yZCAqLwogIGZvciggaT1lc2NhcGVPbmVzQ291bnRlcjsgaSAhPSAwIDsgaS0tICkgewogICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbShicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwgICAgICAgICAgICAgICAgLyogZHVtbXkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTV9MRUZUX1RPX1JJR0hUKTsKICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCAtPSAxOwogICAgKnBOdW1EZWNvZGVkQml0cyArPSAxOwoKICAgIGVzY2FwZV93b3JkIDw8PSAxOwogICAgZXNjYXBlX3dvcmQgPSBlc2NhcGVfd29yZCB8IGNhcnJ5Qml0OwogIH0KCiAgc2lnbiA9IChxdWFudFNwZWNDb2VmID49IDApID8gMSA6IC0xOwoKICBxdWFudFNwZWNDb2VmID0gc2lnbiAqICgoKElOVCApIDEgPDwgZXNjYXBlT25lc0NvdW50ZXIpICsgZXNjYXBlX3dvcmQpOwoKICByZXR1cm4gcXVhbnRTcGVjQ29lZjsKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgZGVzY3JpcHRpb246ICAgRGVjb2RlcyB0aGUgU2lnbmJpdHMgb2YgYSBwcmlvcml0eSBjb2Rld29yZCAoUENXKSBhbmQgd3JpdGVzIG91dCB0aGUKICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmcgcXVhbnRpemVkIHNwZWN0cmFsIHZhbHVlcyBpbnRvIHVuc29ydGVkIHNlY3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgb3V0cHV0OiAgIC0gdHdvIG9yIGZvdXIgbGluZXMgYXQgcG9zaXRpb24gaW4gY29ycmVzcG9uZGluZyBzZWN0aW9uICh3aGljaCBhcmUgbm90CiAgICAgICAgICAgICAgICAgICAgbG9jYXRlZCBhdCB0aGUgZGVzaXJlZCBwb3NpdGlvbiwgaS5lLiB0aGV5IG11c3QgYmUgcmVvcmRlcmVkIGluIHRoZSBsYXN0CiAgICAgICAgICAgICAgICAgICAgb2YgZWlnaHQgZnVuY3Rpb24gb2YgSENSKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIHJldHVybjogICAtIHVwZGF0ZWQgcFF1YW50U3BlY0NvZWYgcG9pbnRlciAodG8gbmV4dCBlbXB0eSBzdG9yYWdlIGZvciBhIGxpbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnN0YXRpYyBpbnQgRGVjb2RlUENXX1NpZ24oSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICBjb2RlYm9va0RpbSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiAgICAgICAgICAqcFF1YW50VmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICpwUXVhbnRTcGVjQ29lZiwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqcXVhbnRTcGVjQ29lZklkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAqcExlZnRTdGFydE9mU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKnBOdW1EZWNvZGVkQml0cwogICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgVUlOVCAgICAgaTsKICBVSU5UICAgICBjYXJyeUJpdDsKICBJTlQgICAgICBxdWFudFNwZWNDb2VmOwoKICBmb3IoIGk9Y29kZWJvb2tEaW07IGkgIT0gMCA7IGktLSApIHsKICAgIHF1YW50U3BlY0NvZWYgPSAqcFF1YW50VmFsKys7CiAgICBpZiAocXVhbnRTcGVjQ29lZiAhPSAwKSB7CiAgICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oYnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LCAgICAvKiBkdW1teSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST01fTEVGVF9UT19SSUdIVCk7CiAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCAtPSAxOwogICAgICAqcE51bURlY29kZWRCaXRzICs9IDE7CiAgICAgIGlmICgqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPCAwIHx8ICpwTnVtRGVjb2RlZEJpdHMgPj0gKDEwMjQ+PjEpKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CgogICAgICAvKiBhZGFwdCBzaWduIG9mIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIGRlY29kZWQgc2lnbiBiaXQgKi8KICAgICAgaWYgKGNhcnJ5Qml0ICE9IDApIHsKICAgICAgICBwUXVhbnRTcGVjQ29lZlsqcXVhbnRTcGVjQ29lZklkeF0gPSAtKEZJWFBfREJMKXF1YW50U3BlY0NvZWY7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgcFF1YW50U3BlY0NvZWZbKnF1YW50U3BlY0NvZWZJZHhdID0gIChGSVhQX0RCTClxdWFudFNwZWNDb2VmOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgcFF1YW50U3BlY0NvZWZbKnF1YW50U3BlY0NvZWZJZHhdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICB9CiAgICAqcXVhbnRTcGVjQ29lZklkeCArPSAxIDsKICAgIGlmICgqcXVhbnRTcGVjQ29lZklkeCA+PSAxMDI0KSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICB9CiAgcmV0dXJuIDA7Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIGRlc2NyaXB0aW9uOiAgIE11dGVzIHNwZWN0cmFsIGxpbmVzIHdoaWNoIGhhdmUgYmVlbiBtYXJrZWQgYXMgZXJyb25lb3VzIChRX1ZBTFVFX0lOVkFMSUQpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnZvaWQgSGNyTXV0ZUVycm9uZW91c0xpbmVzKEhfSENSX0lORk8gaEhjcikKewogIGludCBjOwogIEZJWFBfREJMICpSRVNUUklDVCBwTG9uZyA9IFNQRUNfTE9ORyhoSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlKTsKCiAgLyogaWYgdGhlcmUgaXMgYSBsaW5lIHdpdGggdmFsdWUgUV9WQUxVRV9JTlZBTElEIG11dGUgaXQgKi8KICBmb3IgKGMgPSAwOyBjIDwgMTAyNDsgYysrKSB7CiAgICBpZiAocExvbmdbY10gPT0gKEZJWFBfREJMKVFfVkFMVUVfSU5WQUxJRCkgewojaWYgSENSX0xJU1RFTl9UT19NVVRFRF9MSU5FUwogICAgICBwTG9uZ1tjXSA9IChGSVhQX0RCTClIQ1JfRElSQUM7ICAgLyogbWFya2luZyAqLwojZWxzZQogICAgICBwTG9uZ1tjXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOyAgLyogbXV0aW5nICovCiNlbmRpZgogICAgfQogIH0KfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgZGVzY3JpcHRpb246ICAgU2V0cyBnbG9iYWwgSENSIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8Kdm9pZCBzZXRIY3JUeXBlKEhfSENSX0lORk8gaEhjciwgTVA0X0VMRU1FTlRfSUQgdHlwZSkKewogIHN3aXRjaCAodHlwZSkgewogICAgY2FzZSBJRF9TQ0U6CiAgICAgIGhIY3ItPmdsb2JhbEhjclR5cGUgPSAwOwogICAgICBicmVhazsKICAgIGNhc2UgSURfQ1BFOgogICAgICBoSGNyLT5nbG9iYWxIY3JUeXBlID0gMTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBicmVhazsKICB9Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIGRlc2NyaXB0aW9uOiAgIEdldHMgSENSIHR5cGUgZnJvbSB0aGUgSENSIGRhdGEgc3RydWN0dXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgcmV0dXJuOiAgIC0gZ2xvYmFsIEhDUiB0eXBlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCklOVCBnZXRIY3JUeXBlKEhfSENSX0lORk8gaEhjcikKewogIHJldHVybiBoSGNyLT5nbG9iYWxIY3JUeXBlOwp9CgoKCgo=