Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBNLiBHYXllcgogICBEZXNjcmlwdGlvbjogRml4ZWQgcG9pbnQgc3BlY2lmaWMgbWF0aGVtYXRpY2FsIGZ1bmN0aW9ucwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBfX2ZpeHBvaW50X21hdGhfSAojZGVmaW5lIF9fZml4cG9pbnRfbWF0aF9ICgoKI2luY2x1ZGUgImNvbW1vbl9maXguaCIKCgojZGVmaW5lIExEX0RBVEFfU0NBTElORyAoNjQuMGYpCiNkZWZpbmUgTERfREFUQV9TSElGVCAgIDYgICAvKiBwb3coMiwgTERfREFUQV9TSElGVCkgPSBMRF9EQVRBX1NDQUxJTkcgKi8KCi8qKgogKiBcYnJpZWYgZGVwcmVjYXRlZC4gVXNlIGZMb2cyKCkgaW5zdGVhZC4KICovCkZJWFBfREJMIENhbGNMZERhdGEoRklYUF9EQkwgb3ApOwoKdm9pZCBMZERhdGFWZWN0b3IoRklYUF9EQkwgKnNyY1ZlY3RvciwgRklYUF9EQkwgKmRlc3RWZWN0b3IsIElOVCBudW1iZXIpOwoKRklYUF9EQkwgQ2FsY0ludkxkRGF0YShGSVhQX0RCTCBvcCk7CgoKdm9pZCAgICAgSW5pdExkSW50KCk7CkZJWFBfREJMIENhbGNMZEludChJTlQgaSk7CgpleHRlcm4gY29uc3QgVVNIT1JUIHNxcnRfdGFiWzQ5XTsKCmlubGluZSBGSVhQX0RCTCBzcXJ0Rml4cF9sb29rdXAoRklYUF9EQkwgeCkKewogIFVJTlQgeSA9IChJTlQpeDsKICBVQ0hBUiBpc196ZXJvPSh5PT0wKTsKICBJTlQgemVyb3M9Zml4bm9ybXpfRCh5KSAmIDB4MWU7CiAgeTw8PXplcm9zOwogIFVJTlQgaWR4PSh5Pj4yNiktMTY7CiAgVVNIT1JUIGZyYWM9KHk+PjEwKSYweGZmZmY7CiAgVVNIT1JUIG5mcmFjPTB4ZmZmZl5mcmFjOwogIFVJTlQgdD1uZnJhYypzcXJ0X3RhYltpZHhdK2ZyYWMqc3FydF90YWJbaWR4KzFdOwogIHQ9dD4+KHplcm9zPj4xKTsKICByZXR1cm4oaXNfemVybyA/IDAgOiB0KTsKfQoKaW5saW5lIEZJWFBfREJMIHNxcnRGaXhwX2xvb2t1cChGSVhQX0RCTCB4LCBJTlQgKnhfZSkKewogIFVJTlQgeSA9IChJTlQpeDsKICBJTlQgZTsKCiAgaWYgKHggPT0gKEZJWFBfREJMKTApIHsKICAgIHJldHVybiB4OwogIH0KCiAgLyogTm9ybWFsaXplICovCiAgZT1maXhub3Jtel9EKHkpOwogIHk8PD1lOwogIGUgID0gKnhfZSAtIGUgKyAyOwoKICAvKiBDb3JyZWN0IG9kZCBleHBvbmVudC4gKi8KICBpZiAoZSAmIDEpIHsKICAgIHkgPj49IDE7CiAgICBlICsrOwogIH0KICAvKiBHZXQgc3F1YXJlIHJvb3QgKi8KICBVSU5UIGlkeD0oeT4+MjYpLTE2OwogIFVTSE9SVCBmcmFjPSh5Pj4xMCkmMHhmZmZmOwogIFVTSE9SVCBuZnJhYz0weGZmZmZeZnJhYzsKICBVSU5UIHQ9bmZyYWMqc3FydF90YWJbaWR4XStmcmFjKnNxcnRfdGFiW2lkeCsxXTsKCiAgLyogV3JpdGUgYmFjayBleHBvbmVudCAqLwogICp4X2UgPSBlID4+IDE7CiAgcmV0dXJuIChGSVhQX0RCTCkoTE9ORykodD4+MSk7Cn0KCgoKRklYUF9EQkwgc3FydEZpeHAoRklYUF9EQkwgb3ApOwoKdm9pZCBJbml0SW52U3FydFRhYigpOwoKRklYUF9EQkwgaW52U3FydE5vcm0yKEZJWFBfREJMIG9wLCBJTlQgKnNoaWZ0KTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogaW52Rml4cAogICAgZGVzY3JpcHRpb246ICBkZWxpdmVycyAxLyhvcCkKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbmxpbmUgRklYUF9EQkwgaW52Rml4cChGSVhQX0RCTCBvcCkKewogICAgSU5UIHRtcF9leHAgOwogICAgRklYUF9EQkwgdG1wX2ludiA9IGludlNxcnROb3JtMihvcCwgJnRtcF9leHApIDsKICAgIEZES19BU1NFUlQoKDMxLSgyKnRtcF9leHArMSkpPj0wKSA7CiAgICByZXR1cm4gKCBmUG93MkRpdjIoIChGSVhQX0RCTCl0bXBfaW52ICkgPj4gKDMxLSgyKnRtcF9leHArMSkpICkgOwp9CgoKCiNpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiAoX19HTlVDX189PTIpCgojZGVmaW5lIEZVTkNUSU9OX3NjaHVyX2RpdgppbmxpbmUgRklYUF9EQkwgc2NodXJfZGl2KEZJWFBfREJMIG51bSxGSVhQX0RCTCBkZW51bSwgSU5UIGNvdW50KQp7CiAgSU5UIHJlc3VsdCwgdG1wIDsKICAgX19hc21fXyAoInNybCAlMSwgJTIsIDE1XG4iCiAgICAgICAgICAgICJkaXYgJTMsICUxXG4iIDogIj1sbyIgKHJlc3VsdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiJWQiICh0bXApLCAiZCIgKGRlbnVtKSAsICAiZCIgKG51bSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiaGkiICkgOwogIHJldHVybiByZXN1bHQ8PDE2IDsKfQoKLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KI2VsaWYgZGVmaW5lZChfX21pcHNfXykgJiYgKF9fR05VQ19fPT0zKQoKI2RlZmluZSBGVU5DVElPTl9zY2h1cl9kaXYKaW5saW5lIEZJWFBfREJMIHNjaHVyX2RpdihGSVhQX0RCTCBudW0sRklYUF9EQkwgZGVudW0sIElOVCBjb3VudCkKewogIElOVCByZXN1bHQsIHRtcDsKCiAgIF9fYXNtX18gKCJzcmwgICVbdG1wXSwgJVtkZW51bV0sIDE1XG4iCiAgICAgICAgICAgICJkaXYgJVtyZXN1bHRdLCAlW251bV0sICVbdG1wXVxuIgogICAgICAgICAgICA6IFt0bXBdICIrciIgKHRtcCksIFtyZXN1bHRdIj1yIihyZXN1bHQpCiAgICAgICAgICAgIDogW2RlbnVtXSJyIihkZW51bSksIFtudW1dInIiKG51bSkKICAgICAgICAgICAgOiAiaGkiLCAibG8iKTsKICByZXR1cm4gcmVzdWx0IDw8IChERlJBQ1RfQklUUy0xNik7Cn0KCi8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCiNlbGlmIGRlZmluZWQoU0lNVUxBVEVfTUlQU19ESVYpCgojZGVmaW5lIEZVTkNUSU9OX3NjaHVyX2RpdgppbmxpbmUgRklYUF9EQkwgc2NodXJfZGl2KEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVudW0sIElOVCBjb3VudCkKewogICAgRkRLX0FTU0VSVCAoY291bnQ8PURGUkFDVF9CSVRTLTEpOwogICAgRkRLX0FTU0VSVCAobnVtPj0oRklYUF9EQkwpMCk7CiAgICBGREtfQVNTRVJUIChkZW51bT4oRklYUF9EQkwpMCk7CiAgICBGREtfQVNTRVJUIChudW0gPD0gZGVudW0pOwoKICAgIElOVCB0bXAgPSBkZW51bSA+PiAoY291bnQtMSk7CiAgICBJTlQgcmVzdWx0ID0gMDsKCiAgICB3aGlsZSAobnVtID4gdG1wKQogICAgewogICAgICAgIG51bSAtPSB0bXA7CiAgICAgICAgcmVzdWx0Kys7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdCA8PCAoREZSQUNUX0JJVFMtY291bnQpOwp9CgovKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwojZW5kaWYgLyogdGFyZ2V0IGFyY2hpdGVjdHVyZSBzZWxlY3RvciAqLwoKI2lmICFkZWZpbmVkKEZVTkNUSU9OX3NjaHVyX2RpdikKLyoqCiAqIFxicmllZiBEaXZpZGUgdHdvIEZJWFBfREJMIHZhbHVlcyB3aXRoIGdpdmVuIHByZWNpc2lvbi4KICogXHBhcmFtIG51bSBkaXZpZGVuZAogKiBccGFyYW0gZGVudW0gZGl2aXNvcgogKiBccGFyYW0gY291bnQgYW1vdW50IG9mIHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIHJlc3VsdCAoc3RhcnRpbmcgdG8gdGhlIE1TQikKICogXHJldHVybiBudW0vZGl2aXNvcgogKi8KRklYUF9EQkwgc2NodXJfZGl2KEZJWFBfREJMIG51bSxGSVhQX0RCTCBkZW51bSwgSU5UIGNvdW50KTsKI2VuZGlmCgoKCkZJWFBfREJMIG11bF9kYmxfc2dsX3JuZCAoY29uc3QgRklYUF9EQkwgb3AxLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIG9wMik7CgovKioKICogXGJyaWVmIG11bHRpcGx5IHR3byB2YWx1ZXMgd2l0aCBub3JtYWxpemF0aW9uLCB0aHVzIG1heCBwcmVjaXNpb24uCiAqIEF1dGhvcjogUm9iZXJ0IFdlaWRuZXIKICoKICogXHBhcmFtIGYxIGZpcnN0IGZhY3RvcgogKiBccGFyYW0gZjIgc2Vjb2QgZmFjdG9yCiAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGFuIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCBpcyBzdG9yZWQgaW50bwogKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSBwcm9kdWN0IGYxKmYyCiAqLwpGSVhQX0RCTCBmTXVsdE5vcm0oCiAgICAgICAgRklYUF9EQkwgZjEsCiAgICAgICAgRklYUF9EQkwgZjIsCiAgICAgICAgSU5UICpyZXN1bHRfZQogICAgICAgICk7CgppbmxpbmUgRklYUF9EQkwgZk11bHROb3JtKEZJWFBfREJMIGYxLCBGSVhQX0RCTCBmMikKewogIEZJWFBfREJMIG07CiAgSU5UIGU7CgogIG0gPSBmTXVsdE5vcm0oZjEsIGYyLCAmZSk7CgogIG0gPSBzY2FsZVZhbHVlU2F0dXJhdGUobSwgZSk7CgogIHJldHVybiBtOwp9CgovKioKICogXGJyaWVmIERpdmlkZSAyIEZJWFBfREJMIHZhbHVlcyB3aXRoIG5vcm1hbGl6YXRpb24gb2YgaW5wdXQgdmFsdWVzLgogKiBccGFyYW0gbnVtIG51bWVyYXRvcgogKiBccGFyYW0gZGVudW0gZGVub21pbnRhdG9yCiAqIFxyZXR1cm4gbnVtL2RlbnVtIHdpdGggZXhwb25lbnQgPSAwCiAqLwpGSVhQX0RCTCBmRGl2Tm9ybShGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbm9tLCBJTlQgKnJlc3VsdF9lKTsKCi8qKgogKiBcYnJpZWYgRGl2aWRlIDIgRklYUF9EQkwgdmFsdWVzIHdpdGggbm9ybWFsaXphdGlvbiBvZiBpbnB1dCB2YWx1ZXMuCiAqIFxwYXJhbSBudW0gbnVtZXJhdG9yCiAqIFxwYXJhbSBkZW51bSBkZW5vbWludGF0b3IKICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYW4gSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IGlzIHN0b3JlZCBpbnRvCiAqIFxyZXR1cm4gbnVtL2RlbnVtIHdpdGggZXhwb25lbnQgPSAqcmVzdWx0X2UKICovCkZJWFBfREJMIGZEaXZOb3JtKEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVub20pOwoKLyoqCiAqIFxicmllZiBEaXZpZGUgMiBGSVhQX0RCTCB2YWx1ZXMgd2l0aCBub3JtYWxpemF0aW9uIG9mIGlucHV0IHZhbHVlcy4KICogXHBhcmFtIG51bSBudW1lcmF0b3IKICogXHBhcmFtIGRlbnVtIGRlbm9taW50YXRvcgogKiBccmV0dXJuIG51bS9kZW51bSB3aXRoIGV4cG9uZW50ID0gMAogKi8KRklYUF9EQkwgZkRpdk5vcm1IaWdoUHJlYyhGSVhQX0RCTCBMX251bSwgRklYUF9EQkwgTF9kZW51bSwgSU5UICpyZXN1bHRfZSk7CgovKioKICogXGJyaWVmIENhbGN1bGF0ZSBsb2coYXJndW1lbnQpL2xvZygyKSAobG9nYXJpdGhtIHdpdGggYmFzZSAyKS4gZGVwcmVjYXRlZC4gVXNlIGZMb2cyKCkgaW5zdGVhZC4KICogXHBhcmFtIGFyZyBtYW50aXNzYSBvZiB0aGUgYXJndW1lbnQKICogXHBhcmFtIGFyZ19lIGV4cG9uZW50IG9mIHRoZSBhcmd1bWVudAogKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhbiBJTlQgdG8gc3RvcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQKICogXHJldHVybiB0aGUgbWFudGlzc2Egb2YgdGhlIHJlc3VsdC4KICogXHBhcmFtCiAqLwpGSVhQX0RCTCBDYWxjTG9nMihGSVhQX0RCTCBhcmcsIElOVCBhcmdfZSwgSU5UICpyZXN1bHRfZSk7CgovKioKICogXGJyaWVmIHJldHVybiAyIF4gKGV4cCAqIDJeZXhwX2UpCiAqIFxwYXJhbSBleHBfbSBtYW50aXNzYSBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgogKiBccGFyYW0gZXhwX2UgZXhwb25lbnQgb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYSBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQgaW50bwogKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQKICovCkZJWFBfREJMIGYyUG93KGNvbnN0IEZJWFBfREJMIGV4cF9tLCBjb25zdCBJTlQgZXhwX2UsIElOVCAqcmVzdWx0X2UpOwoKLyoqCiAqIFxicmllZiByZXR1cm4gMiBeIChleHBfbSAqIDJeZXhwX2UpLiBUaGlzIHZlcnNpb24gcmV0dXJucyBvbmx5IHRoZSBtYW50aXNzYSB3aXRoIGltcGxpY2l0IGV4cG9uZW50IG9mIHplcm8uCiAqIFxwYXJhbSBleHBfbSBtYW50aXNzYSBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgogKiBccGFyYW0gZXhwX2UgZXhwb25lbnQgb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CiAqLwpGSVhQX0RCTCBmMlBvdyhjb25zdCBGSVhQX0RCTCBleHBfbSwgY29uc3QgSU5UIGV4cF9lKTsKCi8qKgogKiBcYnJpZWYgcmV0dXJuIHggXiAoZXhwICogMl5leHBfZSksIHdoZXJlIGxvZzIoeCkgPSBiYXNlTGRfbSAqIDJeKGJhc2VMZF9lKS4gVGhpcyBzYXZlcwogKiAgICAgICAgdGhlIG5lZWQgdG8gY29tcHV0ZSBsb2cyKCkgb2YgY29uc3RhbnQgdmFsdWVzICh3aGVuIHggaXMgYSBjb25zdGFudCkuCiAqIFxwYXJhbSBsZHhfbSBtYW50aXNzYSBvZiBsb2cyKCkgb2YgeC4KICogXHBhcmFtIGxkeF9lIGV4cG9uZW50IG9mIGxvZzIoKSBvZiB4LgogKiBccGFyYW0gZXhwX20gbWFudGlzc2Egb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHRoZSBleHBvbmVudCB0byAyLjBmCiAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGEgSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkIGludG8KICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CiAqLwpGSVhQX0RCTCBmTGRQb3coCiAgICAgICAgRklYUF9EQkwgYmFzZUxkX20sCiAgICAgICAgSU5UIGJhc2VMZF9lLAogICAgICAgIEZJWFBfREJMIGV4cF9tLCBJTlQgZXhwX2UsCiAgICAgICAgSU5UICpyZXN1bHRfZQogICAgICAgICk7CgovKioKICogXGJyaWVmIHJldHVybiB4IF4gKGV4cCAqIDJeZXhwX2UpLCB3aGVyZSBsb2cyKHgpID0gYmFzZUxkX20gKiAyXihiYXNlTGRfZSkuIFRoaXMgc2F2ZXMKICogICAgICAgIHRoZSBuZWVkIHRvIGNvbXB1dGUgbG9nMigpIG9mIGNvbnN0YW50IHZhbHVlcyAod2hlbiB4IGlzIGEgY29uc3RhbnQpLiBUaGlzIHZlcnNpb24KICogICAgICAgIGRvZXMgbm90IHJldHVybiBhbiBleHBvbmVudCwgd2hpY2ggaXMgaW1wbGljaXRseSAwLgogKiBccGFyYW0gbGR4X20gbWFudGlzc2Egb2YgbG9nMigpIG9mIHguCiAqIFxwYXJhbSBsZHhfZSBleHBvbmVudCBvZiBsb2cyKCkgb2YgeC4KICogXHBhcmFtIGV4cF9tIG1hbnRpc3NhIG9mIHRoZSBleHBvbmVudCB0byAyLjBmCiAqIFxwYXJhbSBleHBfZSBleHBvbmVudCBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgogKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQKICovCkZJWFBfREJMIGZMZFBvdygKICAgICAgICBGSVhQX0RCTCBiYXNlTGRfbSwgSU5UIGJhc2VMZF9lLAogICAgICAgIEZJWFBfREJMIGV4cF9tLCBJTlQgZXhwX2UKICAgICAgICApOwoKLyoqCiAqIFxicmllZiByZXR1cm4gKGJhc2UgKiAyXmJhc2VfZSkgXiAoZXhwICogMl5leHBfZSkuIFVzZSBmTGRQb3coKSBpbnN0ZWFkIHdoZW5ldmVyIHBvc3NpYmxlLgogKiBccGFyYW0gYmFzZV9tIG1hbnRpc3NhIG9mIHRoZSBiYXNlLgogKiBccGFyYW0gYmFzZV9lIGV4cG9uZW50IG9mIHRoZSBiYXNlLgogKiBccGFyYW0gZXhwX20gbWFudGlzc2Egb2YgcG93ZXIgdG8gYmUgY2FsY3VsYXRlZCBvZiB0aGUgYmFzZS4KICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHBvd2VyIHRvIGJlIGNhbGN1bGF0ZWQgb2YgdGhlIGJhc2UuCiAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGEgSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkIGludG8uCiAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdC4KICovCkZJWFBfREJMIGZQb3coRklYUF9EQkwgYmFzZV9tLCBJTlQgYmFzZV9lLCBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lLCBJTlQgKnJlc3VsdF9lKTsKCi8qKgogKiBcYnJpZWYgcmV0dXJuIChiYXNlICogMl5iYXNlX2UpIF4gTgogKiBccGFyYW0gYmFzZSBtYW50aXNzYSBvZiB0aGUgYmFzZQogKiBccGFyYW0gYmFzZV9lIGV4cG9uZW50IG9mIHRoZSBiYXNlCiAqIFxwYXJhbSBwb3dlciB0byBiZSBjYWxjdWxhdGVkIG9mIHRoZSBiYXNlCiAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGEgSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkIGludG8KICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CiAqLwpGSVhQX0RCTCBmUG93SW50KEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwgSU5UIE4sIElOVCAqcmVzdWx0X2UpOwoKLyoqCiAqIFxicmllZiBjYWxjdWxhdGUgbG9nYXJpdGhtIG9mIGJhc2UgMiBvZiB4X20gKiAyXih4X2UpCiAqIFxwYXJhbSB4X20gbWFudGlzc2Egb2YgdGhlIGlucHV0IHZhbHVlLgogKiBccGFyYW0geF9lIGV4cG9uZW50IG9mIHRoZSBpbnB1dCB2YWx1ZS4KICogXHBhcmFtIHBvaW50ZXIgdG8gYW4gSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IGlzIHJldHVybmVkIGludG8uCiAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdC4KICovCkZJWFBfREJMIGZMb2cyKEZJWFBfREJMIHhfbSwgSU5UIHhfZSwgSU5UICpyZXN1bHRfZSk7CgovKioKICogXGJyaWVmIGNhbGN1bGF0ZSBsb2dhcml0aG0gb2YgYmFzZSAyIG9mIHhfbSAqIDJeKHhfZSkKICogXHBhcmFtIHhfbSBtYW50aXNzYSBvZiB0aGUgaW5wdXQgdmFsdWUuCiAqIFxwYXJhbSB4X2UgZXhwb25lbnQgb2YgdGhlIGlucHV0IHZhbHVlLgogKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQgd2l0aCBpbXBsaWNpdCBleHBvbmVudCBvZiBMRF9EQVRBX1NISUZULgogKi8KRklYUF9EQkwgZkxvZzIoRklYUF9EQkwgeF9tLCBJTlQgeF9lKTsKCi8qKgogKiBcYnJpZWYgQWRkIHdpdGggc2F0dXJhdGlvbiBvZiB0aGUgcmVzdWx0LgogKiBccGFyYW0gYSBmaXJzdCBzdW1tYW5kCiAqIFxwYXJhbSBiIHNlY29uZCBzdW1tYW5kCiAqIFxyZXR1cm4gc2F0dXJhdGVkIHN1bSBvZiBhIGFuZCBiLgogKi8KaW5saW5lIEZJWFBfU0dMIGZBZGRTYXR1cmF0ZShjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX1NHTCBiKQp7CiAgTE9ORyBzdW07CgogIHN1bSA9IChMT05HKShTSE9SVClhICsgKExPTkcpKFNIT1JUKWI7CiAgc3VtID0gZk1heChmTWluKChJTlQpc3VtLCAoSU5UKU1BWFZBTF9TR0wpLCAoSU5UKU1JTlZBTF9TR0wpOwogIHJldHVybiAoRklYUF9TR0wpKFNIT1JUKXN1bTsKfQoKLyoqCiAqIFxicmllZiBBZGQgd2l0aCBzYXR1cmF0aW9uIG9mIHRoZSByZXN1bHQuCiAqIFxwYXJhbSBhIGZpcnN0IHN1bW1hbmQKICogXHBhcmFtIGIgc2Vjb25kIHN1bW1hbmQKICogXHJldHVybiBzYXR1cmF0ZWQgc3VtIG9mIGEgYW5kIGIuCiAqLwppbmxpbmUgRklYUF9EQkwgZkFkZFNhdHVyYXRlKGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpCnsKICBMT05HIHN1bTsKCiAgc3VtID0gKExPTkcpKGE+PjEpICsgKExPTkcpKGI+PjEpOwogIHN1bSA9IGZNYXgoZk1pbigoSU5UKXN1bSwgKElOVCkoTUFYVkFMX0RCTD4+MSkpLCAoSU5UKShNSU5WQUxfREJMPj4xKSk7CiAgcmV0dXJuIChGSVhQX0RCTCkoTE9ORykoc3VtPDwxKTsKfQoKLy8jZGVmaW5lIFRFU1RfUk9VTkRJTkcKCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIGFycmF5IGZvciAxL24sIG49MS4uNTAKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogIGV4dGVybiBjb25zdCBGSVhQX0RCTCBpbnZDb3VudFs1MF07CgogIExOS19TRUNUSU9OX0lOSVRDT0RFCiAgaW5saW5lIHZvaWQgSW5pdEludkludCh2b2lkKSB7fQoKCi8qKgogKiBcYnJpZWYgQ2FsY3VsYXRlIHRoZSB2YWx1ZSBvZiAxL2kgd2hlcmUgaSBpcyBhIGludGVnZXIgdmFsdWUuIEl0IHN1cHBvcnRzCiAqICAgICAgICBpbnB1dCB2YWx1ZXMgZnJvbSAxIHVwdG8gNTAuCiAqIFxwYXJhbSBpbnRWYWx1ZSBJbnRlZ2VyIGlucHV0IHZhbHVlLgogKiBccGFyYW0gRklYUF9EQkwgcmVwcmVzZW50YXRpb24gb2YgMS9pbnRWYWx1ZQogKi8KaW5saW5lIEZJWFBfREJMIEdldEludkludChpbnQgaW50VmFsdWUpCnsKICBGREtfQVNTRVJUKChpbnRWYWx1ZSA+IDApICYmIChpbnRWYWx1ZSA8IDUwKSk7CiAgRkRLX0FTU0VSVChpbnRWYWx1ZTw1MCk7CglyZXR1cm4gaW52Q291bnRbaW50VmFsdWVdOwp9CgoKI2VuZGlmCgo=