Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgTG93IFBvd2VyIFByb2ZpbGUgVHJhbnNwb3NlciwgIAogIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSB0cmFuc3Bvc2VyLiBUaGUgbWFpbiBlbnRyeSBwb2ludCBpcyBscHBUcmFuc3Bvc2VyKCkuIFRoZSBmdW5jdGlvbiBnZW5lcmF0ZXMKICBoaWdoIGZyZXF1ZW5jeSBjb250ZW50IGJ5IGNvcHlpbmcgZGF0YSBmcm9tIHRoZSBsb3cgYmFuZCAocHJvdmlkZWQgYnkgY29yZSBjb2RlYykgaW50byB0aGUgaGlnaCBiYW5kLgogIFRoaXMgcHJvY2VzcyBpcyBhbHNvIHJlZmVycmVkIHRvIGFzICJwYXRjaGluZyIuIFRoZSBmdW5jdGlvbiBhbHNvIGltcGxlbWVudHMgc3BlY3RyYWwgd2hpdGVuaW5nIGJ5IG1lYW5zIG9mCiAgaW52ZXJzZSBmaWx0ZXJpbmcgYmFzZWQgb24gTFBDIGNvZWZmaWNpZW50cy4KCiAgVG9nZXRoZXIgd2l0aCB0aGUgUU1GIGZpbHRlcmJhbmsgdGhlIHRyYW5zcG9zZXIgY2FuIGJlIHRlc3RlZCB1c2luZyBhIHN1cHBsaWVkIHRlc3QgcHJvZ3JhbS4gU2VlIG1haW5fYXVkaW8uY3BwIGZvciBkZXRhaWxzLgogIFRoaXMgbW9kdWxlIGRvZXMgdXNlIGZyYWN0aW9uYWwgYXJpdGhtZXRpYyBhbmQgdGhlIGFjY3VyYWN5IG9mIHRoZSBjb21wdXRhdGlvbnMgaGFzIGFuIGltcGFjdCBvbiB0aGUgb3ZlcmFsbCBzb3VuZCBxdWFsaXR5LgogIFRoZSBtb2R1bGUgYWxzbyBuZWVkcyB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgZGlmZmVyZW50IHNjYWxpbmcgb2Ygc3BlY3RyYWwgZGF0YS4KCiAgXHNhIGxwcFRyYW5zcG9zZXIoKSwgbWFpbl9hdWRpby5jcHAsIHNicl9zY2FsZS5oLCBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldwoqLwoKI2lmZGVmIF9fQU5EUk9JRF9fCiNpbmNsdWRlICJsb2cvbG9nLmgiCiNlbmRpZgoKI2luY2x1ZGUgImxwcF90cmFuLmgiCgojaW5jbHVkZSAic2JyX3JhbS5oIgojaW5jbHVkZSAic2JyX3JvbS5oIgoKI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiNpbmNsdWRlICJhdXRvY29ycjJuZC5oIgoKCgojaWYgZGVmaW5lZChfX2FybV9fKQojaW5jbHVkZSAiYXJtL2xwcF90cmFuX2FybS5jcHAiCiNlbmRpZgoKCgojZGVmaW5lIExQQ19TQ0FMRV9GQUNUT1IgIDIKCgovKiEKICoKICogXGJyaWVmIEdldCBiYW5kd2lkdGggZXhwYW5zaW9uIGZhY3RvciBmcm9tIGZpbHRlcmluZyBsZXZlbAogKgogKiBSZXR1cm5zIGEgZmlsdGVyIHBhcmFtZXRlciAoYmFuZHdpZHRoIGV4cGFuc2lvbiBmYWN0b3IpIGRlcGVuZGluZyBvbgogKiB0aGUgZGVzaXJlZCBmaWx0ZXJpbmcgbGV2ZWwgc2lnbmFsbGVkIGluIHRoZSBiaXRzdHJlYW0uCiAqIFdoZW4gc3dpdGNoaW5nIHRoZSBmaWx0ZXJpbmcgbGV2ZWwgZnJvbSBMT1cgdG8gT0ZGLCBhbiBhZGRpdGlvbmFsCiAqIGxldmVsIGlzIGJlaW5nIGluc2VydGVkIHRvIGFjaGlldmUgYSBzbW9vdGggdHJhbnNpdGlvbi4KICovCgojaWZuZGVmIEZVTkNUSU9OX21hcEludmZNb2RlCnN0YXRpYyBGSVhQX0RCTAptYXBJbnZmTW9kZSAoSU5WRl9NT0RFIG1vZGUsCiAgICAgICAgICAgICBJTlZGX01PREUgcHJldk1vZGUsCiAgICAgICAgICAgICBXSElURU5JTkdfRkFDVE9SUyB3aEZhY3RvcnMpCnsKICBzd2l0Y2ggKG1vZGUpIHsKICBjYXNlIElOVkZfTE9XX0xFVkVMOgogICAgaWYocHJldk1vZGUgPT0gSU5WRl9PRkYpCiAgICAgIHJldHVybiB3aEZhY3RvcnMudHJhbnNpdGlvbkxldmVsOwogICAgZWxzZQogICAgICByZXR1cm4gd2hGYWN0b3JzLmxvd0xldmVsOwoKICBjYXNlIElOVkZfTUlEX0xFVkVMOgogICAgcmV0dXJuIHdoRmFjdG9ycy5taWRMZXZlbDsKCiAgY2FzZSBJTlZGX0hJR0hfTEVWRUw6CiAgICByZXR1cm4gd2hGYWN0b3JzLmhpZ2hMZXZlbDsKCiAgZGVmYXVsdDoKICAgIGlmKHByZXZNb2RlID09IElOVkZfTE9XX0xFVkVMKQogICAgICByZXR1cm4gd2hGYWN0b3JzLnRyYW5zaXRpb25MZXZlbDsKICAgIGVsc2UKICAgICAgcmV0dXJuIHdoRmFjdG9ycy5vZmY7CiAgfQp9CiNlbmRpZiAvKiAjaWZuZGVmIEZVTkNUSU9OX21hcEludmZNb2RlICovCgovKiEKICoKICogXGJyaWVmIFBlcmZvcm0gaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWwgZW1waGFzaXMKICoKICogUmV0cmlldmUgYmFuZHdpZHRoIGV4cGFuc2lvbiBmYWN0b3IgYW5kIGFwcGx5IHNtb290aGluZyBmb3IgZWFjaCBmaWx0ZXIgYmFuZAogKgogKi8KCiNpZm5kZWYgRlVOQ1RJT05faW52ZXJzZUZpbHRlcmluZ0xldmVsRW1waGFzaXMKc3RhdGljIHZvaWQKaW52ZXJzZUZpbHRlcmluZ0xldmVsRW1waGFzaXMoSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLC8qITwgSGFuZGxlIG9mIGxwcCB0cmFuc3Bvc2VyICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBuSW52ZkJhbmRzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZSwgICAgICAvKiE8IEN1cnJlbnQgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlX3ByZXYsIC8qITwgUHJldmlvdXMgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiBid1ZlY3RvciAgICAgICAgICAgIC8qITwgUmVzdWx0aW5nIGZpbHRlcmluZyBsZXZlbHMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgZm9yKGludCBpID0gMDsgaSA8IG5JbnZmQmFuZHM7IGkrKykgewogICAgRklYUF9EQkwgYWNjdTsKICAgIEZJWFBfREJMIGJ3VG1wID0gbWFwSW52Zk1vZGUgKHNicl9pbnZmX21vZGVbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJfaW52Zl9tb2RlX3ByZXZbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTHBwVHJhbnMtPnBTZXR0aW5ncy0+d2hGYWN0b3JzKTsKCiAgICBpZihid1RtcCA8IGhMcHBUcmFucy0+YndWZWN0b3JPbGRbaV0pIHsKICAgICAgYWNjdSA9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjc1ZiksYndUbXApICsKICAgICAgICAgICAgIGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjI1ZiksaExwcFRyYW5zLT5id1ZlY3Rvck9sZFtpXSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgYWNjdSA9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjkwNjI1ZiksYndUbXApICsKICAgICAgICAgICAgIGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjA5Mzc1ZiksaExwcFRyYW5zLT5id1ZlY3Rvck9sZFtpXSk7CiAgICB9CgogICAgaWYgKGFjY3UgPCAgRkwyRlhDT05TVF9EQkwoMC4wMTU2MjVmKT4+MSkKICAgICAgYndWZWN0b3JbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgIGVsc2UKICAgICAgYndWZWN0b3JbaV0gPSBmaXhNaW4oYWNjdTw8MSxGTDJGWENPTlNUX0RCTCgwLjk5NjA5Mzc1ZikpOwogIH0KfQojZW5kaWYgLyogI2lmbmRlZiBGVU5DVElPTl9pbnZlcnNlRmlsdGVyaW5nTGV2ZWxFbXBoYXNpcyAqLwoKLyogUmVzdWx0aW5nIGF1dG9jb3JyZWxhdGlvbiBkZXRlcm1pbmFudCBleHBvbmVudCAqLwojZGVmaW5lIEFDREVUX0VYUCAoMiooREZSQUNUX0JJVFMrc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlKzEwLWFjLmRldF9zY2FsZSkpCiNkZWZpbmUgQUNfRVhQICgtc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlK0xQQ19TQ0FMRV9GQUNUT1IpCiNkZWZpbmUgQUxQSEFfRVhQICgtc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlK0xQQ19TQ0FMRV9GQUNUT1IrMSkKLyogUmVzdWx0aW5nIHRyYW5zcG9zZWQgUU1GIHZhbHVlcyBleHBvbmVudCAxNiBiaXQgbm9ybWFsaXplZCBzYW1wbGViaXRzIGFzc3VtZWQuICovCiNkZWZpbmUgUU1GT1VUX0VYUCAoKFNBTVBMRV9CSVRTLTE1KS1zYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUpCgovKiEKICoKICogXGJyaWVmIFBlcmZvcm0gdHJhbnNwb3NpdGlvbiBieSBwYXRjaGluZyBvZiBzdWJiYW5kIHNhbXBsZXMuCiAqIFRoaXMgZnVuY3Rpb24gc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50IGludG8gdGhlIG1vZHVsZS4gVGhlIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIGFyZWFzIGZvciB0aGUKICogcGF0Y2hpbmcgcHJvY2VzcyAodGhlc2UgYXJlIHRoZSBzb3VyY2UgcmFuZ2UgYXMgd2VsbCBhcyB0aGUgdGFyZ2V0IHJhbmdlKSBhbmQgaW1wbGVtZW50cyBzcGVjdHJhbCB3aGl0ZW5pbmcKICogYnkgbWVhbnMgb2YgaW52ZXJzZSBmaWx0ZXJpbmcuIFRoZSBmdW5jdGlvbiBhdXRvQ29ycmVsYXRpb24ybmQoKSBpcyBhbiBhdXhpbGlhcnkgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIHRoZQogKiBMUEMgY29lZmZpY2llbnRzIGZvciB0aGUgZmlsdGVyaW5nLiAgVGhlIGFjdHVhbCBjYWxjdWxhdGlvbiBvZiB0aGUgTFBDIGNvZWZmaWNpZW50cyBhbmQgdGhlIGltcGxlbWVudGF0aW9uCiAqIG9mIHRoZSBmaWx0ZXJpbmcgYXJlIGRvbmUgYXMgcGFydCBvZiBscHBUcmFuc3Bvc2VyKCkuCiAqCiAqIE5vdGUgdGhhdCB0aGUgZmlsdGVyaW5nIGlzIGRvbmUgb24gYWxsIGF2YWlsYWJsZSBRTUYgc3Vic2FtcGxlcywgd2hlcmVhcyB0aGUgcGF0Y2hpbmcgaXMgb25seSBkb25lIG9uIHRob3NlIFFNRgogKiBzdWJzYW1wbGVzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBuZXh0IFFNRiBzeW50aGVzaXMuIFRoZSBmaWx0ZXJpbmcgaXMgYWxzbyBpbXBsZW1lbnRlZCBiZWZvcmUgdGhlIHBhdGNoaW5nCiAqIGluY2x1ZGVzIGZ1cnRoZXIgZGVwZW5kZW5jaWVzIG9uIHBhcmFtZXRlcnMgZnJvbSB0aGUgU0JSIGRhdGEuCiAqCiAqLwoKdm9pZCBscHBUcmFuc3Bvc2VyIChIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsICAgIC8qITwgSGFuZGxlIG9mIGxwcCB0cmFuc3Bvc2VyICAqLwogICAgICAgICAgICAgICAgICAgIFFNRl9TQ0FMRV9GQUNUT1IgICpzYnJTY2FsZUZhY3RvciwgLyohPCBTY2FsaW5nIGZhY3RvcnMgKi8KICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZkJ1ZmZlclJlYWwsICAgICAgICAgIC8qITwgUG9pbnRlciB0byBwb2ludGVyIHRvIHJlYWwgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKHNvdXJjZSkgKi8KCiAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRlZ3JlZUFsaWFzLCAgICAgICAgICAgICAvKiE8IFZlY3RvciBmb3IgcmVzdWx0cyBvZiBhbGlhc2luZyBlc3RpbWF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZCdWZmZXJJbWFnLCAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcG9pbnRlciB0byBpbWFnaW5hcnkgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKHNvdXJjZSkgKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdXNlTFAsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVTdGVwLCAgICAgICAgICAgICAgICAvKiE8IFRpbWUgc3RlcCBvZiBlbnZlbG9wZSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmaXJzdFNsb3RPZmZzLCAgICAgICAgICAgLyohPCBTdGFydCBwb3NpdGlvbiBpbiB0aW1lICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxhc3RTbG90T2ZmcywgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBvdmVybGFwLXNsb3RzIGludG8gbmV4dCBmcmFtZSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuSW52ZkJhbmRzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCiAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlLCAgICAgICAgICAvKiE8IEN1cnJlbnQgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUgKnNicl9pbnZmX21vZGVfcHJldiAgICAgIC8qITwgUHJldmlvdXMgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KICAgICAgICAgICAgICAgICAgICApCnsKICBJTlQgICAgYndJbmRleFtNQVhfTlVNX1BBVENIRVNdOwogIEZJWFBfREJMICBid1ZlY3RvcltNQVhfTlVNX1BBVENIRVNdOyAgICAgICAvKiE8IHBvbGUgbW92aW5nIGZhY3RvcnMgKi8KCiAgaW50ICAgIGk7CiAgaW50ICAgIGxvQmFuZCwgc3RhcnQsIHN0b3A7CiAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzID0gaExwcFRyYW5zLT5wU2V0dGluZ3M7CiAgUEFUQ0hfUEFSQU0gKnBhdGNoUGFyYW0gPSBwU2V0dGluZ3MtPnBhdGNoUGFyYW07CiAgaW50ICAgIHBhdGNoOwoKICBGSVhQX1NHTCAgYWxwaGFyW0xQQ19PUkRFUl0sIGEwciwgYTFyOwogIEZJWFBfU0dMICBhbHBoYWlbTFBDX09SREVSXSwgYTBpPTAsIGExaT0wOwogIEZJWFBfU0dMICBidyA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwoKICBpbnQgICAgYXV0b0NvcnJMZW5ndGg7CgogIEZJWFBfREJMIGsxLCBrMV9iZWxvdz0wLCBrMV9iZWxvdzI9MDsKCiAgQUNPUlJfQ09FRlMgYWM7CiAgaW50ICAgIHN0YXJ0U2FtcGxlOwogIGludCAgICBzdG9wU2FtcGxlOwogIGludCAgICBzdG9wU2FtcGxlQ2xlYXI7CgogIGludCBjb21Mb3dCYW5kU2NhbGU7CiAgaW50IG92TG93QmFuZFNoaWZ0OwogIGludCBsb3dCYW5kU2hpZnQ7Ci8qICBpbnQgb3ZIaWdoQmFuZFNoaWZ0OyovCgoKICBhbHBoYWlbMF0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKICBhbHBoYWlbMV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKCgogIHN0YXJ0U2FtcGxlID0gZmlyc3RTbG90T2ZmcyAqIHRpbWVTdGVwOwogIHN0b3BTYW1wbGUgID0gcFNldHRpbmdzLT5uQ29scyArIGxhc3RTbG90T2ZmcyAqIHRpbWVTdGVwOwoKCiAgaW52ZXJzZUZpbHRlcmluZ0xldmVsRW1waGFzaXMoaExwcFRyYW5zLCBuSW52ZkJhbmRzLCBzYnJfaW52Zl9tb2RlLCBzYnJfaW52Zl9tb2RlX3ByZXYsIGJ3VmVjdG9yKTsKCiAgc3RvcFNhbXBsZUNsZWFyID0gc3RvcFNhbXBsZTsKCiAgYXV0b0NvcnJMZW5ndGggPSBwU2V0dGluZ3MtPm5Db2xzICsgcFNldHRpbmdzLT5vdmVybGFwOwoKICBpZiAocFNldHRpbmdzLT5ub09mUGF0Y2hlcyA+IDApIHsKICAgIC8qIFNldCB1cHBlciBzdWJiYW5kcyB0byB6ZXJvOgogICAgICAgVGhpcyBpcyByZXF1aXJlZCBpbiBjYXNlIHRoYXQgdGhlIHBhdGNoZXMgZG8gbm90IGNvdmVyIHRoZSBjb21wbGV0ZSBoaWdoYmFuZAogICAgICAgKGJlY2F1c2UgdGhlIGxhc3QgcGF0Y2ggd291bGQgYmUgdG9vIHNob3J0KS4KICAgICAgIFBvc3NpYmxlIG9wdGltaXphdGlvbjogQ2xlYXJpbmcgYmFuZHMgdXAgdG8gdXNiIHdvdWxkIGJlIHN1ZmZpY2llbnQgaGVyZS4gKi8KICAgIGludCB0YXJnZXRTdG9wQmFuZCA9IHBhdGNoUGFyYW1bcFNldHRpbmdzLT5ub09mUGF0Y2hlcy0xXS50YXJnZXRTdGFydEJhbmQKICAgICAgICAgICAgICAgICAgICsgcGF0Y2hQYXJhbVtwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzLTFdLm51bUJhbmRzSW5QYXRjaDsKCiAgICBpbnQgbWVtU2l6ZSA9ICgoNjQpIC0gdGFyZ2V0U3RvcEJhbmQpICogc2l6ZW9mKEZJWFBfREJMKTsKCiAgICBpZiAoIXVzZUxQKSB7CiAgICAgIGZvciAoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZUNsZWFyOyBpKyspIHsKICAgICAgICBGREttZW1jbGVhcigmcW1mQnVmZmVyUmVhbFtpXVt0YXJnZXRTdG9wQmFuZF0sIG1lbVNpemUpOwogICAgICAgIEZES21lbWNsZWFyKCZxbWZCdWZmZXJJbWFnW2ldW3RhcmdldFN0b3BCYW5kXSwgbWVtU2l6ZSk7CiAgICAgIH0KICAgIH0gZWxzZQogICAgZm9yIChpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlQ2xlYXI7IGkrKykgewogICAgICBGREttZW1jbGVhcigmcW1mQnVmZmVyUmVhbFtpXVt0YXJnZXRTdG9wQmFuZF0sIG1lbVNpemUpOwogICAgfQogIH0KI2lmZGVmIF9fQU5EUk9JRF9fCiAgZWxzZSB7CiAgICAvLyBTYWZldHluZXQgbG9nZ2luZwogICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTIxNjA4NjgiKTsKICB9CiNlbmRpZgoKICAvKiBpbml0IGJ3SW5kZXggZm9yIGVhY2ggcGF0Y2ggKi8KICBGREttZW1jbGVhcihid0luZGV4LCBNQVhfTlVNX1BBVENIRVMqc2l6ZW9mKElOVCkpOwoKICAvKgogICAgQ2FsYyBjb21tb24gbG93IGJhbmQgc2NhbGUgZmFjdG9yCiAgKi8KICBjb21Mb3dCYW5kU2NhbGUgPSBmaXhNaW4oc2JyU2NhbGVGYWN0b3ItPm92X2xiX3NjYWxlLHNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZSk7CgogIG92TG93QmFuZFNoaWZ0ID0gIHNiclNjYWxlRmFjdG9yLT5vdl9sYl9zY2FsZSAtIGNvbUxvd0JhbmRTY2FsZTsKICBsb3dCYW5kU2hpZnQgICA9ICBzYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUgLSBjb21Mb3dCYW5kU2NhbGU7CiAgLyogIG92SGlnaEJhbmRTaGlmdCA9IGZpcnN0U2xvdE9mZnMgPT0gMCA/IG92TG93QmFuZFNoaWZ0OjA7Ki8KCiAgLyogb3V0ZXIgbG9vcCBvdmVyIGJhbmRzIHRvIGRvIGFuYWx5c2lzIG9ubHkgb25jZSBmb3IgZWFjaCBiYW5kICovCgogIGlmICghdXNlTFApIHsKICAgIHN0YXJ0ID0gcFNldHRpbmdzLT5sYlN0YXJ0UGF0Y2hpbmc7CiAgICBzdG9wID0gcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZzsKICB9IGVsc2UKICB7CiAgICBzdGFydCA9IGZpeE1heCgxLCBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZyAtIDIpOwogICAgc3RvcCA9IHBhdGNoUGFyYW1bMF0udGFyZ2V0U3RhcnRCYW5kOwogIH0KCgogIGZvciAoIGxvQmFuZCA9IHN0YXJ0OyBsb0JhbmQgPCAgc3RvcDsgbG9CYW5kKysgKSB7CgogICAgRklYUF9EQkwgIGxvd0JhbmRSZWFsWygoKDEwMjQpLygzMikpKyg2KSkrTFBDX09SREVSXTsKICAgIEZJWFBfREJMICpwbG93QmFuZFJlYWwgPSBsb3dCYW5kUmVhbDsKICAgIEZJWFBfREJMICoqcHFtZkJ1ZmZlclJlYWwgPSBxbWZCdWZmZXJSZWFsOwogICAgRklYUF9EQkwgIGxvd0JhbmRJbWFnWygoKDEwMjQpLygzMikpKyg2KSkrTFBDX09SREVSXTsKICAgIEZJWFBfREJMICpwbG93QmFuZEltYWcgPSBsb3dCYW5kSW1hZzsKICAgIEZJWFBfREJMICoqcHFtZkJ1ZmZlckltYWcgPSBxbWZCdWZmZXJJbWFnOwogICAgaW50IHJlc2V0TFBDQ29lZmZzPTA7CiAgICBpbnQgZHluYW1pY1NjYWxlID0gREZSQUNUX0JJVFMtMS1MUENfU0NBTEVfRkFDVE9SOwogICAgaW50IGFjRGV0U2NhbGUgPSAwOyAvKiBzY2FsaW5nIG9mIGF1dG9jb3JyZWxhdGlvbiBkZXRlcm1pbmFudCAqLwoKICAgIGZvcihpPTA7aTxMUENfT1JERVI7aSsrKXsKICAgICAgKnBsb3dCYW5kUmVhbCsrID0gaExwcFRyYW5zLT5scGNGaWx0ZXJTdGF0ZXNSZWFsW2ldW2xvQmFuZF07CiAgICAgIGlmICghdXNlTFApCiAgICAgICAgKnBsb3dCYW5kSW1hZysrID0gaExwcFRyYW5zLT5scGNGaWx0ZXJTdGF0ZXNJbWFnW2ldW2xvQmFuZF07CiAgICB9CgogICAgLyoKICAgICAgVGFrZSBvbGQgc2xvcGUgbGVuZ3RoIHFtZiBzbG90IHNvdXJjZSB2YWx1ZXMgb3V0IG9mIChvdmVybGFwKXFtZiBidWZmZXIKICAgICovCiAgICBpZiAoIXVzZUxQKSB7CiAgICAgIGZvcihpPTA7aTxwU2V0dGluZ3MtPm5Db2xzK3BTZXR0aW5ncy0+b3ZlcmxhcDtpKyspewogICAgICAgICpwbG93QmFuZFJlYWwrKyA9ICgqcHFtZkJ1ZmZlclJlYWwrKylbbG9CYW5kXTsKICAgICAgICAqcGxvd0JhbmRJbWFnKysgPSAoKnBxbWZCdWZmZXJJbWFnKyspW2xvQmFuZF07CiAgICAgIH0KICAgIH0gZWxzZQogICAgewogICAgICAvKiBwU2V0dGluZ3MtPm92ZXJsYXAgaXMgYWx3YXlzIGV2ZW4gKi8KICAgICAgRkRLX0FTU0VSVCgocFNldHRpbmdzLT5vdmVybGFwICYgMSkgPT0gMCk7CgogICAgICBmb3IoaT0wO2k8KChwU2V0dGluZ3MtPm92ZXJsYXArcFNldHRpbmdzLT5uQ29scyk+PjEpO2krKykgewogICAgICAgICpwbG93QmFuZFJlYWwrKyA9ICgqcHFtZkJ1ZmZlclJlYWwrKylbbG9CYW5kXTsKICAgICAgICAqcGxvd0JhbmRSZWFsKysgPSAoKnBxbWZCdWZmZXJSZWFsKyspW2xvQmFuZF07CiAgICAgIH0KICAgICAgaWYgKHBTZXR0aW5ncy0+bkNvbHMgJiAxKSB7CiAgICAgICAgKnBsb3dCYW5kUmVhbCsrID0gKCpwcW1mQnVmZmVyUmVhbCsrKVtsb0JhbmRdOwogICAgICB9CiAgICB9CgogICAgLyoKICAgICAgRGV0ZXJtaW5lIGR5bmFtaWMgc2NhbGluZyB2YWx1ZS4KICAgICAqLwogICAgZHluYW1pY1NjYWxlID0gZml4TWluKGR5bmFtaWNTY2FsZSwgZ2V0U2NhbGVmYWN0b3IobG93QmFuZFJlYWwsIExQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXApICsgb3ZMb3dCYW5kU2hpZnQpOwogICAgZHluYW1pY1NjYWxlID0gZml4TWluKGR5bmFtaWNTY2FsZSwgZ2V0U2NhbGVmYWN0b3IoJmxvd0JhbmRSZWFsW0xQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXBdLCBwU2V0dGluZ3MtPm5Db2xzKSArIGxvd0JhbmRTaGlmdCk7CiAgICBpZiAoIXVzZUxQKSB7CiAgICAgIGR5bmFtaWNTY2FsZSA9IGZpeE1pbihkeW5hbWljU2NhbGUsIGdldFNjYWxlZmFjdG9yKGxvd0JhbmRJbWFnLCBMUENfT1JERVIrcFNldHRpbmdzLT5vdmVybGFwKSArIG92TG93QmFuZFNoaWZ0KTsKICAgICAgZHluYW1pY1NjYWxlID0gZml4TWluKGR5bmFtaWNTY2FsZSwgZ2V0U2NhbGVmYWN0b3IoJmxvd0JhbmRJbWFnW0xQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXBdLCBwU2V0dGluZ3MtPm5Db2xzKSArIGxvd0JhbmRTaGlmdCk7CiAgICB9CiAgICBkeW5hbWljU2NhbGUgPSBmaXhNYXgoMCwgZHluYW1pY1NjYWxlLTEpOyAvKiBvbmUgYWRkaXRpb25hbCBiaXQgaGVhZHJvb20gdG8gcHJldmVudCAtMS4wICovCgogICAgLyoKICAgICAgU2NhbGUgdGVtcG9yYWwgUU1GIGJ1ZmZlci4KICAgICAqLwogICAgc2NhbGVWYWx1ZXMoJmxvd0JhbmRSZWFsWzBdLCBMUENfT1JERVIrcFNldHRpbmdzLT5vdmVybGFwLCBkeW5hbWljU2NhbGUtb3ZMb3dCYW5kU2hpZnQpOwogICAgc2NhbGVWYWx1ZXMoJmxvd0JhbmRSZWFsW0xQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXBdLCBwU2V0dGluZ3MtPm5Db2xzLCBkeW5hbWljU2NhbGUtbG93QmFuZFNoaWZ0KTsKCiAgICBpZiAoIXVzZUxQKSB7CiAgICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kSW1hZ1swXSwgTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcCwgZHluYW1pY1NjYWxlLW92TG93QmFuZFNoaWZ0KTsKICAgICAgc2NhbGVWYWx1ZXMoJmxvd0JhbmRJbWFnW0xQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXBdLCBwU2V0dGluZ3MtPm5Db2xzLCBkeW5hbWljU2NhbGUtbG93QmFuZFNoaWZ0KTsKICAgIH0KCgogICAgICBpZiAoIXVzZUxQKSB7CiAgICAgICAgYWNEZXRTY2FsZSArPSBhdXRvQ29ycjJuZF9jcGx4KCZhYywgbG93QmFuZFJlYWwrTFBDX09SREVSLCBsb3dCYW5kSW1hZytMUENfT1JERVIsIGF1dG9Db3JyTGVuZ3RoKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBhY0RldFNjYWxlICs9IGF1dG9Db3JyMm5kX3JlYWwoJmFjLCBsb3dCYW5kUmVhbCtMUENfT1JERVIsIGF1dG9Db3JyTGVuZ3RoKTsKICAgICAgfQoKICAgICAgLyogRXhhbWluZSBkeW5hbWljIG9mIGRldGVybWluYW50IGluIGF1dG9jb3JyZWxhdGlvbi4gKi8KICAgICAgYWNEZXRTY2FsZSArPSAyKihjb21Mb3dCYW5kU2NhbGUgKyBkeW5hbWljU2NhbGUpOwogICAgICBhY0RldFNjYWxlICo9IDI7ICAgICAgICAgICAgICAvKiB0d28gdGltZXMgcmVmbGVjdGlvbiBjb2VmZmljZW50IHNjYWxpbmcgKi8KICAgICAgYWNEZXRTY2FsZSArPSBhYy5kZXRfc2NhbGU7ICAgLyogYWMgc2NhbGluZyBvZiBkZXRlcm1pbmFudCAqLwoKICAgICAgLyogSW4gY2FzZSBvZiBkZXRlcm1pbmFudCA8IDEwXi0zOCwgcmVzZXRMUENDb2VmZnM9MSBoYXMgdG8gYmUgZW5mb3JjZWQuICovCiAgICAgIGlmIChhY0RldFNjYWxlPjEyNiApIHsKICAgICAgICByZXNldExQQ0NvZWZmcyA9IDE7CiAgICAgIH0KCgogICAgYWxwaGFyWzFdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CiAgICBpZiAoIXVzZUxQKQogICAgICBhbHBoYWlbMV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKCiAgICBpZiAoYWMuZGV0ICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgIEZJWFBfREJMIHRtcCxhYnNUbXAsYWJzRGV0OwoKICAgICAgYWJzRGV0ID0gZml4cF9hYnMoYWMuZGV0KTsKCiAgICAgIGlmICghdXNlTFApIHsKICAgICAgICB0bXAgPSAoIGZNdWx0RGl2MihhYy5yMDFyLGFjLnIxMnIpID4+IChMUENfU0NBTEVfRkFDVE9SLTEpICkgLQogICAgICAgICAgICAgICggKGZNdWx0RGl2MihhYy5yMDFpLGFjLnIxMmkpICsgZk11bHREaXYyKGFjLnIwMnIsYWMucjExcikpID4+IChMUENfU0NBTEVfRkFDVE9SLTEpICk7CiAgICAgIH0gZWxzZQogICAgICB7CiAgICAgICAgdG1wID0gKCBmTXVsdERpdjIoYWMucjAxcixhYy5yMTJyKSA+PiAoTFBDX1NDQUxFX0ZBQ1RPUi0xKSApIC0KICAgICAgICAgICAgICAoIGZNdWx0RGl2MihhYy5yMDJyLGFjLnIxMXIpID4+IChMUENfU0NBTEVfRkFDVE9SLTEpICk7CiAgICAgIH0KICAgICAgYWJzVG1wID0gZml4cF9hYnModG1wKTsKCiAgICAgIC8qCiAgICAgICAgUXVpY2sgY2hlY2s6IGlzIGZpcnN0IGZpbHRlciBjb2VmZiA+PSAxKDQpCiAgICAgICAqLwogICAgICB7CiAgICAgICAgSU5UIHNjYWxlOwogICAgICAgIEZJWFBfREJMIHJlc3VsdCA9IGZEaXZOb3JtKGFic1RtcCwgYWJzRGV0LCAmc2NhbGUpOwogICAgICAgIHNjYWxlID0gc2NhbGUrYWMuZGV0X3NjYWxlOwoKICAgICAgICBpZiAoIChzY2FsZSA+IDApICYmIChyZXN1bHQgPj0gKEZJWFBfREJMKU1BWFZBTF9EQkw+PnNjYWxlKSApIHsKICAgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBhbHBoYXJbMV0gPSBGWF9EQkwyRlhfU0dMKHNjYWxlVmFsdWUocmVzdWx0LHNjYWxlKSk7CiAgICAgICAgICBpZigodG1wPEZMMkZYX0RCTCgwLjBmKSkgXiAoYWMuZGV0PEZMMkZYX0RCTCgwLjBmKSkpIHsKICAgICAgICAgICAgYWxwaGFyWzFdID0gLWFscGhhclsxXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICghdXNlTFApCiAgICAgIHsKICAgICAgICB0bXAgPSAgKCBmTXVsdERpdjIoYWMucjAxaSxhYy5yMTJyKSA+PiAoTFBDX1NDQUxFX0ZBQ1RPUi0xKSApICsKICAgICAgICAgICAgICAgKCAoZk11bHREaXYyKGFjLnIwMXIsYWMucjEyaSkgLSAoRklYUF9EQkwpZk11bHREaXYyKGFjLnIwMmksYWMucjExcikpID4+IChMUENfU0NBTEVfRkFDVE9SLTEpICkgOwoKICAgICAgICBhYnNUbXAgPSBmaXhwX2Ficyh0bXApOwoKICAgICAgICAvKgogICAgICAgIFF1aWNrIGNoZWNrOiBpcyBzZWNvbmQgZmlsdGVyIGNvZWZmID49IDEoNCkKICAgICAgICAqLwogICAgICAgIHsKICAgICAgICAgIElOVCBzY2FsZTsKICAgICAgICAgIEZJWFBfREJMIHJlc3VsdCA9IGZEaXZOb3JtKGFic1RtcCwgYWJzRGV0LCAmc2NhbGUpOwogICAgICAgICAgc2NhbGUgPSBzY2FsZSthYy5kZXRfc2NhbGU7CgogICAgICAgICAgaWYgKCAoc2NhbGUgPiAwKSAmJiAocmVzdWx0ID49IC8qRkwyRlhDT05TVF9EQkwoMS5mKSovIChGSVhQX0RCTClNQVhWQUxfREJMPj5zY2FsZSkgKSB7CiAgICAgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBhbHBoYWlbMV0gPSBGWF9EQkwyRlhfU0dMKHNjYWxlVmFsdWUocmVzdWx0LHNjYWxlKSk7CiAgICAgICAgICAgIGlmKCh0bXA8RkwyRlhfREJMKDAuMGYpKSBeIChhYy5kZXQ8RkwyRlhfREJMKDAuMGYpKSkgewogICAgICAgICAgICAgIGFscGhhaVsxXSA9IC1hbHBoYWlbMV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBhbHBoYXJbMF0gPSAgRkwyRlhDT05TVF9TR0woMC4wZik7CiAgICBpZiAoIXVzZUxQKQogICAgICBhbHBoYWlbMF0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKCiAgICBpZiAoIGFjLnIxMXIgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7CgogICAgICAvKiBhYy5yMTFyIGlzIGFsd2F5cyA+PTAgKi8KICAgICAgRklYUF9EQkwgdG1wLGFic1RtcDsKCiAgICAgIGlmICghdXNlTFApIHsKICAgICAgICB0bXAgPSAoYWMucjAxcj4+KExQQ19TQ0FMRV9GQUNUT1IrMSkpICsKICAgICAgICAgICAgICAoZk11bHREaXYyKGFscGhhclsxXSxhYy5yMTJyKSArIGZNdWx0RGl2MihhbHBoYWlbMV0sYWMucjEyaSkpOwogICAgICB9IGVsc2UKICAgICAgewogICAgICAgIGlmKGFjLnIwMXI+PUZMMkZYQ09OU1RfREJMKDAuMGYpKQogICAgICAgICAgdG1wID0gKGFjLnIwMXI+PihMUENfU0NBTEVfRkFDVE9SKzEpKSArIGZNdWx0RGl2MihhbHBoYXJbMV0sYWMucjEycik7CiAgICAgICAgZWxzZQogICAgICAgICAgdG1wID0gLSgoLWFjLnIwMXIpPj4oTFBDX1NDQUxFX0ZBQ1RPUisxKSkgKyBmTXVsdERpdjIoYWxwaGFyWzFdLGFjLnIxMnIpOwogICAgICB9CgogICAgICBhYnNUbXAgPSBmaXhwX2Ficyh0bXApOwoKICAgICAgLyoKICAgICAgICBRdWljayBjaGVjazogaXMgZmlyc3QgZmlsdGVyIGNvZWZmID49IDEoNCkKICAgICAgKi8KCiAgICAgIGlmIChhYnNUbXAgPj0gKGFjLnIxMXI+PjEpKSB7CiAgICAgICAgcmVzZXRMUENDb2VmZnM9MTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBJTlQgc2NhbGU7CiAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oYWJzVG1wLCBmaXhwX2FicyhhYy5yMTFyKSwgJnNjYWxlKTsKICAgICAgICBhbHBoYXJbMF0gPSAgRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlKHJlc3VsdCxzY2FsZSsxKSk7CgogICAgICAgIGlmKCh0bXA+RkwyRlhfREJMKDAuMGYpKSBeIChhYy5yMTFyPEZMMkZYX0RCTCgwLjBmKSkpCiAgICAgICAgICBhbHBoYXJbMF0gPSAtYWxwaGFyWzBdOwogICAgICB9CgogICAgICBpZiAoIXVzZUxQKQogICAgICB7CiAgICAgICAgdG1wID0gKGFjLnIwMWk+PihMUENfU0NBTEVfRkFDVE9SKzEpKSArCiAgICAgICAgICAgICAgKGZNdWx0RGl2MihhbHBoYWlbMV0sYWMucjEycikgLSBmTXVsdERpdjIoYWxwaGFyWzFdLGFjLnIxMmkpKTsKCiAgICAgICAgYWJzVG1wID0gZml4cF9hYnModG1wKTsKCiAgICAgICAgLyoKICAgICAgICBRdWljayBjaGVjazogaXMgc2Vjb25kIGZpbHRlciBjb2VmZiA+PSAxKDQpCiAgICAgICAgKi8KICAgICAgICBpZiAoYWJzVG1wID49IChhYy5yMTFyPj4xKSkgewogICAgICAgICAgcmVzZXRMUENDb2VmZnM9MTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBJTlQgc2NhbGU7CiAgICAgICAgICBGSVhQX0RCTCByZXN1bHQgPSBmRGl2Tm9ybShhYnNUbXAsIGZpeHBfYWJzKGFjLnIxMXIpLCAmc2NhbGUpOwogICAgICAgICAgYWxwaGFpWzBdID0gRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlKHJlc3VsdCxzY2FsZSsxKSk7CiAgICAgICAgICBpZigodG1wPkZMMkZYX0RCTCgwLjBmKSkgXiAoYWMucjExcjxGTDJGWF9EQkwoMC4wZikpKQogICAgICAgICAgICBhbHBoYWlbMF0gPSAtYWxwaGFpWzBdOwogICAgICAgIH0KICAgICAgfQogICAgfQoKCiAgICBpZiAoIXVzZUxQKQogICAgewogICAgICAvKiBOb3cgY2hlY2sgdGhlIHF1YWRyYXRpYyBjcml0ZXJpYSAqLwogICAgICBpZiggKGZNdWx0RGl2MihhbHBoYXJbMF0sYWxwaGFyWzBdKSArIGZNdWx0RGl2MihhbHBoYWlbMF0sYWxwaGFpWzBdKSkgPj0gRkwyRlhDT05TVF9EQkwoMC41ZikgKQogICAgICAgIHJlc2V0TFBDQ29lZmZzPTE7CiAgICAgIGlmKCAoZk11bHREaXYyKGFscGhhclsxXSxhbHBoYXJbMV0pICsgZk11bHREaXYyKGFscGhhaVsxXSxhbHBoYWlbMV0pKSA+PSBGTDJGWENPTlNUX0RCTCgwLjVmKSApCiAgICAgICAgcmVzZXRMUENDb2VmZnM9MTsKICAgIH0KCiAgICBpZihyZXNldExQQ0NvZWZmcyl7CiAgICAgIGFscGhhclswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogICAgICBhbHBoYXJbMV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKICAgICAgaWYgKCF1c2VMUCkKICAgICAgewogICAgICAgIGFscGhhaVswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogICAgICAgIGFscGhhaVsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogICAgICB9CiAgICB9CgogICAgaWYgKHVzZUxQKQogICAgewoKICAgICAgLyogQWxpYXNpbmcgZGV0ZWN0aW9uICovCiAgICAgIGlmKGFjLnIxMXI9PUZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgICAgazEgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBpZiAoIGZpeHBfYWJzKGFjLnIwMXIpID49IGZpeHBfYWJzKGFjLnIxMXIpICkgewogICAgICAgICAgaWYgKCBmTXVsdERpdjIoYWMucjAxcixhYy5yMTFyKSA8IEZMMkZYX0RCTCgwLjBmKSkgewogICAgICAgICAgICBrMSA9IChGSVhQX0RCTClNQVhWQUxfREJMIC8qRkwyRlhDT05TVF9TR0woMS4wZikqLzsKICAgICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgLyogU2luY2UgdGhpcyB2YWx1ZSBpcyBzcXVhcmVkIGxhdGVyLCBpdCBtdXN0IG5vdCBldmVyIGJlY29tZSAtMS4wZi4gKi8KICAgICAgICAgICAgazEgPSAoRklYUF9EQkwpKE1JTlZBTF9EQkwrMSkgLypGTDJGWENPTlNUX1NHTCgtMS4wZikqLzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBJTlQgc2NhbGU7CiAgICAgICAgICBGSVhQX0RCTCByZXN1bHQgPSBmRGl2Tm9ybShmaXhwX2FicyhhYy5yMDFyKSwgZml4cF9hYnMoYWMucjExciksICZzY2FsZSk7CiAgICAgICAgICBrMSA9IHNjYWxlVmFsdWUocmVzdWx0LHNjYWxlKTsKCiAgICAgICAgICBpZighKChhYy5yMDFyPEZMMkZYX0RCTCgwLjBmKSkgXiAoYWMucjExcjxGTDJGWF9EQkwoMC4wZikpKSkgewogICAgICAgICAgICBrMSA9IC1rMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYobG9CYW5kID4gMSl7CiAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGdhaW4gc2hvdWxkIGJlIGxvY2tlZCAqLwogICAgICAgIEZJWFBfREJMIGRlZyA9IC8qRkwyRlhDT05TVF9EQkwoMS4wZikqLyAoRklYUF9EQkwpTUFYVkFMX0RCTCAtIGZQb3cyKGsxX2JlbG93KTsKICAgICAgICBkZWdyZWVBbGlhc1tsb0JhbmRdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgaWYgKCgobG9CYW5kICYgMSkgPT0gMCkgJiYgKGsxIDwgRkwyRlhDT05TVF9EQkwoMC4wZikpKXsKICAgICAgICAgIGlmIChrMV9iZWxvdyA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7ICAgICAgICAgLyogMi1DaCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kXSA9IChGSVhQX0RCTClNQVhWQUxfREJMIC8qRkwyRlhDT05TVF9EQkwoMS4wZikqLzsKICAgICAgICAgICAgaWYgKCBrMV9iZWxvdzIgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsgICAgLyogMy1DaCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KICAgICAgICAgICAgICBkZWdyZWVBbGlhc1tsb0JhbmQtMV0gPSBkZWc7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKCBrMV9iZWxvdzIgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsgLyogMy1DaCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kXSAgID0gZGVnOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoKChsb0JhbmQgJiAxKSA9PSAxKSAmJiAoazEgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkpewogICAgICAgICAgaWYgKGsxX2JlbG93ID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsgICAgICAgICAvKiAyLUNIIEFsaWFzaW5nIERldGVjdGlvbiAqLwogICAgICAgICAgICBkZWdyZWVBbGlhc1tsb0JhbmRdID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgLypGTDJGWENPTlNUX0RCTCgxLjBmKSovOwogICAgICAgICAgICBpZiAoIGsxX2JlbG93MiA8IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgeyAgICAvKiAzLUNIIEFsaWFzaW5nIERldGVjdGlvbiAqLwogICAgICAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZC0xXSA9IGRlZzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoIGsxX2JlbG93MiA8IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgeyAvKiAzLUNIIEFsaWFzaW5nIERldGVjdGlvbiAqLwogICAgICAgICAgICBkZWdyZWVBbGlhc1tsb0JhbmRdICAgPSBkZWc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qIHJlbWVtYmVyIGsxIHZhbHVlcyBvZiB0aGUgMiBRTUYgY2hhbm5lbHMgYmVsb3cgdGhlIGN1cnJlbnQgY2hhbm5lbCAqLwogICAgICBrMV9iZWxvdzIgPSBrMV9iZWxvdzsKICAgICAgazFfYmVsb3cgPSBrMTsKICAgIH0KCiAgICBwYXRjaCA9IDA7CgogICAgd2hpbGUgKCBwYXRjaCA8IHBTZXR0aW5ncy0+bm9PZlBhdGNoZXMgKSB7IC8qIGlubmVyIGxvb3Agb3ZlciBldmVyeSBwYXRjaCAqLwoKICAgICAgaW50IGhpQmFuZCA9IGxvQmFuZCArIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldEJhbmRPZmZzOwoKICAgICAgaWYgKCBsb0JhbmQgPCBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdGFydEJhbmQKICAgICAgICAgICB8fCBsb0JhbmQgPj0gcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQKICAgICAgICAgICAvL3x8IGhpQmFuZCA+PSBoTHBwVHJhbnMtPnBTZXR0aW5ncy0+bm9DaGFubmVscwogICAgICAgICAgICkgewogICAgICAgIC8qIExvd2JhbmQgbm90IGluIGN1cnJlbnQgcGF0Y2ggLSBwcm9jZWVkICovCiAgICAgICAgcGF0Y2grKzsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgRkRLX0FTU0VSVCggaGlCYW5kIDwgKDY0KSApOwoKICAgICAgLyogYndJbmRleFtwYXRjaF0gaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIHZhbHVlIGZyb20gcHJldmlvdXMgYmFuZCBpbnNpZGUgdGhpcyBwYXRjaCAqLwogICAgICB3aGlsZSAoaGlCYW5kID49IHBTZXR0aW5ncy0+YndCb3JkZXJzW2J3SW5kZXhbcGF0Y2hdXSAmJiBid0luZGV4W3BhdGNoXSA8IE1BWF9OVU1fUEFUQ0hFUy0xKSB7CiAgICAgICAgYndJbmRleFtwYXRjaF0rKzsKICAgICAgfQoKICAgICAgLyoKICAgICAgICBGaWx0ZXIgU3RlcCAyOiBhZGQgdGhlIGxlZnQgc2xvcGUgd2l0aCB0aGUgY3VycmVudCBmaWx0ZXIgdG8gdGhlIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgIHB1cmUgc291cmNlIHZhbHVlcyBhcmUgYWxyZWFkeSBpbiB0aGVyZQogICAgICAqLwogICAgICBidyA9IEZYX0RCTDJGWF9TR0woYndWZWN0b3JbYndJbmRleFtwYXRjaF1dKTsKCiAgICAgIGEwciA9IEZYX0RCTDJGWF9TR0woZk11bHQoYncsYWxwaGFyWzBdKSk7IC8qIEFwcGx5IGN1cnJlbnQgYmFuZHdpZHRoIGV4cGFuc2lvbiBmYWN0b3IgKi8KCgogICAgICBpZiAoIXVzZUxQKQogICAgICAgIGEwaSA9IEZYX0RCTDJGWF9TR0woZk11bHQoYncsYWxwaGFpWzBdKSk7CiAgICAgIGJ3ID0gIEZYX0RCTDJGWF9TR0woZlBvdzIoYncpKTsKICAgICAgYTFyID0gRlhfREJMMkZYX1NHTChmTXVsdChidyxhbHBoYXJbMV0pKTsKICAgICAgaWYgKCF1c2VMUCkKICAgICAgICBhMWkgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGJ3LGFscGhhaVsxXSkpOwoKCgogICAgICAvKgogICAgICAgIEZpbHRlciBTdGVwIDM6IGluc2VydCB0aGUgbWlkZGxlIHBhcnQgd2hpY2ggd29uJ3QgYmUgd2luZG93ZWQKICAgICAgKi8KCiAgICAgIGlmICggYncgPD0gRkwyRlhDT05TVF9TR0woMC4wZikgKSB7CiAgICAgICAgaWYgKCF1c2VMUCkgewogICAgICAgICAgaW50IGRlc2NhbGUgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwgKExQQ19TQ0FMRV9GQUNUT1IrZHluYW1pY1NjYWxlKSk7CiAgICAgICAgICBmb3IoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrICkgewogICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSBsb3dCYW5kUmVhbFtMUENfT1JERVIraV0+PmRlc2NhbGU7CiAgICAgICAgICAgIHFtZkJ1ZmZlckltYWdbaV1baGlCYW5kXSA9IGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpXT4+ZGVzY2FsZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UKICAgICAgICB7CiAgICAgICAgICBpbnQgZGVzY2FsZSA9IGZpeE1pbihERlJBQ1RfQklUUy0xLCAoTFBDX1NDQUxFX0ZBQ1RPUitkeW5hbWljU2NhbGUpKTsKICAgICAgICAgIGZvcihpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlOyBpKysgKSB7CiAgICAgICAgICAgIHFtZkJ1ZmZlclJlYWxbaV1baGlCYW5kXSA9IGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpXT4+ZGVzY2FsZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSB7ICAvKiBidyA8PSAwICovCgogICAgICAgIGlmICghdXNlTFApIHsKICAgICAgICAgIGludCBkZXNjYWxlID0gZml4TWluKERGUkFDVF9CSVRTLTEsIChMUENfU0NBTEVfRkFDVE9SK2R5bmFtaWNTY2FsZSkpOwojaWZkZWYgRlVOQ1RJT05fTFBQVFJBTlNQT1NFUl9mdW5jMQogICAgICAgICAgbHBwVHJhbnNwb3Nlcl9mdW5jMShsb3dCYW5kUmVhbCtMUENfT1JERVIrc3RhcnRTYW1wbGUsbG93QmFuZEltYWcrTFBDX09SREVSK3N0YXJ0U2FtcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWZCdWZmZXJSZWFsK3N0YXJ0U2FtcGxlLHFtZkJ1ZmZlckltYWcrc3RhcnRTYW1wbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BTYW1wbGUtc3RhcnRTYW1wbGUsIChpbnQpIGhpQmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1NjYWxlLGRlc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEwciwgYTBpLCBhMXIsIGExaSk7CiNlbHNlCiAgICAgICAgICBmb3IoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrICkgewogICAgICAgICAgICBGSVhQX0RCTCBhY2N1MSwgYWNjdTI7CgogICAgICAgICAgICBhY2N1MSA9IChmTXVsdERpdjIoYTByLGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpLTFdKSAtIGZNdWx0RGl2MihhMGksbG93QmFuZEltYWdbTFBDX09SREVSK2ktMV0pICsKICAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGExcixsb3dCYW5kUmVhbFtMUENfT1JERVIraS0yXSkgLSBmTXVsdERpdjIoYTFpLGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpLTJdKSk+PmR5bmFtaWNTY2FsZTsKICAgICAgICAgICAgYWNjdTIgPSAoZk11bHREaXYyKGEwaSxsb3dCYW5kUmVhbFtMUENfT1JERVIraS0xXSkgKyBmTXVsdERpdjIoYTByLGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpLTFdKSArCiAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhMWksbG93QmFuZFJlYWxbTFBDX09SREVSK2ktMl0pICsgZk11bHREaXYyKGExcixsb3dCYW5kSW1hZ1tMUENfT1JERVIraS0yXSkpPj5keW5hbWljU2NhbGU7CgogICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSAobG93QmFuZFJlYWxbTFBDX09SREVSK2ldPj5kZXNjYWxlKSArIChhY2N1MTw8MSk7CiAgICAgICAgICAgIHFtZkJ1ZmZlckltYWdbaV1baGlCYW5kXSA9IChsb3dCYW5kSW1hZ1tMUENfT1JERVIraV0+PmRlc2NhbGUpICsgKGFjY3UyPDwxKTsKICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgfSBlbHNlCiAgICAgICAgewogICAgICAgICAgaW50IGRlc2NhbGUgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwgKExQQ19TQ0FMRV9GQUNUT1IrZHluYW1pY1NjYWxlKSk7CgogICAgICAgICAgRkRLX0FTU0VSVChkeW5hbWljU2NhbGUgPj0gMCk7CiAgICAgICAgICBmb3IoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrICkgewogICAgICAgICAgICBGSVhQX0RCTCBhY2N1MTsKCiAgICAgICAgICAgIGFjY3UxID0gKGZNdWx0RGl2MihhMHIsbG93QmFuZFJlYWxbTFBDX09SREVSK2ktMV0pICsgZk11bHREaXYyKGExcixsb3dCYW5kUmVhbFtMUENfT1JERVIraS0yXSkpPj5keW5hbWljU2NhbGU7CgogICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSAobG93QmFuZFJlYWxbTFBDX09SREVSK2ldPj5kZXNjYWxlKSArIChhY2N1MTw8MSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IC8qIGJ3IDw9IDAgKi8KCiAgICAgIHBhdGNoKys7CgogICAgfSAgLyogaW5uZXIgbG9vcCBvdmVyIHBhdGNoZXMgKi8KCiAgICAgLyoKICAgICAqIHN0b3JlIHRoZSB1bm1vZGlmaWVkIGZpbHRlciBjb2VmZmljaWVudHMgaWYgdGhlcmUgaXMKICAgICAqIGFuIG92ZXJsYXBwaW5nIGVudmVsb3BlCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKICB9ICAvKiBvdXRlciBsb29wIG92ZXIgYmFuZHMgKGxvQmFuZCkgKi8KCiAgaWYgKHVzZUxQKQogIHsKICAgIGZvciAoIGxvQmFuZCA9IHBTZXR0aW5ncy0+bGJTdGFydFBhdGNoaW5nOyBsb0JhbmQgPCAgcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZzsgbG9CYW5kKysgKSB7CiAgICAgIHBhdGNoID0gMDsKICAgICAgd2hpbGUgKCBwYXRjaCA8IHBTZXR0aW5ncy0+bm9PZlBhdGNoZXMgKSB7CgogICAgICAgIFVDSEFSIGhpQmFuZCA9IGxvQmFuZCArIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldEJhbmRPZmZzOwoKICAgICAgICBpZiAoIGxvQmFuZCA8IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZAogICAgICAgICAgfHwgbG9CYW5kID49IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kCiAgICAgICAgICB8fCBoaUJhbmQgPj0gKDY0KSAgICAgICAgICAgICAgLyogSGlnaGJhbmQgb3V0IG9mIHJhbmdlIChiaXRlcnJvcikgKi8KICAgICAgICAgICkgewogICAgICAgICAgLyogTG93YmFuZCBub3QgaW4gY3VycmVudCBwYXRjaCBvciBoaWdoYmFuZCBvdXQgb2YgcmFuZ2UgKG1pZ2h0IGJlIGNhdXNlZCBieSBiaXRlcnJvcnMpLSBwcm9jZWVkICovCiAgICAgICAgICBwYXRjaCsrOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZihoaUJhbmQgIT0gcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0U3RhcnRCYW5kKQogICAgICAgICAgZGVncmVlQWxpYXNbaGlCYW5kXSA9IGRlZ3JlZUFsaWFzW2xvQmFuZF07CgogICAgICAgIHBhdGNoKys7CiAgICAgIH0KICAgIH0vKiBlbmQgIGZvciBsb29wICovCiAgfQoKIGZvciAoaSA9IDA7IGkgPCBuSW52ZkJhbmRzOyBpKysgKSB7CiAgIGhMcHBUcmFucy0+YndWZWN0b3JPbGRbaV0gPSBid1ZlY3RvcltpXTsKIH0KCiAgLyoKICAgIHNldCBoaWdoIGJhbmQgc2NhbGUgZmFjdG9yCiAgKi8KICBzYnJTY2FsZUZhY3Rvci0+aGJfc2NhbGUgPSBjb21Mb3dCYW5kU2NhbGUtKExQQ19TQ0FMRV9GQUNUT1IpOwoKfQoKLyohCiAqCiAqIFxicmllZiBJbml0aWFsaXplIG9uZSBsb3cgcG93ZXIgdHJhbnNwb3NlciBpbnN0YW5jZQogKgogKgogKi8KU0JSX0VSUk9SCmNyZWF0ZUxwcFRyYW5zcG9zZXIgKEhBTkRMRV9TQlJfTFBQX1RSQU5TIGhzLCAvKiE8IEhhbmRsZSBvZiBsb3cgcG93ZXIgdHJhbnNwb3NlciAgKi8KICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzLCAvKiE8IFBvaW50ZXIgdG8gc2V0dGluZ3MgKi8KICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICBoaWdoQmFuZFN0YXJ0U2IsIC8qITwgPyAqLwogICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwgICAgICAgICAvKiE8IE1hc3RlciB0YWJsZSAqLwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtTWFzdGVyLCAgICAgICAvKiE8IFZhbGlkIGVudHJpZXMgaW4gbWFzdGVyIHRhYmxlICovCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB1c2IsICAgICAgICAgICAgIC8qITwgSGlnaGJhbmQgYXJlYSBzdG9wIHN1YmJhbmQgKi8KICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVTbG90cywgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZSBzbG90cyAqLwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbkNvbHMsICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjb2x1bXMgKGNvZGVjIHFtZiBiYW5rKSAqLwogICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqbm9pc2VCYW5kVGFibGUsICAgICAvKiE8IE1hcHBpbmcgb2YgU0JSIG5vaXNlIGJhbmRzIHRvIFFNRiBiYW5kcyAqLwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgIG5vTm9pc2VCYW5kcywgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyAqLwogICAgICAgICAgICAgICAgICAgICBVSU5UICAgZnMsICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsZSBGcmVxdWVuY3kgKi8KICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoYW4sICAgICAgICAgICAgLyohPCBDaGFubmVsIG51bWJlciAqLwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3ZlcmxhcAogICAgICAgICAgICAgICAgICAgICApCnsKICAvKiBGQiBpbnZlcnNlIGZpbHRlcmluZyBzZXR0aW5ncyAqLwogIGhzLT5wU2V0dGluZ3MgPSBwU2V0dGluZ3M7CgogIHBTZXR0aW5ncy0+bkNvbHMgPSBuQ29sczsKICBwU2V0dGluZ3MtPm92ZXJsYXAgPSBvdmVybGFwOwoKICBzd2l0Y2ggKHRpbWVTbG90cykgewoKICBjYXNlIDE1OgogIGNhc2UgMTY6CiAgICBicmVhazsKCiAgZGVmYXVsdDoKICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOyAvKiBVbmltcGxlbWVudGVkICovCiAgfQoKICBpZiAoY2hhbj09MCkgewogICAgLyogSW5pdCBjb21tb24gZGF0YSBvbmx5IG9uY2UgKi8KICAgIGhzLT5wU2V0dGluZ3MtPm5Db2xzID0gbkNvbHM7CgogICAgcmV0dXJuIHJlc2V0THBwVHJhbnNwb3NlciAoaHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoQmFuZFN0YXJ0U2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2tfbWFzdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTWFzdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9pc2VCYW5kVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub05vaXNlQmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcyk7CiAgfQogIHJldHVybiBTQlJERUNfT0s7Cn0KCgpzdGF0aWMgaW50IGZpbmRDbG9zZXN0RW50cnkoVUNIQVIgZ29hbFNiLCBVQ0hBUiAqdl9rX21hc3RlciwgVUNIQVIgbnVtTWFzdGVyLCBVQ0hBUiBkaXJlY3Rpb24pCnsKICBpbnQgaW5kZXg7CgogIGlmKCBnb2FsU2IgPD0gdl9rX21hc3RlclswXSApCiAgICByZXR1cm4gdl9rX21hc3RlclswXTsKCiAgaWYoIGdvYWxTYiA+PSB2X2tfbWFzdGVyW251bU1hc3Rlcl0gKQogICAgcmV0dXJuIHZfa19tYXN0ZXJbbnVtTWFzdGVyXTsKCiAgaWYoZGlyZWN0aW9uKSB7CiAgICBpbmRleCA9IDA7CiAgICB3aGlsZSggdl9rX21hc3RlcltpbmRleF0gPCBnb2FsU2IgKSB7CiAgICAgIGluZGV4Kys7CiAgICB9CiAgfSBlbHNlIHsKICAgIGluZGV4ID0gbnVtTWFzdGVyOwogICAgd2hpbGUoIHZfa19tYXN0ZXJbaW5kZXhdID4gZ29hbFNiICkgewogICAgICBpbmRleC0tOwogICAgfQogIH0KCiAgcmV0dXJuIHZfa19tYXN0ZXJbaW5kZXhdOwp9CgoKLyohCiAqCiAqIFxicmllZiBSZXNldCBtZW1vcnkgZm9yIG9uZSBscHAgdHJhbnNwb3NlciBpbnN0YW5jZQogKgogKiBccmV0dXJuIFNCUkRFQ19PSyBvbiBzdWNjZXNzLCBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHIG9uIGVycm9yCiAqLwpTQlJfRVJST1IKcmVzZXRMcHBUcmFuc3Bvc2VyIChIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsICAvKiE8IEhhbmRsZSBvZiBscHAgdHJhbnNwb3NlciAgKi8KICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgaGlnaEJhbmRTdGFydFNiLCAgICAgICAgICAvKiE8IEhpZ2ggYmFuZCBhcmVhOiBzdGFydCBzdWJiYW5kICovCiAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfa19tYXN0ZXIsICAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgdGFibGUgKi8KICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgbnVtTWFzdGVyLCAgICAgICAgICAgICAgICAvKiE8IFZhbGlkIGVudHJpZXMgaW4gbWFzdGVyIHRhYmxlICovCiAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm5vaXNlQmFuZFRhYmxlLCAgICAgICAgICAgLyohPCBNYXBwaW5nIG9mIFNCUiBub2lzZSBiYW5kcyB0byBRTUYgYmFuZHMgKi8KICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgbm9Ob2lzZUJhbmRzLCAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyAqLwogICAgICAgICAgICAgICAgICAgIFVDSEFSICB1c2IsICAgICAgICAgICAgICAgICAgICAgIC8qITwgSGlnaCBiYW5kIGFyZWE6IHN0b3Agc3ViYmFuZCAqLwogICAgICAgICAgICAgICAgICAgIFVJTlQgICBmcyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU0JSIG91dHB1dCBzYW1wbGluZyBmcmVxdWVuY3kgKi8KICAgICAgICAgICAgICAgICAgICApCnsKICBUUkFOU1BPU0VSX1NFVFRJTkdTICpwU2V0dGluZ3MgPSBoTHBwVHJhbnMtPnBTZXR0aW5nczsKICBQQVRDSF9QQVJBTSAgKnBhdGNoUGFyYW0gPSBwU2V0dGluZ3MtPnBhdGNoUGFyYW07CgogIGludCBpLCBwYXRjaDsKICBpbnQgdGFyZ2V0U3RvcEJhbmQ7CiAgaW50IHNvdXJjZVN0YXJ0QmFuZDsKICBpbnQgcGF0Y2hEaXN0YW5jZTsKICBpbnQgbnVtQmFuZHNJblBhdGNoOwoKICBpbnQgbHNiID0gdl9rX21hc3RlclswXTsgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IHN1YmJhbmQgZXhwcmVzc2VkIGluICJub24tY3JpdGljYWwiIHNhbXBsaW5nIHRlcm1zKi8KICBpbnQgeG92ZXJPZmZzZXQgPSBoaWdoQmFuZFN0YXJ0U2IgLSBsc2I7IC8qIENhbGN1bGF0ZSBkaXN0YW5jZSBpbiBRTUYgYmFuZHMgYmV0d2VlbiBrMCBhbmQga3ggKi8KICBpbnQgc3RhcnRGcmVxSHo7CgogIGludCBkZXNpcmVkQm9yZGVyOwoKICB1c2IgPSBmaXhNaW4odXNiLCB2X2tfbWFzdGVyW251bU1hc3Rlcl0pOyAvKiBBdm9pZCBlbmRsZXNzIGxvb3BzIChjb21wYXJlIHdpdGggZmxvYXQgY29kZSkuICovCgogIC8qCiAgICogUGxhdXNpYmlsaXR5IGNoZWNrCiAgICovCgogIGlmICggbHNiIC0gU0hJRlRfU1RBUlRfU0IgPCA0ICkgewogICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgfQoKCiAgLyoKICAgKiBJbml0aWFsaXplIHRoZSBwYXRjaGluZyBwYXJhbWV0ZXIKICAgKi8KICAvKiBJU08vSUVDIDE0NDk2LTMgKEZpZ3VyZSA0LjQ4KTogZ29hbFNiID0gcm91bmQoIDIuMDQ4ZTYgLyBmcyApICovCiAgZGVzaXJlZEJvcmRlciAgICA9ICgoKDIwNDgwMDAqMikgLyBmcykgKyAxKSA+PiAxOwoKICBkZXNpcmVkQm9yZGVyID0gZmluZENsb3Nlc3RFbnRyeShkZXNpcmVkQm9yZGVyLCB2X2tfbWFzdGVyLCBudW1NYXN0ZXIsIDEpOyAvKiBBZGFwdCByZWdpb24gdG8gbWFzdGVyLXRhYmxlICovCgogIC8qIEZpcnN0IHBhdGNoICovCiAgc291cmNlU3RhcnRCYW5kID0gU0hJRlRfU1RBUlRfU0IgKyB4b3Zlck9mZnNldDsKICB0YXJnZXRTdG9wQmFuZCA9IGxzYiArIHhvdmVyT2Zmc2V0OyAvKiB1cHBlckJhbmQgKi8KCiAgLyogRXZlbiAob2RkKSBudW1iZXJlZCBjaGFubmVsIG11c3QgYmUgcGF0Y2hlZCB0byBldmVuIChvZGQpIG51bWJlcmVkIGNoYW5uZWwgKi8KICBwYXRjaCA9IDA7CiAgd2hpbGUodGFyZ2V0U3RvcEJhbmQgPCB1c2IpIHsKCiAgICAvKiBUb28gbWFueSBwYXRjaGVzPwogICAgICAgQWxsb3cgTUFYX05VTV9QQVRDSEVTKzEgcGF0Y2hlcyBoZXJlLgogICAgICAgd2UgbmVlZCB0byBjaGVjayBsYXRlciBhZ2Fpbiwgc2luY2UgcGF0Y2ggbWlnaHQgYmUgdGhlIGhpZ2hlc3QgcGF0Y2gKICAgICAgIEFORCBjb250YWluIGxlc3MgdGhhbiAzIGJhbmRzID0+IGFjdHVhbCBudW1iZXIgb2YgcGF0Y2hlcyB3aWxsIGJlIHJlZHVjZWQgYnkgMS4KICAgICovCiAgICBpZiAocGF0Y2ggPiBNQVhfTlVNX1BBVENIRVMpIHsKICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgICB9CgogICAgcGF0Y2hQYXJhbVtwYXRjaF0uZ3VhcmRTdGFydEJhbmQgPSB0YXJnZXRTdG9wQmFuZDsKICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldFN0YXJ0QmFuZCA9IHRhcmdldFN0b3BCYW5kOwoKICAgIG51bUJhbmRzSW5QYXRjaCA9IGRlc2lyZWRCb3JkZXIgLSB0YXJnZXRTdG9wQmFuZDsgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBkZXNpcmVkIHJhbmdlIG9mIHRoZSBwYXRjaCAqLwoKICAgIGlmICggbnVtQmFuZHNJblBhdGNoID49IGxzYiAtIHNvdXJjZVN0YXJ0QmFuZCApIHsKICAgICAgLyogRGVzaXJlZCBudW1iZXIgYmFuZHMgYXJlIG5vdCBhdmFpbGFibGUgLT4gcGF0Y2ggd2hvbGUgc291cmNlIHJhbmdlICovCiAgICAgIHBhdGNoRGlzdGFuY2UgICA9IHRhcmdldFN0b3BCYW5kIC0gc291cmNlU3RhcnRCYW5kOyAgICAgICAgLyogR2V0IHRoZSB0YXJnZXRPZmZzZXQgKi8KICAgICAgcGF0Y2hEaXN0YW5jZSAgID0gcGF0Y2hEaXN0YW5jZSAmIH4xOyAgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZGluZyBvZmYgb2RkIG51bWJlcnMgYW5kIG1ha2UgYWxsIGV2ZW4gKi8KICAgICAgbnVtQmFuZHNJblBhdGNoID0gbHNiIC0gKHRhcmdldFN0b3BCYW5kIC0gcGF0Y2hEaXN0YW5jZSk7ICAvKiBVcGRhdGUgbnVtYmVyIG9mIGJhbmRzIHRvIGJlIHBhdGNoZWQgKi8KICAgICAgbnVtQmFuZHNJblBhdGNoID0gZmluZENsb3Nlc3RFbnRyeSh0YXJnZXRTdG9wQmFuZCArIG51bUJhbmRzSW5QYXRjaCwgdl9rX21hc3RlciwgbnVtTWFzdGVyLCAwKSAtCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFN0b3BCYW5kOyAgLyogQWRhcHQgcmVnaW9uIHRvIG1hc3Rlci10YWJsZSAqLwogICAgfQoKICAgIC8qIERlc2lyZWQgbnVtYmVyIGJhbmRzIGFyZSBhdmFpbGFibGUgLT4gZ2V0IHRoZSBtaW5pbWFsIGV2ZW4gcGF0Y2hpbmcgZGlzdGFuY2UgKi8KICAgIHBhdGNoRGlzdGFuY2UgICA9IG51bUJhbmRzSW5QYXRjaCArIHRhcmdldFN0b3BCYW5kIC0gbHNiOyAgLyogR2V0IG1pbmltYWwgZGlzdGFuY2UgKi8KICAgIHBhdGNoRGlzdGFuY2UgICA9IChwYXRjaERpc3RhbmNlICsgMSkgJiB+MTsgICAgICAgICAgICAgICAgLyogUm91bmRpbmcgdXAgb2RkIG51bWJlcnMgYW5kIG1ha2UgYWxsIGV2ZW4gKi8KCiAgICBpZiAobnVtQmFuZHNJblBhdGNoID4gMCkgewogICAgICBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdGFydEJhbmQgPSB0YXJnZXRTdG9wQmFuZCAtIHBhdGNoRGlzdGFuY2U7CiAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldEJhbmRPZmZzICA9IHBhdGNoRGlzdGFuY2U7CiAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaCA9IG51bUJhbmRzSW5QYXRjaDsKICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQgID0gcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kICsgbnVtQmFuZHNJblBhdGNoOwoKICAgICAgdGFyZ2V0U3RvcEJhbmQgKz0gcGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoOwogICAgICBwYXRjaCsrOwogICAgfQoKICAgIC8qIEFsbCBwYXRjaGVzIGJ1dCBmaXJzdCAqLwogICAgc291cmNlU3RhcnRCYW5kID0gU0hJRlRfU1RBUlRfU0I7CgogICAgLyogQ2hlY2sgaWYgd2UgYXJlIGNsb3NlIHRvIGRlc2lyZWRCb3JkZXIgKi8KICAgIGlmKCBkZXNpcmVkQm9yZGVyIC0gdGFyZ2V0U3RvcEJhbmQgPCAzKSAgLyogTVBFRyBkb2MgKi8KICAgIHsKICAgICAgZGVzaXJlZEJvcmRlciA9IHVzYjsKICAgIH0KCiAgfQoKICBwYXRjaC0tOwoKICAvKiBJZiBoaWdoZXN0IHBhdGNoIGNvbnRhaW5zIGxlc3MgdGhhbiB0aHJlZSBzdWJiYW5kOiBza2lwIGl0ICovCiAgaWYgKCAocGF0Y2g+MCkgJiYgKHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaCA8IDMpICkgewogICAgcGF0Y2gtLTsKICAgIHRhcmdldFN0b3BCYW5kID0gcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0U3RhcnRCYW5kICsgcGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoOwogIH0KCiAgLyogbm93IGNoZWNrIGlmIHdlIGRvbid0IGhhdmUgb25lIHRvbyBtYW55ICovCiAgaWYgKHBhdGNoID49IE1BWF9OVU1fUEFUQ0hFUykgewogICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgfQoKICBwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzID0gcGF0Y2ggKyAxOwoKICAvKiBDaGVjayBsb3dlc3QgYW5kIGhpZ2hlc3Qgc291cmNlIHN1YmJhbmQgKi8KICBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZyA9IHRhcmdldFN0b3BCYW5kOwogIHBTZXR0aW5ncy0+bGJTdG9wUGF0Y2hpbmcgID0gMDsKICBmb3IgKCBwYXRjaCA9IDA7IHBhdGNoIDwgcFNldHRpbmdzLT5ub09mUGF0Y2hlczsgcGF0Y2grKyApIHsKICAgIHBTZXR0aW5ncy0+bGJTdGFydFBhdGNoaW5nID0gZml4TWluKCBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZywgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kICk7CiAgICBwU2V0dGluZ3MtPmxiU3RvcFBhdGNoaW5nICA9IGZpeE1heCggcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZywgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQgKTsKICB9CgogIGZvcihpID0gMCA7IGkgPCBub05vaXNlQmFuZHM7IGkrKyl7CiAgICBwU2V0dGluZ3MtPmJ3Qm9yZGVyc1tpXSA9IG5vaXNlQmFuZFRhYmxlW2krMV07CiAgfQogIGZvciAoO2kgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKSB7CiAgICBwU2V0dGluZ3MtPmJ3Qm9yZGVyc1tpXSA9IDI1NTsKICB9CgoKICAvKgogICAqIENob29zZSB3aGl0ZW5pbmcgZmFjdG9ycwogICAqLwoKICBzdGFydEZyZXFIeiA9ICggKGxzYiArIHhvdmVyT2Zmc2V0KSpmcyApID4+IDc7ICAvKiBTaGlmdCBkb2VzIGEgZGl2aXNpb24gYnkgMiooNjQpICovCgogIGZvciggaSA9IDE7IGkgPCBOVU1fV0hGQUNUT1JfVEFCTEVfRU5UUklFUzsgaSsrICkKICB7CiAgICBpZiggc3RhcnRGcmVxSHogPCBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzSW5kZXhbaV0pCiAgICAgIGJyZWFrOwogIH0KICBpLS07CgogIHBTZXR0aW5ncy0+d2hGYWN0b3JzLm9mZiA9IEZES19zYnJEZWNvZGVyX3Nicl93aEZhY3RvcnNUYWJsZVtpXVswXTsKICBwU2V0dGluZ3MtPndoRmFjdG9ycy50cmFuc2l0aW9uTGV2ZWwgPSBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bMV07CiAgcFNldHRpbmdzLT53aEZhY3RvcnMubG93TGV2ZWwgPSBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bMl07CiAgcFNldHRpbmdzLT53aEZhY3RvcnMubWlkTGV2ZWwgPSBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bM107CiAgcFNldHRpbmdzLT53aEZhY3RvcnMuaGlnaExldmVsID0gRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc1RhYmxlW2ldWzRdOwoKICByZXR1cm4gU0JSREVDX09LOwp9Cg==