Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKICAgRGVzY3JpcHRpb246IGxvbmcvc2hvcnQtYmxvY2sgZGVjb2RpbmcKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgQkxPQ0tfSAojZGVmaW5lIEJMT0NLX0gKCiNpbmNsdWRlICJjb21tb25fZml4LmgiCgojaW5jbHVkZSAiY2hhbm5lbGluZm8uaCIKI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKCi8qIFBOUyAob2YgYmxvY2spICovCnZvaWQgQ1Buc19SZWFkIChDUG5zRGF0YSAqcFBuc0RhdGEsCiAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKICAgICAgICAgICAgICAgIGNvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gKmhjYiwKICAgICAgICAgICAgICAgIFNIT1JUICpwU2NhbGVGYWN0b3IsCiAgICAgICAgICAgICAgICBVQ0hBUiBnbG9iYWxfZ2FpbiwKICAgICAgICAgICAgICAgIGludCBiYW5kLAogICAgICAgICAgICAgICAgaW50IGdyb3VwKTsKCgp2b2lkIENQbnNfQXBwbHkgKGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwKICAgICAgICAgICAgICAgICBjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sCiAgICAgICAgICAgICAgICAgU1BFQ1RSQUxfUFRSIHBTcGVjdHJ1bSwKICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAgICAqcFNwZWNTY2FsZSwKICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAgICAqcFNjYWxlRmFjdG9yLAogICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAogICAgICAgICAgICAgICAgIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoLAogICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFubmVsKTsKCgoKLyogVE5TIChvZiBibG9jaykgKi8KLyohCiAgXGJyaWVmIFJlYWQgdG5zIGRhdGEtcHJlc2VudCBmbGFnIGZyb20gYml0c3RyZWFtCgogIFRoZSBmdW5jdGlvbiByZWFkcyB0aGUgZGF0YS1wcmVzZW50IGZsYWcgZm9yIHRucyBmcm9tCiAgdGhlIGJpdHN0cmVhbS4KCiAgXHJldHVybiAgbm9uZQoqLwp2b2lkIENUbnNfUmVhZERhdGFQcmVzZW50RmxhZyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1Ruc0RhdGEgKnBUbnNEYXRhKTsKCnZvaWQgQ1Ruc19SZWFkRGF0YVByZXNlbnRVc2FjKAogICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKICAgICAgICBDVG5zRGF0YSAqcFRuc0RhdGEwLAogICAgICAgIENUbnNEYXRhICpwVG5zRGF0YTEsCiAgICAgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLAogICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsCiAgICAgICAgY29uc3QgaW50IGZDb21tb25XaW5kb3cKICAgICAgICApOwoKQUFDX0RFQ09ERVJfRVJST1IgQ1Ruc19SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1Ruc0RhdGEgKnBUbnNEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncyk7Cgp2b2lkIENUbnNfQXBwbHkgKCBDVG5zRGF0YSAqUkVTVFJJQ1QgcFRuc0RhdGEsIC8qITwgcG9pbnRlciB0byBhYWMgZGVjb2RlciBpbmZvICovCiAgICAgICAgICAgICAgICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywKICAgICAgICAgICAgICAgICAgU1BFQ1RSQUxfUFRSIHBTcGVjdHJhbENvZWZmaWNpZW50LAogICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGdyYW51bGVMZW5ndGgpOwoKLyogQmxvY2sgKi8KCkxPTkcgQ0Jsb2NrX0dldEVzY2FwZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgY29uc3QgTE9ORyBxKTsKCi8qKgogKiBcYnJpZWYgUmVhZCBzY2FsZSBmYWN0b3IgZGF0YS4gU2VlIGNoYXB0ZXIgNC42LjIuMy4yIG9mIElTTy9JRUMgMTQ0OTYtMy4KICogICAgICAgIFRoZSBTRl9PRkZTRVQgPSAxMDAgdmFsdWUgcmVmZXJlbmNlZCBpbiBjaGFwdGVyIDQuNi4yLjMuMyBpcyBhbHJlYWR5IHN1YnN0cmFjdGVkCiAqICAgICAgICBmcm9tIHRoZSBzY2FsZSBmYWN0b3IgdmFsdWVzLiBBbHNvIGluY2x1ZGVzIFBOUyBkYXRhIHJlYWRpbmcuCiAqIFxwYXJhbSBicyBiaXQgc3RyZWFtIGhhbmRsZSBkYXRhIHNvdXJjZQogKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBjaGFubmVsIGNvbnRleHQgaW5mbyB3ZXJlIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQgaW50by4KICogXHBhcmFtIGZsYWdzIHRoZSBkZWNvZGVyIGZsYWdzLgogKi8KQUFDX0RFQ09ERVJfRVJST1IgQ0Jsb2NrX1JlYWRTY2FsZUZhY3RvckRhdGEoCiAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKICAgICAgICBjb25zdCBVSU5UIGZsYWdzCiAgICAgICAgKTsKCi8qKgogKiBcYnJpZWYgUmVhZCBIdWZmbWFuIGVuY29kZWQgc3BlY3RyYWwgZGF0YS4KICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gY2hhbm5lbCBjb250ZXh0IGluZm8uCiAqIFxwYXJhbSBwU2FtcGxpbmdSYXRlSW5mbyBzYW1wbGluZyByYXRlIGluZm8gKHNmYiBvZmZzZXRzKS4KICogXHBhcmFtIGZsYWdzIHN5bnRheCBmbGFncy4KICovCkFBQ19ERUNPREVSX0VSUk9SICBDQmxvY2tfUmVhZFNwZWN0cmFsRGF0YShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgIGZsYWdzKTsKCgpBQUNfREVDT0RFUl9FUlJPUiBDQmxvY2tfUmVhZFNlY3Rpb25EYXRhKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgZmxhZ3MpOwoKLyoqCiAqIFxicmllZiBmaW5kIGEgY29tbW9uIGV4cG9uZW50IChzaGlmdCBmYWN0b3IpIGZvciBhbGwgc2ZiIGluIGVhY2ggU3BlY3RyYWwgd2luZG93LCBhbmQgc3RvcmUgdGhlbSBpbnRvCiAqICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvOjpzcGVjU2NhbGUuCiAqIFxwYXJhbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvIGNoYW5uZWwgY29udGV4dCBpbmZvLgogKiBccGFyYW0gcFNhbXBsaW5nUmF0ZUluZm8gc2FtcGxpbmcgcmF0ZSBpbmZvIChzZmIgb2Zmc2V0cykuCiAqLwp2b2lkIENCbG9ja19TY2FsZVNwZWN0cmFsRGF0YShDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbyk7CgovKioKICogXGJyaWVmIEFwcGx5IFROUyBhbmQgUE5TIHRvb2xzLgogKi8Kdm9pZCBBcHBseVRvb2xzICggQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1tdLAogICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncywKICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoYW5uZWwgKTsKCi8qKgogKiBcYnJpZWYgVHJhbnNmb3JtIE1EQ1Qgc3BlY3RyYWwgZGF0YSBpbnRvIHRpbWUgZG9tYWluCiAqLwp2b2lkIENCbG9ja19GcmVxdWVuY3lUb1RpbWUoQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNIG91dFNhbXBsZXNbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUIGZyYW1lTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmcmFtZU9rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBXb3JrQnVmZmVyMSk7CgovKioKICogXGJyaWVmIFRyYW5zZm9ybSBkb3VibGUgbGFwcGVkIE1EQ1QgKEFBQy1FTEQpIHNwZWN0cmFsIGRhdGEgaW50byB0aW1lIGRvbWFpbi4KICovCnZvaWQgQ0Jsb2NrX0ZyZXF1ZW5jeVRvVGltZUxvd0RlbGF5KENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gb3V0U2FtcGxlc1tdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCBmcmFtZUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBzdHJpZGUpOwoKQUFDX0RFQ09ERVJfRVJST1IgQ0Jsb2NrX0ludmVyc2VRdWFudGl6ZVNwZWN0cmFsRGF0YShDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbyk7CgovKioKICogXGJyaWVmIENhbGN1bGF0ZSAyXihsc2IvNCkgKiB2YWx1ZV4oNC8zKQogKiBccGFyYW0gcFZhbHVlIHBvaW50ZXIgdG8gcXVhbnRpemVkIHZhbHVlLiBUaGUgaW52ZXJzZSBxdWFudGl6ZWQgcmVzdWx0IGlzIHN0b3JlZCBiYWNrIGhlcmUuCiAqIFxwYXJhbSBsc2IgMiBMU0JzIG9mIHRoZSBzY2FsZSBmYWN0b3IgKHNjYWxlRmFjdG9yICUgNCkgYXBwbGllZCBhcyBwb3dlciAyIGZhY3RvciB0byB0aGUKICogICAgICAgIHJlc3VsdGluZyBpbnZlcnNlIHF1YW50aXplZCB2YWx1ZS4KICogXHJldHVybiB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCAobWFudGlzc2EpIHN0b3JlZCBpbnRvICpwVmFsdWUuCiAqLwpGREtfSU5MSU5FCmludCBFdmFsdWF0ZVBvd2VyNDMgKCBGSVhQX0RCTCAqcFZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgVUlOVCBsc2IgKQp7CiAgRklYUF9EQkwgdmFsdWU7CiAgVUlOVCBmcmVlQml0czsKICBVSU5UIGV4cG9uZW50OwoKICB2YWx1ZSA9ICpwVmFsdWU7CiAgZnJlZUJpdHMgPSBmTm9ybXogKHZhbHVlKSA7CiAgZXhwb25lbnQgPSBERlJBQ1RfQklUUyAtIGZyZWVCaXRzIDsKICBGREtfQVNTRVJUIChleHBvbmVudCA8IDE0KTsKCiAgVUlOVCB4ID0gKCgoaW50KXZhbHVlIDw8IGZyZWVCaXRzKSA+PiAxOSkgOwogIFVJTlQgdGFibGVJbmRleCA9ICh4ICYgMHgwRkZGKSA+PiA0IDsKICBGSVhQX0RCTCBpbnZRVmFsIDsKCiAgeCA9IHggJiAweDBGOwoKICBVSU5UIHIwPShMT05HKUludmVyc2VRdWFudFRhYmxlIFt0YWJsZUluZGV4KzBdOwogIFVJTlQgcjE9KExPTkcpSW52ZXJzZVF1YW50VGFibGUgW3RhYmxlSW5kZXgrMV07CiAgVVNIT1JUIG54PTE2LXg7CiAgVUlOVCB0ZW1wPShyMCkqbngrKHIxKSp4OwogIGludlFWYWwgPSAoRklYUF9EQkwpdGVtcDsKCiAgRkRLX0FTU0VSVChsc2IgPCA0KTsKICAqcFZhbHVlID0gZk11bHREaXYyIChpbnZRVmFsLCBNYW50aXNzYVRhYmxlIFtsc2JdW2V4cG9uZW50XSkgOwoKICAvKiArIDEgY29tcGVuc2F0ZXMgZk11bHREaXYyKCkuICovCiAgcmV0dXJuIEV4cG9uZW50VGFibGUgW2xzYl1bZXhwb25lbnRdICsgMTsKfQoKLyoqCiAqIFxicmllZiBkZXRlcm1pbmUgdGhlIHJlcXVpcmVkIHNoaWZ0IHNjYWxlIGZvciB0aGUgZ2l2ZW4gcXVhbnRpemVkIHZhbHVlIGFuZCBzY2FsZSAoZmFjdG9yICUgNCkgdmFsdWUuCiAqLwpGREtfSU5MSU5FIGludCBHZXRTY2FsZUZyb21WYWx1ZSAoRklYUF9EQkwgdmFsdWUsIHVuc2lnbmVkIGludCBsc2IpCnsKICBpZiAodmFsdWUhPShGSVhQX0RCTCkwKQogIHsKICAgIGludCBzY2FsZSA9IEV2YWx1YXRlUG93ZXI0MyAoJnZhbHVlLCBsc2IpIDsKICAgIHJldHVybiBDbnRMZWFkaW5nWmVyb3MgKHZhbHVlKSAtIHNjYWxlIC0gMiA7CiAgfQogIGVsc2UKICAgIHJldHVybiAwOyAvKiBSZXR1cm4gemVybywgYmVjYXVzZSBpdHMgdXNlbGVzcyB0byBzY2FsZSBhIHplcm8gdmFsdWUsIHNhdmVzIHdvcmtsb2FkIGFuZCBhdm9pZHMgc2NhbGluZyBvdmVyc2hpZnRzLiAqLwp9CgoKLy8jaWZkZWYgQUFDREVDX0hVRkZNQU5ERUNPREVSX0VOQUJMRQoKLyohCiAgXGJyaWVmIFJlYWQgaHVmZm1hbiBjb2Rld29yZAoKICBUaGUgZnVuY3Rpb24gcmVhZHMgdGhlIGh1ZmZtYW4gY29kZXdvcmQgZnJvbSB0aGUgYml0c3RyZWFtIGFuZAogIHJldHVybnMgdGhlIGluZGV4IHZhbHVlLgoKICBccmV0dXJuICBpbmRleCB2YWx1ZQoqLwppbmxpbmUgaW50IENCbG9ja19EZWNvZGVIdWZmbWFuV29yZCggSEFORExFX0ZES19CSVRTVFJFQU0gYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGJpdHN0cmVhbSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiAqaGNiICkgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGNvZGVib29rIGRlc2NyaXB0aW9uICovCnsKICBVSU5UIHZhbDsKICBVSU5UIGluZGV4ID0gMDsKICBjb25zdCBVU0hPUlQgKCpDb2RlQm9vaykgW0h1ZmZtYW5FbnRyaWVzXSA9IGhjYi0+Q29kZUJvb2s7CgogIHdoaWxlICgxKQogIHsKICAgIHZhbCA9IENvZGVCb29rW2luZGV4XVtGREtyZWFkQml0cyhicyxIdWZmbWFuQml0cyldOyAvKiBFeHBlbnNpdmUgbWVtb3J5IGFjY2VzcyAqLwoKICAgIGlmICgodmFsICYgMSkgPT0gMCkKICAgIHsKICAgICAgaW5kZXggPSB2YWw+PjI7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgZWxzZQogICAgewogICAgICBpZiAodmFsICYgMikKICAgICAgewogICAgICAgIEZES3B1c2hCYWNrQ2FjaGUoYnMsMSk7CiAgICAgIH0KCiAgICAgIHZhbCA+Pj0gMjsKICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICByZXR1cm4gdmFsOwp9CgovLyNlbmRpZiAvKiBBQUNERUNfSFVGRk1BTkRFQ09ERVJfRU5BQkxFICovCgojZW5kaWYgLyogI2lmbmRlZiBCTE9DS19IICovCg==