Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSAiZW52X2VzdC5oIgojaW5jbHVkZSAidHJhbl9kZXQuaCIKCiNpbmNsdWRlICJxbWYuaCIKCiNpbmNsdWRlICJmcmFtX2dlbi5oIgojaW5jbHVkZSAiYml0X3Nici5oIgojaW5jbHVkZSAiY21vbmRhdGEuaCIKI2luY2x1ZGUgInNicl9yYW0uaCIKCgojaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKCiNkZWZpbmUgUVVBTlRfRVJST1JfVEhSRVMgMjAwCiNkZWZpbmUgWV9OUkdfU0NBTEUgNSAvKiBub0NvbHMgPSAzMiAtPiBzaGlmdCg1KSAqLwoKCnN0YXRpYyBjb25zdCBVQ0hBUiBwYW5UYWJsZVsyXVsxMF0gPSB7IHsgMCwgMiwgNCwgNiwgOCwxMiwxNiwyMCwyNH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMCwgMiwgNCwgOCwxMiwgMCwgMCwgMCwgMCB9IH07CnN0YXRpYyBjb25zdCBVQ0hBUiBtYXhJbmRleFsyXSA9IHs5LCA1fTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKCiAgXGJyaWVmICAgICAgQ2FsY3VsYXRlcyBlbmVyZ3kgZm9ybSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydCBvZgogICAgICAgICAgICAgIHRoZSBRTUYgc3Vic2FtcGxlcwoKICBccmV0dXJuICAgICBub25lCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpMTktfU0VDVElPTl9DT0RFX0wxCnN0YXRpYyB2b2lkCkZES3NickVuY19nZXRFbmVyZ3lGcm9tQ3BseFFtZkRhdGEoRklYUF9EQkwgKipSRVNUUklDVCBlbmVyZ3lWYWx1ZXMsLyohPCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIHJlYWxWYWx1ZXMsICAvKiE8IHRoZSByZWFsIHBhcnQgb2YgdGhlIFFNRiBzdWJzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipSRVNUUklDVCBpbWFnVmFsdWVzLCAgLyohPCB0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgdGhlIFFNRiBzdWJzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgbnVtYmVyQmFuZHMsICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgUU1GIGJhbmRzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgbnVtYmVyQ29scywgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgUU1GIHN1YnNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAqcW1mU2NhbGUsICAgICAgICAgICAgICAgICAvKiE8IHNjbGVmYWN0b3Igb2YgUU1GIHN1YnNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAqZW5lcmd5U2NhbGUpICAgICAgICAgICAgICAvKiE8IHNjYWxlZmFjdG9yIG9mIGVuZXJnaWVzICovCnsKICBpbnQgaiwgazsKICBpbnQgc2NhbGU7CiAgRklYUF9EQkwgbWF4X3ZhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwoKICAvKiBHZXQgU2NyYXRjaCBidWZmZXIgKi8KICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQodG1wTnJnLCBGSVhQX0RCTCwgUU1GX0NIQU5ORUxTKlFNRl9NQVhfVElNRV9TTE9UUy8yKTsKCiAgLyogR2V0IG1heCBwb3NzaWJsZSBzY2FsaW5nIG9mIFFNRiBkYXRhICovCiAgc2NhbGUgPSBERlJBQ1RfQklUUzsKICBmb3IgKGs9MDsgazxudW1iZXJDb2xzOyBrKyspIHsKICAgIHNjYWxlID0gZml4TWluKHNjYWxlLCBmaXhNaW4oZ2V0U2NhbGVmYWN0b3IocmVhbFZhbHVlc1trXSwgbnVtYmVyQmFuZHMpLCBnZXRTY2FsZWZhY3RvcihpbWFnVmFsdWVzW2tdLCBudW1iZXJCYW5kcykpKTsKICB9CgogIC8qIFR3ZWFrIHNjYWxpbmcgc3RhYmlsaXR5IGZvciB6ZXJvIHNpZ25hbCB0byBub24temVybyBzaWduYWwgdHJhbnNpdGlvbnMgKi8KICBpZiAoc2NhbGUgPj0gREZSQUNUX0JJVFMtMSkgewogICAgc2NhbGUgPSAoRlJBQ1RfQklUUy0xLSpxbWZTY2FsZSk7CiAgfQogIC8qIHByZXZlbnQgc2NhbGluZyBvZiBRRk0gdmFsdWVzIHRvIC0xLmYgKi8KICBzY2FsZSA9IGZpeE1heCgwLHNjYWxlLTEpOwoKICAvKiBVcGRhdGUgUU1GIHNjYWxlICovCiAgKnFtZlNjYWxlICs9IHNjYWxlOwoKICAvKgogICAgIENhbGN1bGF0ZSBlbmVyZ3kgb2YgZWFjaCB0aW1lIHNsb3QgcGFpciwgbWF4IGVuZXJneQogICAgIGFuZCBzaGlmdCBRTUYgdmFsdWVzIGFzIGZhciBhcyBwb3NzaWJsZSB0byB0aGUgbGVmdC4KICAgKi8KICB7CiAgICBGSVhQX0RCTCAqbnJnVmFsdWVzID0gdG1wTnJnOwogICAgZm9yIChrPTA7IGs8bnVtYmVyQ29sczsgays9MikKICAgIHsKICAgICAgLyogTG9hZCBiYW5kIHZlY3RvciBhZGRyZXNzZXMgb2YgMiBjb25zZWN1dGl2ZSB0aW1lc2xvdHMgKi8KICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHIwID0gcmVhbFZhbHVlc1trXTsKICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIGkwID0gaW1hZ1ZhbHVlc1trXTsKICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHIxID0gcmVhbFZhbHVlc1trKzFdOwogICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgaTEgPSBpbWFnVmFsdWVzW2srMV07CiAgICAgIGZvciAoaj0wOyBqPG51bWJlckJhbmRzOyBqKyspCiAgICAgIHsKICAgICAgICBGSVhQX0RCTCAgZW5lcmd5OwogICAgICAgIEZJWFBfREJMICB0cjAsdHIxLHRpMCx0aTE7CgogICAgICAgIC8qIFJlYWQgUU1GIHZhbHVlcyBvZiAyIHRpbWVzbG90cyAqLwogICAgICAgIHRyMCA9IHIwW2pdOyB0cjEgPSByMVtqXTsgdGkwID0gaTBbal07IHRpMSA9IGkxW2pdOwoKICAgICAgICAvKiBTY2FsZSBRTUYgVmFsdWVzIGFuZCBDYWxjIEVuZXJneSBvZiBib3RoIHRpbWVzbG90cyAqLwogICAgICAgIHRyMCA8PD0gc2NhbGU7CiAgICAgICAgdGkwIDw8PSBzY2FsZTsKICAgICAgICBlbmVyZ3kgPSBmUG93MkFkZERpdjIoZlBvdzJEaXYyKHRyMCksIHRpMCkgPj4gMTsKCiAgICAgICAgdHIxIDw8PSBzY2FsZTsKICAgICAgICB0aTEgPDw9IHNjYWxlOwogICAgICAgIGVuZXJneSArPSBmUG93MkFkZERpdjIoZlBvdzJEaXYyKHRyMSksIHRpMSkgPj4gMTsKCiAgICAgICAgLyogV3JpdGUgdGltZXNsb3QgcGFpciBlbmVyZ3kgdG8gc2NyYXRjaCAqLwogICAgICAgICpucmdWYWx1ZXMrKyA9IGVuZXJneTsKICAgICAgICBtYXhfdmFsID0gZml4TWF4KG1heF92YWwsIGVuZXJneSk7CgogICAgICAgIC8qIFdyaXRlIGJhY2sgc2NhbGVkIFFNRiB2YWx1ZXMgKi8KICAgICAgICByMFtqXSA9IHRyMDsgcjFbal0gPSB0cjE7IGkwW2pdID0gdGkwOyBpMVtqXSA9IHRpMTsKICAgICAgfQogICAgfQogIH0KICAvKiBlbmVyZ3lTY2FsZTogc2NhbGVmYWN0b3IgZW5lcmdpZXMgb2YgY3VycmVudCBmcmFtZSAqLwogICplbmVyZ3lTY2FsZSA9IDIqKCpxbWZTY2FsZSktMTsgICAgICAgLyogaWYgcW1mU2NhbGUgPiAwOiBuciBvZiByaWdodCBzaGlmdHMgb3RoZXJ3aXNlIG5yIG9mIGxlZnQgc2hpZnRzICovCgogIC8qIFNjYWxlIHRpbWVzbG90IHBhaXIgZW5lcmdpZXMgYW5kIHdyaXRlIHRvIG91dHB1dCBidWZmZXIgKi8KICBzY2FsZSA9IENvdW50TGVhZGluZ0JpdHMobWF4X3ZhbCk7CiAgewogIAlGSVhQX0RCTCAqbnJnVmFsdWVzID0gdG1wTnJnOwogICAgZm9yIChrPTA7IGs8bnVtYmVyQ29scz4+MTsgaysrKSB7CiAgICAgIHNjYWxlVmFsdWVzKGVuZXJneVZhbHVlc1trXSwgbnJnVmFsdWVzLCBudW1iZXJCYW5kcywgc2NhbGUpOwogICAgICBucmdWYWx1ZXMgKz0gbnVtYmVyQmFuZHM7CiAgICB9CiAgICAqZW5lcmd5U2NhbGUgKz0gc2NhbGU7CiAgfQoKICAvKiBGcmVlIFNjcmF0Y2ggYnVmZmVyICovCiAgQ19BTExPQ19TQ1JBVENIX0VORCh0bXBOcmcsIEZJWFBfREJMLCBRTUZfQ0hBTk5FTFMqUU1GX01BWF9USU1FX1NMT1RTLzIpOwp9CgpMTktfU0VDVElPTl9DT0RFX0wxCnN0YXRpYyB2b2lkCkZES3NickVuY19nZXRFbmVyZ3lGcm9tQ3BseFFtZkRhdGFGdWxsKEZJWFBfREJMICoqUkVTVFJJQ1QgZW5lcmd5VmFsdWVzLC8qITwgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgcmVhbFZhbHVlcywgIC8qITwgdGhlIHJlYWwgcGFydCBvZiB0aGUgUU1GIHN1YnNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipSRVNUUklDVCBpbWFnVmFsdWVzLCAgLyohPCB0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgdGhlIFFNRiBzdWJzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIG51bWJlckJhbmRzLCAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIFFNRiBiYW5kcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBudW1iZXJDb2xzLCAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBRTUYgc3Vic2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAqcW1mU2NhbGUsICAgICAgICAgICAgICAgICAvKiE8IHNjbGVmYWN0b3Igb2YgUU1GIHN1YnNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgKmVuZXJneVNjYWxlKSAgICAgICAgICAgICAgLyohPCBzY2FsZWZhY3RvciBvZiBlbmVyZ2llcyAqLwp7CiAgaW50IGosIGs7CiAgaW50IHNjYWxlOwogIEZJWFBfREJMIG1heF92YWwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKCiAgLyogR2V0IFNjcmF0Y2ggYnVmZmVyICovCiAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHRtcE5yZywgRklYUF9EQkwsIFFNRl9NQVhfVElNRV9TTE9UUypRTUZfQ0hBTk5FTFMvMik7CgogIEZES19BU1NFUlQobnVtYmVyQmFuZHMgPD0gUU1GX0NIQU5ORUxTKTsKICBGREtfQVNTRVJUKG51bWJlckNvbHMgPD0gUU1GX01BWF9USU1FX1NMT1RTLzIpOwoKICAvKiBHZXQgbWF4IHBvc3NpYmxlIHNjYWxpbmcgb2YgUU1GIGRhdGEgKi8KICBzY2FsZSA9IERGUkFDVF9CSVRTOwogIGZvciAoaz0wOyBrPG51bWJlckNvbHM7IGsrKykgewogICAgc2NhbGUgPSBmaXhNaW4oc2NhbGUsIGZpeE1pbihnZXRTY2FsZWZhY3RvcihyZWFsVmFsdWVzW2tdLCBudW1iZXJCYW5kcyksIGdldFNjYWxlZmFjdG9yKGltYWdWYWx1ZXNba10sIG51bWJlckJhbmRzKSkpOwogIH0KCiAgLyogVHdlYWsgc2NhbGluZyBzdGFiaWxpdHkgZm9yIHplcm8gc2lnbmFsIHRvIG5vbi16ZXJvIHNpZ25hbCB0cmFuc2l0aW9ucyAqLwogIGlmIChzY2FsZSA+PSBERlJBQ1RfQklUUy0xKSB7CiAgICBzY2FsZSA9IChGUkFDVF9CSVRTLTEtKnFtZlNjYWxlKTsKICB9CiAgLyogcHJldmVudCBzY2FsaW5nIG9mIFFGTSB2YWx1ZXMgdG8gLTEuZiAqLwogIHNjYWxlID0gZml4TWF4KDAsc2NhbGUtMSk7CgogIC8qIFVwZGF0ZSBRTUYgc2NhbGUgKi8KICAqcW1mU2NhbGUgKz0gc2NhbGU7CgogIC8qCiAgICAgQ2FsY3VsYXRlIGVuZXJneSBvZiBlYWNoIHRpbWUgc2xvdCBwYWlyLCBtYXggZW5lcmd5CiAgICAgYW5kIHNoaWZ0IFFNRiB2YWx1ZXMgYXMgZmFyIGFzIHBvc3NpYmxlIHRvIHRoZSBsZWZ0LgogICAqLwogIHsKICAgIEZJWFBfREJMICpucmdWYWx1ZXMgPSB0bXBOcmc7CiAgICBmb3IgKGs9MDsgazxudW1iZXJDb2xzOyBrKyspCiAgICB7CiAgICAgIC8qIExvYWQgYmFuZCB2ZWN0b3IgYWRkcmVzc2VzIG9mIDIgY29uc2VjdXRpdmUgdGltZXNsb3RzICovCiAgICAgIEZJWFBfREJMICpSRVNUUklDVCByMCA9IHJlYWxWYWx1ZXNba107CiAgICAgIEZJWFBfREJMICpSRVNUUklDVCBpMCA9IGltYWdWYWx1ZXNba107CiAgICAgIGZvciAoaj0wOyBqPG51bWJlckJhbmRzOyBqKyspCiAgICAgIHsKICAgICAgICBGSVhQX0RCTCAgZW5lcmd5OwogICAgICAgIEZJWFBfREJMICB0cjAsdGkwOwoKICAgICAgICAvKiBSZWFkIFFNRiB2YWx1ZXMgb2YgMiB0aW1lc2xvdHMgKi8KICAgICAgICB0cjAgPSByMFtqXTsgdGkwID0gaTBbal07CgogICAgICAgIC8qIFNjYWxlIFFNRiBWYWx1ZXMgYW5kIENhbGMgRW5lcmd5IG9mIGJvdGggdGltZXNsb3RzICovCiAgICAgICAgdHIwIDw8PSBzY2FsZTsKICAgICAgICB0aTAgPDw9IHNjYWxlOwogICAgICAgIGVuZXJneSA9IGZQb3cyQWRkRGl2MihmUG93MkRpdjIodHIwKSwgdGkwKTsKICAgICAgICAqbnJnVmFsdWVzKysgPSBlbmVyZ3k7CgogICAgICAgIG1heF92YWwgPSBmaXhNYXgobWF4X3ZhbCwgZW5lcmd5KTsKCiAgICAgICAgLyogV3JpdGUgYmFjayBzY2FsZWQgUU1GIHZhbHVlcyAqLwogICAgICAgIHIwW2pdID0gdHIwOyBpMFtqXSA9IHRpMDsKICAgICAgfQogICAgfQogIH0KICAvKiBlbmVyZ3lTY2FsZTogc2NhbGVmYWN0b3IgZW5lcmdpZXMgb2YgY3VycmVudCBmcmFtZSAqLwogICplbmVyZ3lTY2FsZSA9IDIqKCpxbWZTY2FsZSktMTsgICAgICAgLyogaWYgcW1mU2NhbGUgPiAwOiBuciBvZiByaWdodCBzaGlmdHMgb3RoZXJ3aXNlIG5yIG9mIGxlZnQgc2hpZnRzICovCgogIC8qIFNjYWxlIHRpbWVzbG90IHBhaXIgZW5lcmdpZXMgYW5kIHdyaXRlIHRvIG91dHB1dCBidWZmZXIgKi8KICBzY2FsZSA9IENvdW50TGVhZGluZ0JpdHMobWF4X3ZhbCk7CiAgewogIAlGSVhQX0RCTCAqbnJnVmFsdWVzID0gdG1wTnJnOwogICAgZm9yIChrPTA7IGs8bnVtYmVyQ29sczsgaysrKSB7CiAgICAgIHNjYWxlVmFsdWVzKGVuZXJneVZhbHVlc1trXSwgbnJnVmFsdWVzLCBudW1iZXJCYW5kcywgc2NhbGUpOwogICAgICBucmdWYWx1ZXMgKz0gbnVtYmVyQmFuZHM7CiAgICB9CiAgICAqZW5lcmd5U2NhbGUgKz0gc2NhbGU7CiAgfQoKICAvKiBGcmVlIFNjcmF0Y2ggYnVmZmVyICovCiAgQ19BTExPQ19TQ1JBVENIX0VORCh0bXBOcmcsIEZJWFBfREJMLCBRTUZfTUFYX1RJTUVfU0xPVFMqUU1GX0NIQU5ORUxTLzIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKCiAgXGJyaWVmICBRdWFudGlzYXRpb24gb2YgdGhlIHBhbm9yYW1hIHZhbHVlIChiYWxhbmNlKQoKICBccmV0dXJuIHRoZSBxdWFudGl6ZWQgcGFuIHZhbHVlCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UCm1hcFBhbm9yYW1hKElOVCBucmdWYWwsICAgICAvKiEgaW50ZWdlciB2YWx1ZSBvZiB0aGUgZW5lcmd5ICovCiAgICAgICAgICAgIElOVCBhbXBSZXMsICAgICAvKiEgYW1wbGl0dWRlIHJlc29sdXRpb24gWzEuNS8zZEJdICovCiAgICAgICAgICAgIElOVCAqcXVhbnRFcnJvciAvKiEgcXVhbnRpemF0aW9uIGVycm9yIG9mIGVuZXJneSB2YWwqLwogICAgICAgICAgICkKewogIGludCBpOwogIElOVCBtaW5fdmFsLCB2YWw7CiAgVUNIQVIgcGFuSW5kZXg7CiAgSU5UIHNpZ247CgogIHNpZ24gPSBucmdWYWwgPiAwID8gMSA6IC0xOwoKICBucmdWYWwgKj0gc2lnbjsKCiAgbWluX3ZhbCA9IEZES19JTlRfTUFYOwogIHBhbkluZGV4ID0gMDsKICBmb3IgKGkgPSAwOyBpIDwgbWF4SW5kZXhbYW1wUmVzXTsgaSsrKSB7CiAgICB2YWwgPSBmaXhwX2FicyAoKG5yZ1ZhbCAtIChJTlQpcGFuVGFibGVbYW1wUmVzXVtpXSkpOwoKICAgIGlmICh2YWwgPCBtaW5fdmFsKSB7CiAgICAgIG1pbl92YWwgPSB2YWw7CiAgICAgIHBhbkluZGV4ID0gaTsKICAgIH0KICB9CgogICpxdWFudEVycm9yPW1pbl92YWw7CgogIHJldHVybiBwYW5UYWJsZVthbXBSZXNdW21heEluZGV4W2FtcFJlc10tMV0gKyBzaWduICogcGFuVGFibGVbYW1wUmVzXVtwYW5JbmRleF07Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKCiAgXGJyaWVmICBRdWFudGlzYXRpb24gb2YgdGhlIG5vaXNlIGZsb29yIGxldmVscwoKICBccmV0dXJuIHZvaWQKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCnNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oU0NIQVIgICAgKlJFU1RSSUNUIGlOb2lzZUxldmVscywgLyohIHF1YW50aXplZCBub2lzZSBsZXZlbHMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgTm9pc2VMZXZlbHMsICAvKiEgdGhlIG5vaXNlIGxldmVscyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgY291cGxpbmcgICAgICAgICAgICAgICAvKiEgdGhlIGNvdXBsaW5nIGZsYWcgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogIElOVCBpOwogIElOVCB0bXAsIGR1bW15OwoKICAvKiBRdWFudGlzYXRpb24sIHNpbWlsYXIgdG8gc2ZiIHF1YW50Li4uICovCiAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspIHsKICAgIC8qIHRtcCA9IE5vaXNlTGV2ZWxzW2ldID4gKFBGTE9BVCkzMC4wZiA/IDMwOiAoSU5UKSAoTm9pc2VMZXZlbHNbaV0gKyAoUEZMT0FUKTAuNSk7ICovCiAgICAvKiAzMD4+NiA9IDAuNDY4NzUgKi8KICAgIGlmICgoRklYUF9EQkwpTm9pc2VMZXZlbHNbaV0gPiBGTDJGWENPTlNUX0RCTCgwLjQ2ODc1ZikpIHsKICAgICAgdG1wID0gMzA7CiAgICB9CiAgICBlbHNlIHsKICAgICAgLyogdG1wID0gKElOVCkoKEZJWFBfREJMKU5vaXNlTGV2ZWxzW2ldICsgKEZMMkZYQ09OU1RfREJMKDAuNWYpPj4oKi8gLyogRlJBQ1RfQklUUysgKi8gLyogNi0xKSkpOyovCiAgICAgIC8qIHRtcCA9IHRtcCA+PiAoREZSQUNUX0JJVFMtMS02KTsgKi8gLyogY29udmVyc2lvbiB0byBpbnRlZ2VyIGhhcHBlbnMgaGVyZSAqLwogICAgICAvKiByb3VuZGluZyBpcyBkb25lIGJ5IHNoaWZ0aW5nIG9uZSBiaXQgbGVzcyB0aGFuIG5lY2Vzc2FyeSB0byB0aGUgcmlnaHQsIGFkZGluZyAnMScgYW5kIHRoZW4gc2hpZnRpbmcgdGhlIGZpbmFsIGJpdCAqLwogICAgICB0bXAgPSAoKCgoSU5UKU5vaXNlTGV2ZWxzW2ldKT4+KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpICk7IC8qIGNvbnZlcnNpb24gdG8gaW50ZWdlciAqLwoJCQkgaWYgKHRtcCAhPSAwKQoJCQkgICB0bXAgKz0gMTsKICAgIH0KCiAgICBpZiAoY291cGxpbmcpIHsKICAgICAgdG1wID0gdG1wIDwgLTMwID8gLTMwIDogdG1wOwogICAgICB0bXAgPSBtYXBQYW5vcmFtYSAodG1wLDEsJmR1bW15KTsKICAgIH0KICAgIGlOb2lzZUxldmVsc1tpXSA9IHRtcDsKICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIENhbGN1bGF0aW9uIG9mIG5vaXNlIGZsb29yIGZvciBjb3VwbGluZwoKICBccmV0dXJuIHZvaWQKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmNvdXBsZU5vaXNlRmxvb3IoRklYUF9EQkwgKlJFU1RSSUNUIG5vaXNlX2xldmVsX2xlZnQsIC8qISBub2lzZSBsZXZlbCBsZWZ0ICAobW9kaWZpZWQpKi8KICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgbm9pc2VfbGV2ZWxfcmlnaHQgLyohIG5vaXNlIGxldmVsIHJpZ2h0IChtb2RpZmllZCkqLwogICAgICAgICAgICAgICAgKQp7CiAgRklYUF9EQkwgY21wVmFsTGVmdCxjbXBWYWxSaWdodDsKICBJTlQgaTsKICBGSVhQX0RCTCB0ZW1wMSx0ZW1wMjsKCiAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspIHsKCiAgICAvKiBDYWxjdWxhdGlvbiBvZiB0aGUgcG93ZXIgZnVuY3Rpb24gdXNpbmcgbGQ2NDoKICAgICAgIHogID0geF55OwogICAgICAgeicgPSBDYWxjTGQ2NCh6KSA9IHkqQ2FsY0xkNjQoeCkvNjQ7CiAgICAgICB6ICA9IENhbGNJbnZMZDY0KHonKTsKICAgICovCiAgICBjbXBWYWxMZWZ0ICA9IE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIG5vaXNlX2xldmVsX2xlZnRbaV07CiAgICBjbXBWYWxSaWdodCA9IE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIG5vaXNlX2xldmVsX3JpZ2h0W2ldOwoKICAgIGlmIChjbXBWYWxSaWdodCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgIHRlbXAxID0gQ2FsY0ludkxkRGF0YShOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSBub2lzZV9sZXZlbF9yaWdodFtpXSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgdGVtcDEgPSBDYWxjSW52TGREYXRhKE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIG5vaXNlX2xldmVsX3JpZ2h0W2ldKTsKICAgICAgdGVtcDEgPSB0ZW1wMSA8PCAoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZULTEpOyAgLyogSU5UIHRvIGZyYWN0IGNvbnZlcnNpb24gb2YgcmVzdWx0LCBpZiBpbnB1dCBvZiBDYWxjSW52TGREYXRhIGlzIHBvc2l0aXYgKi8KICAgIH0KCiAgICBpZiAoY21wVmFsTGVmdCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgIHRlbXAyID0gQ2FsY0ludkxkRGF0YShOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSBub2lzZV9sZXZlbF9sZWZ0W2ldKTsKICAgIH0KICAgIGVsc2UgewogICAgICB0ZW1wMiA9IENhbGNJbnZMZERhdGEoTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gbm9pc2VfbGV2ZWxfbGVmdFtpXSk7CiAgICAgIHRlbXAyID0gdGVtcDIgPDwgKERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVC0xKTsgIC8qIElOVCB0byBmcmFjdCBjb252ZXJzaW9uIG9mIHJlc3VsdCwgaWYgaW5wdXQgb2YgQ2FsY0ludkxkRGF0YSBpcyBwb3NpdGl2ICovCiAgICB9CgoKICAgIGlmICgoY21wVmFsTGVmdCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAmJiAoY21wVmFsUmlnaHQgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkpIHsKICAgICAgbm9pc2VfbGV2ZWxfbGVmdFtpXSAgPSBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSAoQ2FsY0xkRGF0YSgoKHRlbXAxPj4xKSArICh0ZW1wMj4+MSkpKSk7IC8qIG5vIHNjYWxpbmcgbmVlZGVkISBib3RoIHZhbHVlcyBhcmUgZGZyYWN0ICovCiAgICAgIG5vaXNlX2xldmVsX3JpZ2h0W2ldID0gQ2FsY0xkRGF0YSh0ZW1wMikgLSBDYWxjTGREYXRhKHRlbXAxKTsKICAgIH0KCiAgICBpZiAoKGNtcFZhbExlZnQgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIChjbXBWYWxSaWdodCA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkpIHsKICAgICAgbm9pc2VfbGV2ZWxfbGVmdFtpXSAgPSBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSAoQ2FsY0xkRGF0YSgoKHRlbXAxPj4xKSArICh0ZW1wMj4+MSkpKSArIEZMMkZYQ09OU1RfREJMKDAuMTA5Mzc1ZikpOyAvKiBzY2FsZWQgd2l0aCA3LzY0ICovCiAgICAgIG5vaXNlX2xldmVsX3JpZ2h0W2ldID0gQ2FsY0xkRGF0YSh0ZW1wMikgLSBDYWxjTGREYXRhKHRlbXAxKTsKICAgIH0KCiAgICBpZiAoKGNtcFZhbExlZnQgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIChjbXBWYWxSaWdodCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgewogICAgICBub2lzZV9sZXZlbF9sZWZ0W2ldICA9IE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIChDYWxjTGREYXRhKCgodGVtcDE+Pig3KzEpKSArICh0ZW1wMj4+MSkpKSArIEZMMkZYQ09OU1RfREJMKDAuMTA5Mzc1ZikpOyAvKiBzY2FsZWQgd2l0aCA3LzY0ICovCiAgICAgIG5vaXNlX2xldmVsX3JpZ2h0W2ldID0gKENhbGNMZERhdGEodGVtcDIpICsgRkwyRlhDT05TVF9EQkwoMC4xMDkzNzVmKSkgLSBDYWxjTGREYXRhKHRlbXAxKTsKICAgIH0KCiAgICBpZiAoKGNtcFZhbExlZnQgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYgKGNtcFZhbFJpZ2h0ID49IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgewogICAgICBub2lzZV9sZXZlbF9sZWZ0W2ldICA9IE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIChDYWxjTGREYXRhKCgodGVtcDE+PjEpICsgKHRlbXAyPj4oNysxKSkpKSArIEZMMkZYQ09OU1RfREJMKDAuMTA5Mzc1ZikpOyAvKiBzY2FsZWQgd2l0aCA3LzY0ICovCiAgICAgIG5vaXNlX2xldmVsX3JpZ2h0W2ldID0gQ2FsY0xkRGF0YSh0ZW1wMikgLSAoQ2FsY0xkRGF0YSh0ZW1wMSkgKyBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NWYpKTsgLyogc2NhbGVkIHdpdGggNy82NCAqLwogICAgfQogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCgogIFxicmllZiAgQ2FsY3VsYXRpb24gb2YgZW5lcmd5IHN0YXJ0aW5nIGluIGxvd2VyIGJhbmQgKGxpKSB1cCB0byB1cHBlciBiYW5kICh1aSkKICAgICAgICAgIG92ZXIgc2xvdHMgKHN0YXJ0X3BvcykgdG8gKHN0b3BfcG9zKQoKICBccmV0dXJuIHZvaWQKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBGSVhQX0RCTApnZXRFbnZTZmJFbmVyZ3koSU5UIGxpLCAgICAgICAgICAgICAgLyohIGxvd2VyIGJhbmQgKi8KICAgICAgICAgICAgICAgIElOVCB1aSwgICAgICAgICAgICAgIC8qISB1cHBlciBiYW5kICovCiAgICAgICAgICAgICAgICBJTlQgc3RhcnRfcG9zLCAgICAgICAvKiEgc3RhcnQgc2xvdCAqLwogICAgICAgICAgICAgICAgSU5UIHN0b3BfcG9zLCAgICAgICAgLyohIHN0b3Agc2xvdCAqLwogICAgICAgICAgICAgICAgSU5UIGJvcmRlcl9wb3MsICAgICAgLyohIHNsb3RzIHNjYWxpbmcgYm9yZGVyICovCiAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKllCdWZmZXIsICAvKiEgc2ZiIGVuZXJneSBidWZmZXIgKi8KICAgICAgICAgICAgICAgIElOVCBZQnVmZmVyU3pTaGlmdCwgIC8qISBFbmVyZ3kgYnVmZmVyIGluZGV4IHNjYWxlICovCiAgICAgICAgICAgICAgICBJTlQgc2NhbGVOcmcwLCAgICAgICAvKiEgc2NhbGluZyBvZiBsb3dlciBzbG90cyAqLwogICAgICAgICAgICAgICAgSU5UIHNjYWxlTnJnMSkgICAgICAgLyohIHNjYWxpbmcgb2YgdXBwZXIgc2xvdHMgKi8KewogIC8qIHVzZSBkeW5hbWljIHNjYWxpbmcgZm9yIG91dGVyIGVuZXJneSBsb29wOwogICAgIGVuZXJnaWVzIGFyZSBjcml0aWNhbCBhbmQgZXZlcnkgYml0IGlzIGltcG9ydGFudCAqLwogIGludCBzYzAsIHNjMSwgaywgbDsKCiAgRklYUF9EQkwgbnJnU3VtLCBucmcxLCBucmcyLCBhY2N1MSwgYWNjdTI7CiAgSU5UIGR5blNjYWxlLCBkeW5TY2FsZTEsIGR5blNjYWxlMjsKICBpZih1aS1saT09MCkgZHluU2NhbGUgPSBERlJBQ1RfQklUUy0xOwogIGVsc2UKICBkeW5TY2FsZSA9IENhbGNMZEludCh1aS1saSk+PihERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpOwoKICBzYzAgPSBmaXhNaW4oc2NhbGVOcmcwLFlfTlJHX1NDQUxFKTsgc2MxID0gZml4TWluKHNjYWxlTnJnMSxZX05SR19TQ0FMRSk7CiAgLyogZHluU2NhbGV7MSwyfSBpcyBzZXQgc3VjaCB0aGF0IHRoZSByaWdodCBzaGlmdCBiZWxvdyBpcyBwb3NpdGl2ZSAqLwogIGR5blNjYWxlMSA9IGZpeE1pbigoc2NhbGVOcmcwLXNjMCksZHluU2NhbGUpOwogIGR5blNjYWxlMiA9IGZpeE1pbigoc2NhbGVOcmcxLXNjMSksZHluU2NhbGUpOwogIG5yZ1N1bSA9IGFjY3UxID0gYWNjdTIgPSAoRklYUF9EQkwpMDsKCiAgZm9yIChrID0gbGk7IGsgPCB1aTsgaysrKSB7CiAgICBucmcxID0gbnJnMiA9IChGSVhQX0RCTCkwOwogICAgZm9yIChsID0gc3RhcnRfcG9zOyBsIDwgYm9yZGVyX3BvczsgbCsrKSB7CiAgICAgIG5yZzEgKz0gWUJ1ZmZlcltsPj5ZQnVmZmVyU3pTaGlmdF1ba10gPj4gc2MwOwogICAgfQogICAgZm9yICg7IGwgPCBzdG9wX3BvczsgbCsrKSB7CiAgICAgIG5yZzIgKz0gWUJ1ZmZlcltsPj5ZQnVmZmVyU3pTaGlmdF1ba10gPj4gc2MxOwogICAgfQogICAgYWNjdTEgKz0gKG5yZzE+PmR5blNjYWxlMSk7CiAgICBhY2N1MiArPSAobnJnMj4+ZHluU2NhbGUyKTsKICB9CiAgLyogVGhpcyBzaGlmdCBmYWN0b3IgaXMgYWx3YXlzIHBvc2l0aXZlLiBTZWUgY29tbWVudCBhYm92ZS4gKi8KICBucmdTdW0gKz0gKCBhY2N1MSA+PiBmaXhNaW4oKHNjYWxlTnJnMC1zYzAtZHluU2NhbGUxKSwoREZSQUNUX0JJVFMtMSkpICkKICAgICAgICAgICsgICggYWNjdTIgPj4gZml4TWluKChzY2FsZU5yZzEtc2MxLWR5blNjYWxlMiksKERGUkFDVF9CSVRTLTEpKSApOwoKICByZXR1cm4gbnJnU3VtOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKCiAgXGJyaWVmICBFbmVyZ3kgY29tcGVuc2F0aW9uIGluIG1pc3NpbmcgaGFybW9uaWMgbW9kZQoKICBccmV0dXJuIHZvaWQKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBGSVhQX0RCTAptaExvd2VyaW5nRW5lcmd5KEZJWFBfREJMIG5yZywgSU5UIE0pCnsKICAvKgogICAgIENvbXBlbnNhdGluZyBmb3IgdGhlIGZhY3QgdGhhdCB3ZSBpbiB0aGUgZGVjb2RlciBtYXAgdGhlICJhdmVyYWdlIGVuZXJneSB0byBldmVyeSBRTUYKICAgICBiYW5kLCBhbmQgdXNlIHRoaXMgd2hlbiB3ZSBjYWxjdWxhdGUgdGhlIGJvb3N0LWZhY3Rvci4gU2luY2UgdGhlIG1hcHBlZCBlbmVyZ3kgaXNuJ3QKICAgICB0aGUgYXZlcmFnZSBlbmVyZ3kgYnV0IHRoZSBtYXhpbXVtIGVuZXJneSBpbiBjYXNlIG9mIG1pc3NpbmcgaGFybW9uaWMgY3JlYXRpb24sIHdlIHdpbGwKICAgICBpbiB0aGUgYm9vc3QgZnVuY3Rpb24gY2FsY3VsYXRlIHRoYXQgdG9vIG11Y2ggbGltaXRpbmcgaGFzIGJlZW4gYXBwbGllZCBhbmQgaGVuY2Ugd2Ugd2lsbAogICAgIGJvb3N0IHRoZSBzaWduYWwgYWx0aG91Z2ggaXQgaXNuJ3QgY2FsbGVkIGZvci4gSGVuY2Ugd2UgbmVlZCB0byBjb21wZW5zYXRlIGZvciB0aGlzIGJ5CiAgICAgbG93ZXJpbmcgdGhlIHRyYW5zbWl0dGVkIGVuZXJneSB2YWx1ZXMgZm9yIHRoZSBzaW5lcyBzbyB0aGV5IHdpbGwgZ2V0IHRoZSBjb3JyZWN0IGxldmVsCiAgICAgYWZ0ZXIgdGhlIGJvb3N0IGlzIGFwcGxpZWQuCiAgKi8KICBpZihNID4gMil7CiAgICBJTlQgdG1wU2NhbGU7CiAgICB0bXBTY2FsZSA9IENvdW50TGVhZGluZ0JpdHMobnJnKTsKICAgIG5yZyA8PD0gdG1wU2NhbGU7CiAgICBucmcgPSBmTXVsdChucmcsIEZMMkZYQ09OU1RfREJMKDAuMzk4MTA3MjY3ZikpOyAvKiBUaGUgbWF4aW11bSBib29zdCBpcyAxLjU4NDg5Mywgc28gdGhlIG1heGltdW0gYXR0ZW51YXRpb24gc2hvdWxkIGJlIHNxdWFyZSgxLzEuNTg0ODkzKSA9IDAuMzk4MTA3MjY3ICovCiAgICBucmcgPj49IHRtcFNjYWxlOwogIH0KICBlbHNlewogICAgaWYoTSA+IDEpewogICAgICBucmcgPj49IDE7CiAgICB9CiAgfQoKICByZXR1cm4gbnJnOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKCiAgXGJyaWVmICBFbmVyZ3kgY29tcGVuc2F0aW9uIGluIG5vbmUgbWlzc2luZyBoYXJtb25pYyBtb2RlCgogIFxyZXR1cm4gdm9pZAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEZJWFBfREJMIG5taExvd2VyaW5nRW5lcmd5KAogICAgICAgIEZJWFBfREJMIG5yZywKICAgICAgICBjb25zdCBGSVhQX0RCTCBucmdTdW0sCiAgICAgICAgY29uc3QgSU5UIG5yZ1N1bV9zY2FsZSwKICAgICAgICBjb25zdCBJTlQgTQogICAgICAgICkKewogIGlmIChucmc+RkwyRlhDT05TVF9EQkwoMCkpIHsKICAgIGludCBzYz0wOwogICAgLyogZ2FpbiA9IG5yZ1N1bSAvIChucmcqKE0rMSkpICovCiAgICBGSVhQX0RCTCBnYWluID0gZk11bHQoZkRpdk5vcm0obnJnU3VtLCBucmcsICZzYyksIEdldEludkludChNKzEpKTsKICAgIHNjICs9IG5yZ1N1bV9zY2FsZTsKCiAgICAvKiByZWR1Y2UgbnJnIGlmIGdhaW4gc21hbGxlciAxLmYgKi8KICAgIGlmICggISgoc2M+PTApICYmICggZ2FpbiA+ICgoRklYUF9EQkwpTUFYVkFMX0RCTD4+c2MpICkpICkgewogICAgICBucmcgPSBmTXVsdChzY2FsZVZhbHVlKGdhaW4sc2MpLCBucmcpOwogICAgfQogIH0KICByZXR1cm4gbnJnOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKCiAgXGJyaWVmICBjYWxjdWxhdGVzIHRoZSBlbnZlbG9wZSB2YWx1ZXMgZnJvbSB0aGUgZW5lcmdpZXMsIGRlcGVuZGluZyBvbgogICAgICAgICAgZnJhbWluZyBhbmQgc3RlcmVvIG1vZGUKCiAgXHJldHVybiB2b2lkCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApjYWxjdWxhdGVTYnJFbnZlbG9wZSAoRklYUF9EQkwgKipSRVNUUklDVCBZQnVmZmVyTGVmdCwgIC8qISBlbmVyZ3kgYnVmZmVyIGxlZnQgKi8KICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgWUJ1ZmZlclJpZ2h0LCAvKiEgZW5lcmd5IGJ1ZmZlciByaWdodCAqLwogICAgICAgICAgICAgICAgICAgICAgaW50ICpSRVNUUklDVCBZQnVmZmVyU2NhbGVMZWZ0LCAgIC8qISBzY2FsZSBlbmVyZ3kgYnVmZmVyIGxlZnQgKi8KICAgICAgICAgICAgICAgICAgICAgIGludCAqUkVTVFJJQ1QgWUJ1ZmZlclNjYWxlUmlnaHQsICAvKiEgc2NhbGUgZW5lcmd5IGJ1ZmZlciByaWdodCAqLwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0JSX0ZSQU1FX0lORk8gKmZyYW1lX2luZm8sIC8qISBmcmFtZSBpbmZvIHZlY3RvciAqLwogICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKlJFU1RSSUNUIHNmYl9ucmdMZWZ0LCAgICAgIC8qISBzZmIgZW5lcmd5IGJ1ZmZlciBsZWZ0ICovCiAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqUkVTVFJJQ1Qgc2ZiX25yZ1JpZ2h0LCAgICAgLyohIHNmYiBlbmVyZ3kgYnVmZmVyIHJpZ2h0ICovCiAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NPTkZJR19EQVRBIGhfY29uLCAgICAgLyohIGhhbmRsZSB0byBjb25maWcgZGF0YSAgICovCiAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgaF9zYnIsICAgICAgICAgLyohIGVudmVsb3BlIGNoYW5uZWwgaGFuZGxlICovCiAgICAgICAgICAgICAgICAgICAgICBTQlJfU1RFUkVPX01PREUgc3RlcmVvTW9kZSwgICAgICAgLyohIHN0ZXJlbyBjb2RpbmcgbW9kZSAqLwogICAgICAgICAgICAgICAgICAgICAgSU5UKiBtYXhRdWFudEVycm9yLCAgICAgICAgICAgICAgIC8qISBtYXhpbXVtIHF1YW50aXphdGlvbiBlcnJvciwgZm9yIHBhbm9yYW1hLiAqLwogICAgICAgICAgICAgICAgICAgICAgaW50IFlCdWZmZXJTelNoaWZ0KSAgICAgICAgICAgICAgIC8qISBFbmVyZ3kgYnVmZmVyIGluZGV4IHNjYWxlICovCgp7CiAgaW50IGksIGosIG0gPSAwOwogIElOVCBub19vZl9iYW5kcywgc3RhcnRfcG9zLCBzdG9wX3BvcywgbGksIHVpOwogIEZSRVFfUkVTIGZyZXFfcmVzOwoKICBJTlQgY2EgPSAyIC0gaF9zYnItPmVuY0VudkRhdGEuaW5pdF9zYnJfYW1wX3JlczsKICBJTlQgb25lQml0TGVzcyA9IDA7CiAgaWYgKGNhID09IDIpCiAgICBvbmVCaXRMZXNzID0gMTsgLyogTERfREFUQV9TSElGVCA9PiBsZDY0IHNjYWxpbmc7IG9uZSBiaXQgbGVzcyBmb3Igcm91bmRpbmcgKi8KCiAgSU5UIHF1YW50RXJyb3I7CiAgSU5UIG5FbnZlbG9wZXMgPSBmcmFtZV9pbmZvLT5uRW52ZWxvcGVzOwogIElOVCBzaG9ydF9lbnYgPSBmcmFtZV9pbmZvLT5zaG9ydEVudiAtIDE7CiAgSU5UIHRpbWVTdGVwID0gaF9zYnItPnNickV4dHJhY3RFbnZlbG9wZS50aW1lX3N0ZXA7CiAgSU5UIGNvbW1vblNjYWxlLHNjYWxlTGVmdDAsc2NhbGVMZWZ0MTsKICBJTlQgc2NhbGVSaWdodDA9MCxzY2FsZVJpZ2h0MT0wOwoKICBjb21tb25TY2FsZSA9IGZpeE1pbihZQnVmZmVyU2NhbGVMZWZ0WzBdLFlCdWZmZXJTY2FsZUxlZnRbMV0pOwoKICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKICAgIGNvbW1vblNjYWxlID0gZml4TWluKGNvbW1vblNjYWxlLFlCdWZmZXJTY2FsZVJpZ2h0WzBdKTsKICAgIGNvbW1vblNjYWxlID0gZml4TWluKGNvbW1vblNjYWxlLFlCdWZmZXJTY2FsZVJpZ2h0WzFdKTsKICB9CgogIGNvbW1vblNjYWxlID0gY29tbW9uU2NhbGUgLSA3OwoKICBzY2FsZUxlZnQwID0gWUJ1ZmZlclNjYWxlTGVmdFswXSAtIGNvbW1vblNjYWxlOwogIHNjYWxlTGVmdDEgPSBZQnVmZmVyU2NhbGVMZWZ0WzFdIC0gY29tbW9uU2NhbGUgOwogIEZES19BU1NFUlQgKChzY2FsZUxlZnQwID49IDApICYmIChzY2FsZUxlZnQxID49IDApKTsKCiAgaWYgKHN0ZXJlb01vZGUgPT0gU0JSX0NPVVBMSU5HKSB7CiAgICBzY2FsZVJpZ2h0MCA9IFlCdWZmZXJTY2FsZVJpZ2h0WzBdIC0gY29tbW9uU2NhbGU7CiAgICBzY2FsZVJpZ2h0MSA9IFlCdWZmZXJTY2FsZVJpZ2h0WzFdIC0gY29tbW9uU2NhbGU7CiAgICBGREtfQVNTRVJUICgoc2NhbGVSaWdodDAgPj0gMCkgJiYgKHNjYWxlUmlnaHQxID49IDApKTsKICAgICptYXhRdWFudEVycm9yID0gMDsKICB9CgogIGZvciAoaSA9IDA7IGkgPCBuRW52ZWxvcGVzOyBpKyspIHsKCiAgICBGSVhQX0RCTCBwTnJnTGVmdFtRTUZfTUFYX1RJTUVfU0xPVFNdOwogICAgRklYUF9EQkwgcE5yZ1JpZ2h0W1FNRl9NQVhfVElNRV9TTE9UU107CiAgICBpbnQgZW52TnJnX3NjYWxlOwogICAgRklYUF9EQkwgZW52TnJnTGVmdCAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgIEZJWFBfREJMIGVudk5yZ1JpZ2h0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICBpbnQgICAgICBtaXNzaW5nSGFybW9uaWNbUU1GX01BWF9USU1FX1NMT1RTXTsKICAgIGludCAgICAgIGNvdW50W1FNRl9NQVhfVElNRV9TTE9UU107CgogICAgc3RhcnRfcG9zID0gdGltZVN0ZXAgKiBmcmFtZV9pbmZvLT5ib3JkZXJzW2ldOwogICAgc3RvcF9wb3MgPSB0aW1lU3RlcCAqIGZyYW1lX2luZm8tPmJvcmRlcnNbaSArIDFdOwogICAgZnJlcV9yZXMgPSBmcmFtZV9pbmZvLT5mcmVxUmVzW2ldOwogICAgbm9fb2ZfYmFuZHMgPSBoX2Nvbi0+blNmYltmcmVxX3Jlc107CiAgICBlbnZOcmdfc2NhbGUgPSBERlJBQ1RfQklUUy1mTm9ybXooKEZJWFBfREJMKW5vX29mX2JhbmRzKTsKCiAgICBpZiAoaSA9PSBzaG9ydF9lbnYpIHsKICAgICAgc3RvcF9wb3MgLT0gZml4TWF4KDIsIHRpbWVTdGVwKTsgIC8qIGNvbnNpZGVyIGF0IGxlYXN0IDIgUU1GIHNsb3RzIGxlc3MgZm9yIHNob3J0IGVudmVsb3BlcyAoZW52ZWxvcGVzIGp1c3QgYmVmb3JlIHRyYW5zaWVudHMpICovCiAgICB9CgogICAgZm9yIChqID0gMDsgaiA8IG5vX29mX2JhbmRzOyBqKyspIHsKICAgICAgRklYUF9EQkwgbnJnTGVmdCAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgRklYUF9EQkwgbnJnUmlnaHQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKCiAgICAgIGxpID0gaF9jb24tPmZyZXFCYW5kVGFibGVbZnJlcV9yZXNdW2pdOwogICAgICB1aSA9IGhfY29uLT5mcmVxQmFuZFRhYmxlW2ZyZXFfcmVzXVtqICsgMV07CgogICAgICBpZihmcmVxX3JlcyA9PSBGUkVRX1JFU19ISUdIKXsKICAgICAgICBpZihqID09IDAgJiYgdWktbGkgPiAxKXsKICAgICAgICAgIGxpKys7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2V7CiAgICAgICAgaWYoaiA9PSAwICYmIHVpLWxpID4gMil7CiAgICAgICAgICBsaSsrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoKICAgICAgICBGaW5kIG91dCB3aGV0aGVyIGEgc2luZSB3aWxsIGJlIG1pc3NpbmcgaW4gdGhlIHNjYWxlLWZhY3RvcgogICAgICAgIGJhbmQgdGhhdCB3ZSdyZSBjdXJyZW50bHkgcHJvY2Vzc2luZy4KICAgICAgKi8KICAgICAgbWlzc2luZ0hhcm1vbmljW2pdID0gMDsKCiAgICAgIGlmKGhfc2JyLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljRmxhZyl7CgogICAgICAgIGlmKGZyZXFfcmVzID09IEZSRVFfUkVTX0hJR0gpewogICAgICAgICAgaWYoaF9zYnItPmVuY0VudkRhdGEuYWRkSGFybW9uaWNbal0peyAgICAvKkEgbWlzc2luZyBzaW5lIGluIHRoZSBjdXJyZW50IGJhbmQqLwogICAgICAgICAgICBtaXNzaW5nSGFybW9uaWNbal0gPSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgSU5UIGk7CiAgICAgICAgICBJTlQgc3RhcnRCYW5kSGlnaCA9IDA7CiAgICAgICAgICBJTlQgc3RvcEJhbmRIaWdoID0gMDsKCiAgICAgICAgICB3aGlsZShoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtGUkVRX1JFU19ISUdIXVtzdGFydEJhbmRIaWdoXSA8IGhfY29uLT5mcmVxQmFuZFRhYmxlW0ZSRVFfUkVTX0xPV11bal0pCiAgICAgICAgICAgIHN0YXJ0QmFuZEhpZ2grKzsKICAgICAgICAgIHdoaWxlKGhfY29uLT5mcmVxQmFuZFRhYmxlW0ZSRVFfUkVTX0hJR0hdW3N0b3BCYW5kSGlnaF0gPCBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtGUkVRX1JFU19MT1ddW2ogKyAxXSkKICAgICAgICAgICAgc3RvcEJhbmRIaWdoKys7CgogICAgICAgICAgZm9yKGkgPSBzdGFydEJhbmRIaWdoOyBpPHN0b3BCYW5kSGlnaDsgaSsrKXsKICAgICAgICAgICAgaWYoaF9zYnItPmVuY0VudkRhdGEuYWRkSGFybW9uaWNbaV0pewogICAgICAgICAgICAgIG1pc3NpbmdIYXJtb25pY1tqXSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAgSWYgYSBzaW5lIGlzIG1pc3NpbmcgaW4gYSBzY2FsZWZhY3RvcmJhbmQsIHdpdGggbW9yZSB0aGFuIG9uZSBxbWYgY2hhbm5lbAogICAgICAgIHVzZSB0aGUgbnJnIGZyb20gdGhlIGNoYW5uZWwgd2l0aCB0aGUgbGFyZ2VzdCBucmcgcmF0aGVyIHRoYW4gdGhlIG1lYW4uCiAgICAgICAgQ29tcGVuc2F0ZSBmb3IgdGhlIGJvb3N0IGNhbGN1bGF0aW9uIGluIHRoZSBkZWNkb2Rlci4KICAgICAgKi8KICAgICAgaW50IGJvcmRlcl9wb3MgPSBmaXhNaW4oc3RvcF9wb3MsIGhfc2JyLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlcldyaXRlT2Zmc2V0PDxZQnVmZmVyU3pTaGlmdCk7CgogICAgICBpZihtaXNzaW5nSGFybW9uaWNbal0pewoKICAgICAgICBpbnQgazsKICAgICAgICBjb3VudFtqXSA9IHN0b3BfcG9zIC0gc3RhcnRfcG9zOwogICAgICAgIG5yZ0xlZnQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKCiAgICAgICAgZm9yIChrID0gbGk7IGsgPCB1aTsgaysrKSB7CiAgICAgICAgICBGSVhQX0RCTCB0bXBOcmc7CiAgICAgICAgICB0bXBOcmcgPSBnZXRFbnZTZmJFbmVyZ3koaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BfcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcl9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlckxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVMZWZ0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUxlZnQxKTsKCiAgICAgICAgICBucmdMZWZ0ID0gZml4TWF4KG5yZ0xlZnQsIHRtcE5yZyk7CiAgICAgICAgfQoKICAgICAgICAvKiBFbmVyZ3kgbG93ZXJpbmcgY29tcGVuc2F0aW9uICovCiAgICAgICAgbnJnTGVmdCA9IG1oTG93ZXJpbmdFbmVyZ3kobnJnTGVmdCwgdWktbGkpOwoKICAgICAgICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKCiAgICAgICAgICBucmdSaWdodCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwoKICAgICAgICAgIGZvciAoayA9IGxpOyBrIDwgdWk7IGsrKykgewogICAgICAgICAgICBGSVhQX0RCTCB0bXBOcmc7CiAgICAgICAgICAgIHRtcE5yZyA9IGdldEVudlNmYkVuZXJneShrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaysxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcF9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJfcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVJpZ2h0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlUmlnaHQxKTsKCiAgICAgICAgICAgIG5yZ1JpZ2h0ID0gZml4TWF4KG5yZ1JpZ2h0LCB0bXBOcmcpOwogICAgICAgICAgfQoKICAgICAgICAgIC8qIEVuZXJneSBsb3dlcmluZyBjb21wZW5zYXRpb24gKi8KICAgICAgICAgIG5yZ1JpZ2h0ID0gbWhMb3dlcmluZ0VuZXJneShucmdSaWdodCwgdWktbGkpOwogICAgICAgIH0KICAgICAgfSAvKiBlbmQgbWlzc2luZ0hhcm1vbmljICovCiAgICAgIGVsc2V7CiAgICAgICAgY291bnRbal0gPSAoc3RvcF9wb3MgLSBzdGFydF9wb3MpICogKHVpIC0gbGkpOwoKICAgICAgICBucmdMZWZ0ID0gZ2V0RW52U2ZiRW5lcmd5KGxpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcl9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJTelNoaWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVMZWZ0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlTGVmdDEpOwoKICAgICAgICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKICAgICAgICAgIG5yZ1JpZ2h0ID0gZ2V0RW52U2ZiRW5lcmd5KGxpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcl9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlUmlnaHQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVSaWdodDEpOwogICAgICAgIH0KICAgICAgfSAvKiAhbWlzc2luZ0hhcm1vbmljICovCgogICAgICAvKiBzYXZlIGVuZXJnaWVzICovCiAgICAgIHBOcmdMZWZ0W2pdICA9IG5yZ0xlZnQ7CiAgICAgIHBOcmdSaWdodFtqXSA9IG5yZ1JpZ2h0OwogICAgICBlbnZOcmdMZWZ0ICArPSAobnJnTGVmdD4+ZW52TnJnX3NjYWxlKTsKICAgICAgZW52TnJnUmlnaHQgKz0gKG5yZ1JpZ2h0Pj5lbnZOcmdfc2NhbGUpOwogICAgfSAvKiBqICovCgogICAgZm9yIChqID0gMDsgaiA8IG5vX29mX2JhbmRzOyBqKyspIHsKCiAgICAgIEZJWFBfREJMIG5yZ0xlZnQyID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgIEZJWFBfREJMIG5yZ0xlZnQgID0gcE5yZ0xlZnRbal07CiAgICAgIEZJWFBfREJMIG5yZ1JpZ2h0ID0gcE5yZ1JpZ2h0W2pdOwoKICAgICAgLyogTm9uZSBtaXNzaW5nIGhhcm1vbmljIEVuZXJneSBsb3dlcmluZyBjb21wZW5zYXRpb24gKi8KICAgICAgaWYoIW1pc3NpbmdIYXJtb25pY1tqXSAmJiBoX3Nici0+ZkxldmVsUHJvdGVjdCkgewogICAgICAgIC8qIGluIGNhc2Ugb2YgbWlzc2luZyBlbmVyZ3kgaW4gYmFzZSBiYW5kLAogICAgICAgICAgIHJlZHVjZSByZWZlcmVuY2UgZW5lcmd5IHRvIHByZXZlbnQgb3ZlcmZsb3dzIGluIGRlY29kZXIgb3V0cHV0ICovCiAgICAgICAgbnJnTGVmdCA9IG5taExvd2VyaW5nRW5lcmd5KG5yZ0xlZnQsIGVudk5yZ0xlZnQsIGVudk5yZ19zY2FsZSwgbm9fb2ZfYmFuZHMpOwogICAgICAgIGlmIChzdGVyZW9Nb2RlID09IFNCUl9DT1VQTElORykgewogICAgICAgICAgbnJnUmlnaHQgPSBubWhMb3dlcmluZ0VuZXJneShucmdSaWdodCwgZW52TnJnUmlnaHQsIGVudk5yZ19zY2FsZSwgbm9fb2ZfYmFuZHMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHN0ZXJlb01vZGUgPT0gU0JSX0NPVVBMSU5HKSB7CiAgICAgICAgLyogY2FsYyBvcGVyYXRpb24gbGF0ZXIgd2l0aCBsb2cgKi8KICAgICAgICBucmdMZWZ0MiA9IG5yZ0xlZnQ7CiAgICAgICAgbnJnTGVmdCA9IChucmdSaWdodCArIG5yZ0xlZnQpID4+IDE7CiAgICAgIH0KCiAgICAgIC8qIG5yZ0xlZnQgPSBmMjBfbG9nMihucmdMZWZ0IC8gKFBGTE9BVCkoY291bnQgKiBoX3Nici0+c2JyUW1mLm5vX2NoYW5uZWxzKSkrKFBGTE9BVCk0NDsgKi8KICAgICAgLyogSWYgbnJnTGVmdCA9PSAwIHRoZW4gdGhlIExvZyBjYWxjdWxhdGlvbnMgYmVsb3cgZG8gZmFpbC4gKi8KICAgICAgaWYgKG5yZ0xlZnQgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkKICAgICAgewogICAgICAgIEZJWFBfREJMIHRtcDAsdG1wMSx0bXAyLHRtcDM7CiAgICAgICAgSU5UIHRtcFNjYWxlOwoKICAgICAgICB0bXBTY2FsZSA9IENvdW50TGVhZGluZ0JpdHMobnJnTGVmdCk7CiAgICAgICAgbnJnTGVmdCA9IG5yZ0xlZnQgPDwgdG1wU2NhbGU7CgogICAgICAgIHRtcDAgPSBDYWxjTGREYXRhKG5yZ0xlZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZWQgYnkgMS82NCAqLwogICAgICAgIHRtcDEgPSAoKEZJWFBfREJMKSAoY29tbW9uU2NhbGUrdG1wU2NhbGUpKSA8PCAoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZULTEpOyAgICAvKiBzY2FsZWQgYnkgMS82NCAqLwogICAgICAgIHRtcDIgPSAoKEZJWFBfREJMKShjb3VudFtqXSpoX2Nvbi0+bm9RbWZCYW5kcykpIDw8IChERlJBQ1RfQklUUy0xLTE0LTEpOwogICAgICAgIHRtcDIgPSBDYWxjTGREYXRhKHRtcDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZWQgYnkgMS82NCAqLwogICAgICAgIHRtcDMgPSBGTDJGWENPTlNUX0RCTCgwLjY4NzVmLTAuMjE4NzVmLTAuMDE1NjI1Zik+PjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZWQgYnkgMS82NCAqLwoKICAgICAgICBucmdMZWZ0ID0gKCh0bXAwLXRtcDIpPj4xKSArICh0bXAzIC0gdG1wMSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbnJnTGVmdCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICAgICAgfQoKICAgICAgLyogbGQ2NCB0byBpbnRlZ2VyIGNvbnZlcnNpb24gKi8KICAgICAgbnJnTGVmdCA9IGZpeE1pbihmaXhNYXgobnJnTGVmdCxGTDJGWENPTlNUX0RCTCgwLjBmKSksKEZMMkZYQ09OU1RfREJMKDAuNWYpPj5vbmVCaXRMZXNzKSk7CiAgICAgIG5yZ0xlZnQgPSAoRklYUF9EQkwpKExPTkcpbnJnTGVmdCA+PiAoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZULTEtb25lQml0TGVzcy0xKTsKICAgICAgc2ZiX25yZ0xlZnRbbV0gPSAoKElOVClucmdMZWZ0KzEpPj4xOyAvKiByb3VuZGluZyAqLwoKICAgICAgaWYgKHN0ZXJlb01vZGUgPT0gU0JSX0NPVVBMSU5HKSB7CiAgICAgICAgRklYUF9EQkwgc2NhbGVGcmFjdDsKICAgICAgICBpbnQgc2MwLCBzYzE7CgogICAgICAgIG5yZ0xlZnQyID0gZml4TWF4KChGSVhQX0RCTCkweDEsIG5yZ0xlZnQyKTsKICAgICAgICBucmdSaWdodCA9IGZpeE1heCgoRklYUF9EQkwpMHgxLCBucmdSaWdodCk7CgogICAgICAgIHNjMCA9IENvdW50TGVhZGluZ0JpdHMobnJnTGVmdDIpOwogICAgICAgIHNjMSA9IENvdW50TGVhZGluZ0JpdHMobnJnUmlnaHQpOwoKICAgICAgICBzY2FsZUZyYWN0ID0gKChGSVhQX0RCTCkoc2MwLXNjMSkpIDw8IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpOyAvKiBzY2FsZSB2YWx1ZSBpbiBsZDY0IHJlcHJlc2VudGF0aW9uICovCiAgICAgICAgbnJnUmlnaHQgPSBDYWxjTGREYXRhKG5yZ0xlZnQyPDxzYzApIC0gQ2FsY0xkRGF0YShucmdSaWdodDw8c2MxKSAtIHNjYWxlRnJhY3Q7CgogICAgICAgIC8qIGxkNjQgdG8gaW50ZWdlciBjb252ZXJzaW9uICovCiAgICAgICAgbnJnUmlnaHQgPSAoRklYUF9EQkwpKExPTkcpKG5yZ1JpZ2h0KSA+PiAoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZULTEtb25lQml0TGVzcyk7CiAgICAgICAgbnJnUmlnaHQgID0gKG5yZ1JpZ2h0KyhGSVhQX0RCTCkxKT4+MTsgLyogcm91bmRpbmcgKi8KCiAgICAgICAgc2ZiX25yZ1JpZ2h0W21dID0gbWFwUGFub3JhbWEgKG5yZ1JpZ2h0LGhfc2JyLT5lbmNFbnZEYXRhLmluaXRfc2JyX2FtcF9yZXMsJnF1YW50RXJyb3IpOwoKICAgICAgICAqbWF4UXVhbnRFcnJvciA9IGZpeE1heChxdWFudEVycm9yLCAqbWF4UXVhbnRFcnJvcik7CiAgICAgIH0KCiAgICAgIG0rKzsKICAgIH0gLyogaiAqLwoKICAgICAvKiBEbyBlbmVyZ3kgY29tcGVuc2F0aW9uIGZvciBzaW5lcyB0aGF0IGFyZSBwcmVzZW50IGluIHR3bwogICAgICAgICBRTUYtYmFuZHMgaW4gdGhlIG9yaWdpbmFsLCBidXQgd2lsbCBvbmx5IG9jY3VyIGluIG9uZSBiYW5kIGluCiAgICAgICAgIHRoZSBkZWNvZGVyIGR1ZSB0byB0aGUgc3ludGhldGljIHNpbmUgY29kaW5nLiovCiAgICBpZiAoaF9jb24tPnVzZVBhcmFtZXRyaWNDb2RpbmcpIHsKICAgICAgbS09bm9fb2ZfYmFuZHM7CiAgICAgIGZvciAoaiA9IDA7IGogPCBub19vZl9iYW5kczsgaisrKSB7CiAgICAgICAgaWYgKGZyZXFfcmVzPT1GUkVRX1JFU19ISUdIICYmIGhfc2JyLT5zYnJFeHRyYWN0RW52ZWxvcGUuZW52ZWxvcGVDb21wZW5zYXRpb25bal0pewogICAgICAgICAgc2ZiX25yZ0xlZnRbbV0gLT0gKGNhICogZml4cF9hYnMoKElOVCloX3Nici0+c2JyRXh0cmFjdEVudmVsb3BlLmVudmVsb3BlQ29tcGVuc2F0aW9uW2pdKSk7CiAgICAgICAgfQogICAgICAgIHNmYl9ucmdMZWZ0W21dID0gZml4TWF4KDAsIHNmYl9ucmdMZWZ0W21dKTsKICAgICAgICBtKys7CiAgICAgIH0KICAgIH0gLyogdXNlUGFyYW1ldHJpY0NvZGluZyAqLwoKICB9IC8qIGkqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKCiAgXGJyaWVmICBjYWxjdWxhdGVzIHRoZSBub2lzZSBmbG9vciBhbmQgdGhlIGVudmVsb3BlIHZhbHVlcyBmcm9tIHRoZQogICAgICAgICAgZW5lcmdpZXMsIGRlcGVuZGluZyBvbiBmcmFtaW5nIGFuZCBzdGVyZW8gbW9kZQoKICBGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlIGlzIHRoZSBtYWluIGZ1bmN0aW9uIGZvciBlbmNvZGluZyBhbmQgd3JpdGluZyB0aGUKICBlbnZlbG9wZSBhbmQgdGhlIG5vaXNlIGZsb29yLiBUaGUgZnVuY3Rpb24gaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBwcm9jZXNzZXM6CgogIC1BbmFseXNpcyBzdWJiYW5kIGZpbHRlcmluZy4KICAtRW5jb2RpbmcgU0EgYW5kIHBhbiBwYXJhbWV0ZXJzIChpZiBlbmFibGVkKS4KICAtVHJhbnNpZW50IGRldGVjdGlvbi4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpMTktfU0VDVElPTl9DT0RFX0wxCnZvaWQKRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZTEgKAogICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgaF9jb24sIC8qISBoYW5kbGUgdG8gY29uZmlnIGRhdGEgICAqLwogICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBIHNickJpdHN0cmVhbURhdGEsCiAgICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMIGhFbnZDaGFuLAogICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSBoQ21vbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgU0JSX0VOVl9URU1QX0RBVEEgICAqZURhdGEsCiAgICAgICAgICAgICAgICAgICAgU0JSX0ZSQU1FX1RFTVBfREFUQSAqZkRhdGEKICAgICAgICAgICAgICAgICAgICkKewoKICBIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgc2JyRXh0ckVudiA9ICZoRW52Q2hhbi0+c2JyRXh0cmFjdEVudmVsb3BlOwoKICBpZiAoc2JyRXh0ckVudi0+WUJ1ZmZlclN6U2hpZnQgPT0gMCkKICAgIEZES3NickVuY19nZXRFbmVyZ3lGcm9tQ3BseFFtZkRhdGFGdWxsKCZzYnJFeHRyRW52LT5ZQnVmZmVyW3NickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5yQnVmZmVyICsgc2JyRXh0ckVudi0+ckJ1ZmZlclJlYWRPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5pQnVmZmVyICsgc2JyRXh0ckVudi0+ckJ1ZmZlclJlYWRPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+bm9RbWZCYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPm5vX2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52Q2hhbi0+cW1mU2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYnJFeHRyRW52LT5ZQnVmZmVyU2NhbGVbMV0pOwogIGVsc2UKICAgIEZES3NickVuY19nZXRFbmVyZ3lGcm9tQ3BseFFtZkRhdGEoJnNickV4dHJFbnYtPllCdWZmZXJbc2JyRXh0ckVudi0+WUJ1ZmZlcldyaXRlT2Zmc2V0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+ckJ1ZmZlciArIHNickV4dHJFbnYtPnJCdWZmZXJSZWFkT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5pQnVmZmVyICsgc2JyRXh0ckVudi0+ckJ1ZmZlclJlYWRPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5ub1FtZkJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ub19jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52Q2hhbi0+cW1mU2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNickV4dHJFbnYtPllCdWZmZXJTY2FsZVsxXSk7CgoKCiAgLyoKICAgIFByZWNhbGN1bGF0aW9uIG9mIFRvbmFsaXR5IFF1b3RhcyAgQ09FRkYgVHJhbnNmb3JtIE9LCiAgKi8KICBGREtzYnJFbmNfQ2FsY3VsYXRlVG9uYWxpdHlRdW90YXMoJmhFbnZDaGFuLT5Ub25Db3JyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+ckJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPmlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtISV1baF9jb24tPm5TZmJbSEldXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZDaGFuLT5xbWZTY2FsZSk7CgoKCiAgLyoKICAgIFRyYW5zaWVudCBkZXRlY3Rpb24gQ09FRkYgVHJhbnNmb3JtIE9LCiAgKi8KICBGREtzYnJFbmNfdHJhbnNpZW50RGV0ZWN0KCZoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyU2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGEtPnRyYW5zaWVudF9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyU3pTaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT50aW1lX3N0ZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkNoYW4tPlNickVudkZyYW1lLmZyYW1lTWlkZGxlU2xvdCk7CgoKCiAgLyoKICAgIEdlbmVyYXRlIGZsYWdzIGZvciAyIGVudiBpbiBhIEZJWEZJWC1mcmFtZS4KICAgIFJlbW92ZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCBhbHdheXMgMSBlbnYgcGVyIEZJWEZJWC1mcmFtZS4KICAqLwoKICAvKgogICAgZnJhbWUgU3BsaXR0ZXIgQ09FRkYgVHJhbnNmb3JtIE9LCiAgKi8KICBGREtzYnJFbmNfZnJhbWVTcGxpdHRlcihzYnJFeHRyRW52LT5ZQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJTY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPmZyZXFCYW5kVGFibGVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGEtPnRyYW5zaWVudF9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyU3pTaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+blNmYlsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT50aW1lX3N0ZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+bm9fY29scyk7CgoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCgogIFxicmllZiAgY2FsY3VsYXRlcyB0aGUgbm9pc2UgZmxvb3IgYW5kIHRoZSBlbnZlbG9wZSB2YWx1ZXMgZnJvbSB0aGUKICAgICAgICAgIGVuZXJnaWVzLCBkZXBlbmRpbmcgb24gZnJhbWluZyBhbmQgc3RlcmVvIG1vZGUKCiAgRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZSBpcyB0aGUgbWFpbiBmdW5jdGlvbiBmb3IgZW5jb2RpbmcgYW5kIHdyaXRpbmcgdGhlCiAgZW52ZWxvcGUgYW5kIHRoZSBub2lzZSBmbG9vci4gVGhlIGZ1bmN0aW9uIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc2VzOgoKICAtRGV0ZXJtaW5lIHRpbWUvZnJlcXVlbmN5IGRpdmlzaW9uIG9mIGN1cnJlbnQgZ3JhbnVsZS4KICAtU2VuZGluZyB0cmFuc2llbnQgaW5mbyB0byBiaXRzdHJlYW0uCiAgLVNldCBhbXBfcmVzIHRvIDEuNSBkQiBpZiB0aGUgY3VycmVudCBmcmFtZSBjb250YWlucyBvbmx5IG9uZSBlbnZlbG9wZS4KICAtTG9jayBkeW5hbWljIGJhbmR3aWR0aCBmcmVxdWVuY3kgY2hhbmdlIGlmIHRoZSBuZXh0IGVudmVsb3BlIG5vdCBzdGFydHMgb24gYQogIGZyYW1lIGJvdW5kYXJ5LgogIC1NRENUIHRyYW5zcG9zZXIgKG5lZWRlZCB0byBkZXRlY3Qgd2hlcmUgaGFybW9uaWNzIHdpbGwgYmUgbWlzc2luZykuCiAgLVNwZWN0cnVtIEVzdGltYXRpb24gKHVzZWQgZm9yIHB1bHNlIHRyYWluIGFuZCBtaXNzaW5nIGhhcm1vbmljcyBkZXRlY3Rpb24pLgogIC1QdWxzZSB0cmFpbiBkZXRlY3Rpb24uCiAgLUludmVyc2UgRmlsdGVyaW5nIGRldGVjdGlvbi4KICAtV2F2ZWZvcm0gQ29kaW5nLgogIC1NaXNzaW5nIEhhcm1vbmljcyBkZXRlY3Rpb24uCiAgLUV4dHJhY3QgZW52ZWxvcGUgb2YgY3VycmVudCBmcmFtZS4KICAtTm9pc2UgZmxvb3IgZXN0aW1hdGlvbi4KICAtTm9pc2UgZmxvb3IgcXVhbnRpc2F0aW9uIGFuZCBjb2RpbmcuCiAgLUVuY29kZSBlbnZlbG9wZSBvZiBjdXJyZW50IGZyYW1lLgogIC1TZW5kIHRoZSBlbmNvZGVkIGRhdGEgdG8gdGhlIGJpdHN0cmVhbS4KICAtV3JpdGUgdG8gYml0c3RyZWFtLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCkxOS19TRUNUSU9OX0NPREVfTDEKdm9pZApGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMiAoCiAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSBoX2NvbiwgLyohIGhhbmRsZSB0byBjb25maWcgZGF0YSAgICovCiAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgICBoUGFyYW1ldHJpY1N0ZXJlbywKICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBIHNickJpdHN0cmVhbURhdGEsCiAgICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMICAgaF9lbnZDaGFuMCwKICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgICBoX2VudkNoYW4xLAogICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgIGhDbW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICBTQlJfRU5WX1RFTVBfREFUQSAgICplRGF0YSwKICAgICAgICAgICAgICAgICAgICBTQlJfRlJBTUVfVEVNUF9EQVRBICpmRGF0YSwKICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBjbGVhck91dHB1dAogICAgICAgICAgICAgICAgICAgKQp7CiAgSEFORExFX0VOVl9DSEFOTkVMIGhfZW52Q2hhbltNQVhfTlVNX0NIQU5ORUxTXSA9IHtoX2VudkNoYW4wLCBoX2VudkNoYW4xfTsKICBpbnQgY2gsIGksIGosIGMsIFlTelNoaWZ0ID0gaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclN6U2hpZnQ7CgogIFNCUl9TVEVSRU9fTU9ERSBzdGVyZW9Nb2RlID0gaF9jb24tPnN0ZXJlb01vZGU7CiAgaW50IG5DaGFubmVscyA9IGhfY29uLT5uQ2hhbm5lbHM7CiAgY29uc3QgaW50ICp2X3R1bmluZzsKICBzdGF0aWMgY29uc3QgaW50IHZfdHVuaW5nSEVBQUNbNl0gPSB7IDAsIDIsIDQsIDAsIDAsIDAgfTsKCiAgc3RhdGljIGNvbnN0IGludCB2X3R1bmluZ0VMRFs2XSA9IHsgMCwgMiwgMywgMCwgMCwgMCB9OwoKICBpZiAoaF9jb24tPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpCiAgICB2X3R1bmluZyA9IHZfdHVuaW5nRUxEOwogIGVsc2UKICAgIHZfdHVuaW5nID0gdl90dW5pbmdIRUFBQzsKCgogIC8qCiAgICBTZWxlY3Qgc3RlcmVvIG1vZGUuCiAgKi8KICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKICAgIGlmIChlRGF0YVswXS50cmFuc2llbnRfaW5mb1sxXSAmJiBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1sxXSkgewogICAgICBlRGF0YVswXS50cmFuc2llbnRfaW5mb1swXSA9IGZpeE1pbihlRGF0YVsxXS50cmFuc2llbnRfaW5mb1swXSwgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0pOwogICAgICBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1swXSA9IGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdOwogICAgfQogICAgZWxzZSB7CiAgICAgIGlmIChlRGF0YVswXS50cmFuc2llbnRfaW5mb1sxXSAmJiAhZURhdGFbMV0udHJhbnNpZW50X2luZm9bMV0pIHsKICAgICAgICBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1swXSA9IGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGlmICghZURhdGFbMF0udHJhbnNpZW50X2luZm9bMV0gJiYgZURhdGFbMV0udHJhbnNpZW50X2luZm9bMV0pCiAgICAgICAgICBlRGF0YVswXS50cmFuc2llbnRfaW5mb1swXSA9IGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvWzBdOwogICAgICAgIGVsc2UgewogICAgICAgICAgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0gPSBmaXhNYXgoZURhdGFbMV0udHJhbnNpZW50X2luZm9bMF0sIGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdKTsKICAgICAgICAgIGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvWzBdID0gZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvKgogICAgRGV0ZXJtaW5lIHRpbWUvZnJlcXVlbmN5IGRpdmlzaW9uIG9mIGN1cnJlbnQgZ3JhbnVsZQogICovCiAgZURhdGFbMF0uZnJhbWVfaW5mbyA9IEZES3NickVuY19mcmFtZUluZm9HZW5lcmF0b3IoJmhfZW52Q2hhblswXS0+U2JyRW52RnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMF0udHJhbnNpZW50X2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUucHJlX3RyYW5zaWVudF9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5sZEdyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl90dW5pbmcpOwoKICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuaFNickJTR3JpZCA9ICZoX2VudkNoYW5bMF0tPlNickVudkZyYW1lLlNickdyaWQ7CgogIC8qIEFBQyBMRCBwYXRjaCBmb3IgdHJhbnNpZW50IHByZWRpY3Rpb24gKi8KICBpZiAoaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmxkR3JpZCAmJiBlRGF0YVswXS50cmFuc2llbnRfaW5mb1syXSkgewogICAgLyogaWYgbmV4dCBmcmFtZSB3aWxsIHN0YXJ0IHdpdGggdHJhbnNpZW50LCBzZXQgc2hvcnRFbnYgdG8gbnVtRW52ZWxvcGVzKHNob3J0ZW5kIEVudmVsb3BlID0gc2hvcnRFbnYtMSkqLwogICAgaF9lbnZDaGFuWzBdLT5TYnJFbnZGcmFtZS5TYnJGcmFtZUluZm8uc2hvcnRFbnYgPSBoX2VudkNoYW5bMF0tPlNickVudkZyYW1lLlNickZyYW1lSW5mby5uRW52ZWxvcGVzOwogIH0KCgogIHN3aXRjaCAoc3RlcmVvTW9kZSkgewogIGNhc2UgU0JSX0xFRlRfUklHSFQ6CiAgY2FzZSBTQlJfU1dJVENIX0xSQzoKICAgIGVEYXRhWzFdLmZyYW1lX2luZm8gPSBGREtzYnJFbmNfZnJhbWVJbmZvR2VuZXJhdG9yKCZoX2VudkNoYW5bMV0tPlNickVudkZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMV0udHJhbnNpZW50X2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5wcmVfdHJhbnNpZW50X2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEubGRHcmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl90dW5pbmcpOwoKICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5oU2JyQlNHcmlkID0gJmhfZW52Q2hhblsxXS0+U2JyRW52RnJhbWUuU2JyR3JpZDsKCiAgICBpZiAoaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmxkR3JpZCAmJiBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1syXSkgewogICAgICAvKiBpZiBuZXh0IGZyYW1lIHdpbGwgc3RhcnQgd2l0aCB0cmFuc2llbnQsIHNldCBzaG9ydEVudiB0byBudW1FbnZlbG9wZXMoc2hvcnRlbmQgRW52ZWxvcGUgPSBzaG9ydEVudi0xKSovCiAgICAgIGhfZW52Q2hhblsxXS0+U2JyRW52RnJhbWUuU2JyRnJhbWVJbmZvLnNob3J0RW52ID0gaF9lbnZDaGFuWzFdLT5TYnJFbnZGcmFtZS5TYnJGcmFtZUluZm8ubkVudmVsb3BlczsKICAgIH0KCiAgICAvKiBjb21wYXJlIGxlZnQgYW5kIHJpZ2h0IGZyYW1lX2luZm9zICovCiAgICBpZiAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyAhPSBlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzKSB7CiAgICAgIHN0ZXJlb01vZGUgPSBTQlJfTEVGVF9SSUdIVDsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzICsgMTsgaSsrKSB7CiAgICAgICAgaWYgKGVEYXRhWzBdLmZyYW1lX2luZm8tPmJvcmRlcnNbaV0gIT0gZURhdGFbMV0uZnJhbWVfaW5mby0+Ym9yZGVyc1tpXSkgewogICAgICAgICAgc3RlcmVvTW9kZSA9IFNCUl9MRUZUX1JJR0hUOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAoaSA9IDA7IGkgPCBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzOyBpKyspIHsKICAgICAgICBpZiAoZURhdGFbMF0uZnJhbWVfaW5mby0+ZnJlcVJlc1tpXSAhPSBlRGF0YVsxXS5mcmFtZV9pbmZvLT5mcmVxUmVzW2ldKSB7CiAgICAgICAgICBzdGVyZW9Nb2RlID0gU0JSX0xFRlRfUklHSFQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGVEYXRhWzBdLmZyYW1lX2luZm8tPnNob3J0RW52ICE9IGVEYXRhWzFdLmZyYW1lX2luZm8tPnNob3J0RW52KSB7CiAgICAgICAgc3RlcmVvTW9kZSA9IFNCUl9MRUZUX1JJR0hUOwogICAgICB9CiAgICB9CiAgICBicmVhazsKICBjYXNlIFNCUl9DT1VQTElORzoKICAgIGVEYXRhWzFdLmZyYW1lX2luZm8gPSBlRGF0YVswXS5mcmFtZV9pbmZvOwogICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmhTYnJCU0dyaWQgPSAmaF9lbnZDaGFuWzBdLT5TYnJFbnZGcmFtZS5TYnJHcmlkOwogICAgYnJlYWs7CiAgY2FzZSBTQlJfTU9OTzoKICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICBGREtfQVNTRVJUICgwKTsKICB9CgoKICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7Y2grKykKICB7CiAgICBIQU5ETEVfRU5WX0NIQU5ORUwgaEVudkNoYW4gPSBoX2VudkNoYW5bY2hdOwogICAgSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIHNickV4dHJFbnYgPSAmaEVudkNoYW4tPnNickV4dHJhY3RFbnZlbG9wZTsKICAgIFNCUl9FTlZfVEVNUF9EQVRBICplZCA9ICZlRGF0YVtjaF07CgoKICAgIC8qCiAgICAgICBTZW5kIHRyYW5zaWVudCBpbmZvIHRvIGJpdHN0cmVhbSBhbmQgc3RvcmUgZm9yIG5leHQgY2FsbAogICAgKi8KICAgIHNickV4dHJFbnYtPnByZV90cmFuc2llbnRfaW5mb1swXSA9IGVkLT50cmFuc2llbnRfaW5mb1swXTsvKiB0cmFuX3BvcyAqLwogICAgc2JyRXh0ckVudi0+cHJlX3RyYW5zaWVudF9pbmZvWzFdID0gZWQtPnRyYW5zaWVudF9pbmZvWzFdOy8qIHRyYW5fZmxhZyAqLwogICAgaEVudkNoYW4tPmVuY0VudkRhdGEubm9PZkVudmVsb3BlcyA9IGVkLT5uRW52ZWxvcGVzID0gZWQtPmZyYW1lX2luZm8tPm5FbnZlbG9wZXM7ICAgICAvKiBudW1iZXIgb2YgZW52ZWxvcGVzIG9mIGN1cnJlbnQgZnJhbWUgKi8KCiAgICAvKgogICAgICBDaGVjayBpZiB0aGUgY3VycmVudCBmcmFtZSBpcyBkaXZpZGVkIGludG8gb25lIGVudmVsb3BlIG9ubHkuIElmIHNvLCBzZXQgdGhlIGFtcGxpdHVkZQogICAgICByZXNvbHV0aW9uIHRvIDEuNSBkQiwgb3RoZXJ3aXNlIG1heSBzZXQgYmFjayB0byBjaG9zZW4gdmFsdWUKICAgICovCiAgIGlmKCAoIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgPT0gRklYRklYICkKICAgICAgICAmJiAoIGVkLT5uRW52ZWxvcGVzID09IDEgKSApCiAgIHsKCiAgICAgaWYgKGhFbnZDaGFuLT5lbmNFbnZEYXRhLmxkR3JpZCkKICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRiA9IChBTVBfUkVTKWhfY29uLT5pbml0QW1wUmVzRkY7CiAgICAgZWxzZQogICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuY3VycmVudEFtcFJlc0ZGID0gU0JSX0FNUF9SRVNfMV81OwoKICAgICBpZiAoIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRiAhPSBoRW52Q2hhbi0+ZW5jRW52RGF0YS5pbml0X3Nicl9hbXBfcmVzKSB7CgogICAgICAgIEZES3NickVuY19Jbml0U2JySHVmZm1hblRhYmxlcygmaEVudkNoYW4tPmVuY0VudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52Q2hhbi0+c2JyQ29kZUVudmVsb3BlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPnNickNvZGVOb2lzZUZsb29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5jdXJyZW50QW1wUmVzRkYpOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgaWYoc2JySGVhZGVyRGF0YS0+c2JyX2FtcF9yZXMgIT0gaEVudkNoYW4tPmVuY0VudkRhdGEuaW5pdF9zYnJfYW1wX3JlcyApIHsKCiAgICAgICAgRkRLc2JyRW5jX0luaXRTYnJIdWZmbWFuVGFibGVzKCZoRW52Q2hhbi0+ZW5jRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5zYnJDb2RlRW52ZWxvcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52Q2hhbi0+c2JyQ29kZU5vaXNlRmxvb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9hbXBfcmVzKTsKICAgICAgfQogICAgfQoKICAgIGlmICghY2xlYXJPdXRwdXQpIHsKCiAgICAgIC8qCiAgICAgICAgVG9uYWxpdHkgY29ycmVjdGlvbiBwYXJhbWV0ZXIgZXh0cmFjdGlvbiAoaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWwsIG5vaXNlIGZsb29yIGFkZGl0aW9uYWwgc2luZXMpLgogICAgICAqLwogICAgICBGREtzYnJFbmNfVG9uQ29yclBhcmFtRXh0cigmaEVudkNoYW4tPlRvbkNvcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5zYnJfaW52Zl9tb2RlX3ZlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkLT5ub2lzZUZsb29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPmVuY0VudkRhdGEuYWRkSGFybW9uaWNGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuYWRkSGFybW9uaWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5lbnZlbG9wZUNvbXBlbnNhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkLT5mcmFtZV9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWQtPnRyYW5zaWVudF9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPmZyZXFCYW5kVGFibGVbSEldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPm5TZmJbSEldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuc2JyX3hwb3NfbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5zYnJTeW50YXhGbGFncyk7CgogICAgfQoKICAgIC8qIExvdyBlbmVyZ3kgaW4gbG93IGJhbmQgZml4ICovCiAgICBpZiAoIGhFbnZDaGFuLT5zYnJUcmFuc2llbnREZXRlY3Rvci5wcmV2TG93QmFuZEVuZXJneSA8IGhFbnZDaGFuLT5zYnJUcmFuc2llbnREZXRlY3Rvci5wcmV2SGlnaEJhbmRFbmVyZ3kgJiYgaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLnByZXZIaWdoQmFuZEVuZXJneSA+IEZMMkZYX0RCTCgwLjAzKSkKICAgIHsKICAgICAgaW50IGk7CgogICAgICBoRW52Q2hhbi0+ZkxldmVsUHJvdGVjdCA9IDE7CgogICAgICBmb3IgKGk9MDsgaTxNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKQogICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGVfdmVjW2ldID0gSU5WRl9ISUdIX0xFVkVMOwogICAgfSBlbHNlIHsKICAgICAgaEVudkNoYW4tPmZMZXZlbFByb3RlY3QgPSAwOwogICAgfQoKICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGUgPSBoRW52Q2hhbi0+ZW5jRW52RGF0YS5zYnJfaW52Zl9tb2RlX3ZlY1swXTsKCiAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5ub09mbm9pc2ViYW5kcyA9IGhFbnZDaGFuLT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHM7CgoKICB9IC8qIGNoICovCgoKCiAgIC8qCiAgICAgIFNhdmUgbnVtYmVyIG9mIHNjZiBiYW5kcyBwZXIgZW52ZWxvcGUKICAgICovCiAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzO2NoKyspIHsKICAgIGZvciAoaSA9IDA7IGkgPCBlRGF0YVtjaF0ubkVudmVsb3BlczsgaSsrKXsKICAgICAgaF9lbnZDaGFuW2NoXS0+ZW5jRW52RGF0YS5ub1NjZkJhbmRzW2ldID0KICAgICAgKGVEYXRhW2NoXS5mcmFtZV9pbmZvLT5mcmVxUmVzW2ldID09IEZSRVFfUkVTX0hJR0ggPyBoX2Nvbi0+blNmYltGUkVRX1JFU19ISUdIXSA6IGhfY29uLT5uU2ZiW0ZSRVFfUkVTX0xPV10pOwogICAgfQogIH0KCiAgLyoKICAgIEV4dHJhY3QgZW52ZWxvcGUgb2YgY3VycmVudCBmcmFtZS4KICAqLwogIHN3aXRjaCAoc3RlcmVvTW9kZSkgewogIGNhc2UgU0JSX01PTk86CiAgICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUgKGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8sIGVEYXRhWzBdLnNmYl9ucmcsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24sIGhfZW52Q2hhblswXSwgU0JSX01PTk8sIE5VTEwsIFlTelNoaWZ0KTsKICAgIGJyZWFrOwogIGNhc2UgU0JSX0xFRlRfUklHSFQ6CiAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGUsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMF0uZnJhbWVfaW5mbywgZURhdGFbMF0uc2ZiX25yZywgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBoX2NvbiwgaF9lbnZDaGFuWzBdLCBTQlJfTU9OTywgTlVMTCwgWVN6U2hpZnQpOwogICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUgKGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzFdLmZyYW1lX2luZm8sZURhdGFbMV0uc2ZiX25yZywgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBoX2NvbiwgaF9lbnZDaGFuWzFdLCBTQlJfTU9OTywgTlVMTCwgWVN6U2hpZnQpOwogICAgYnJlYWs7CiAgY2FzZSBTQlJfQ09VUExJTkc6CiAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGUsIGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLCBlRGF0YVswXS5zZmJfbnJnLCBlRGF0YVsxXS5zZmJfbnJnLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLCBoX2VudkNoYW5bMF0sIFNCUl9DT1VQTElORywgJmZEYXRhLT5tYXhRdWFudEVycm9yLCBZU3pTaGlmdCk7CiAgICBicmVhazsKICBjYXNlIFNCUl9TV0lUQ0hfTFJDOgogICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUgKGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8sIGVEYXRhWzBdLnNmYl9ucmcsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24sIGhfZW52Q2hhblswXSwgU0JSX01PTk8sIE5VTEwsIFlTelNoaWZ0KTsKICAgIGNhbGN1bGF0ZVNickVudmVsb3BlIChoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVsxXS5mcmFtZV9pbmZvLCBlRGF0YVsxXS5zZmJfbnJnLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLCBoX2VudkNoYW5bMV0sIFNCUl9NT05PLE5VTEwsIFlTelNoaWZ0KTsKICAgIGNhbGN1bGF0ZVNickVudmVsb3BlIChoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLCBoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8sIGVEYXRhWzBdLnNmYl9ucmdfY291cGxpbmcsIGVEYXRhWzFdLnNmYl9ucmdfY291cGxpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24sIGhfZW52Q2hhblswXSwgU0JSX0NPVVBMSU5HLCAmZkRhdGEtPm1heFF1YW50RXJyb3IsIFlTelNoaWZ0KTsKICAgIGJyZWFrOwogIH0KCgoKICAvKgogICAgTm9pc2UgZmxvb3IgcXVhbnRpc2F0aW9uIGFuZCBjb2RpbmcuCiAgKi8KCiAgc3dpdGNoIChzdGVyZW9Nb2RlKSB7CiAgY2FzZSBTQlJfTU9OTzoKICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMF0ubm9pc2VfbGV2ZWwsIGVEYXRhWzBdLm5vaXNlRmxvb3IsIDApOwoKICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUoZURhdGFbMF0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVOb2lzZUZsb29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwoKICAgIGJyZWFrOwogIGNhc2UgU0JSX0xFRlRfUklHSFQ6CiAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzBdLm5vaXNlX2xldmVsLGVEYXRhWzBdLm5vaXNlRmxvb3IsIDApOwoKICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzBdLm5vaXNlX2xldmVsLCBmRGF0YS0+cmVzLAogICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlTm9pc2VGbG9vciwKICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDAsCiAgICAgICAgICAgICAgICAgIChlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMCwKICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKCiAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzFdLm5vaXNlX2xldmVsLGVEYXRhWzFdLm5vaXNlRmxvb3IsIDApOwoKICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzFdLm5vaXNlX2xldmVsLCBmRGF0YS0+cmVzLAogICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlTm9pc2VGbG9vciwKICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDAsCiAgICAgICAgICAgICAgICAgIChlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMCwKICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKCiAgICBicmVhazsKCiAgY2FzZSBTQlJfQ09VUExJTkc6CiAgICBjb3VwbGVOb2lzZUZsb29yKGVEYXRhWzBdLm5vaXNlRmxvb3IsZURhdGFbMV0ubm9pc2VGbG9vcik7CgogICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVswXS5ub2lzZV9sZXZlbCxlRGF0YVswXS5ub2lzZUZsb29yLCAwKTsKCiAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZU5vaXNlRmxvb3IsCiAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAxLAogICAgICAgICAgICAgICAgICAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCiAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CgogICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVsxXS5ub2lzZV9sZXZlbCxlRGF0YVsxXS5ub2lzZUZsb29yLCAxKTsKCiAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVsxXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZU5vaXNlRmxvb3IsCiAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAxLAogICAgICAgICAgICAgICAgICAoZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDEsCiAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CgogICAgYnJlYWs7CiAgY2FzZSBTQlJfU1dJVENIX0xSQzoKICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMF0ubm9pc2VfbGV2ZWwsZURhdGFbMF0ubm9pc2VGbG9vciwgMCk7CiAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzFdLm5vaXNlX2xldmVsLGVEYXRhWzFdLm5vaXNlRmxvb3IsIDApOwogICAgY291cGxlTm9pc2VGbG9vcihlRGF0YVswXS5ub2lzZUZsb29yLGVEYXRhWzFdLm5vaXNlRmxvb3IpOwogICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVswXS5ub2lzZV9sZXZlbF9jb3VwbGluZyxlRGF0YVswXS5ub2lzZUZsb29yLCAwKTsKICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMV0ubm9pc2VfbGV2ZWxfY291cGxpbmcsZURhdGFbMV0ubm9pc2VGbG9vciwgMSk7CiAgICBicmVhazsKICB9CgoKCiAgLyoKICAgIEVuY29kZSBlbnZlbG9wZSBvZiBjdXJyZW50IGZyYW1lLgogICovCiAgc3dpdGNoIChzdGVyZW9Nb2RlKSB7CiAgY2FzZSBTQlJfTU9OTzoKICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nID0gMDsKICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5iYWxhbmNlID0gMDsKICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzBdLnNmYl9ucmcsIGVEYXRhWzBdLmZyYW1lX2luZm8tPmZyZXFSZXMsCiAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZSwKICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsCiAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nLAogICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAogICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwogICAgYnJlYWs7CiAgY2FzZSBTQlJfTEVGVF9SSUdIVDoKICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nID0gMDsKCiAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7CiAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7CgoKICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzBdLnNmYl9ucmcsIGVEYXRhWzBdLmZyYW1lX2luZm8tPmZyZXFSZXMsCiAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZSwKICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsCiAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nLAogICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAogICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwogICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMV0uc2ZiX25yZywgZURhdGFbMV0uZnJhbWVfaW5mby0+ZnJlcVJlcywKICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZUVudmVsb3BlLAogICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywKICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcsCiAgICAgICAgICAgICAgICAgIGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDAsCiAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CiAgICBicmVhazsKICBjYXNlIFNCUl9DT1VQTElORzoKICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nID0gMTsKICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5iYWxhbmNlID0gMDsKICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5iYWxhbmNlID0gMTsKCiAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5zZmJfbnJnLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAogICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUsCiAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLAogICAgICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZywKICAgICAgICAgICAgICAgICAgZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMCwKICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzFdLnNmYl9ucmcsIGVEYXRhWzFdLmZyYW1lX2luZm8tPmZyZXFSZXMsCiAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPnNickNvZGVFbnZlbG9wZSwKICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsCiAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nLAogICAgICAgICAgICAgICAgICBlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAxLAogICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwogICAgYnJlYWs7CiAgY2FzZSBTQlJfU1dJVENIX0xSQzoKICAgIHsKICAgICAgSU5UIHBheWxvYWRiaXRzTFI7CiAgICAgIElOVCBwYXlsb2FkYml0c0NPVVBMSU5HOwoKICAgICAgU0NIQVIgc2ZiTnJnUHJldlRlbXBbTUFYX05VTV9DSEFOTkVMU11bTUFYX0ZSRVFfQ09FRkZTXTsKICAgICAgU0NIQVIgbm9pc2VQcmV2VGVtcFtNQVhfTlVNX0NIQU5ORUxTXVtNQVhfTlVNX05PSVNFX0NPRUZGU107CiAgICAgIElOVCB1cERhdGVOcmdUZW1wW01BWF9OVU1fQ0hBTk5FTFNdOwogICAgICBJTlQgdXBEYXRlTm9pc2VUZW1wW01BWF9OVU1fQ0hBTk5FTFNdOwogICAgICBJTlQgZG9tYWluVmVjVGVtcFtNQVhfTlVNX0NIQU5ORUxTXVtNQVhfRU5WRUxPUEVTXTsKICAgICAgSU5UIGRvbWFpblZlY05vaXNlVGVtcFtNQVhfTlVNX0NIQU5ORUxTXVtNQVhfRU5WRUxPUEVTXTsKCiAgICAgIElOVCB0ZW1wRmxhZ1JpZ2h0ID0gMDsKICAgICAgSU5UIHRlbXBGbGFnTGVmdCA9IDA7CgogICAgICAvKgogICAgICAgICBTdG9yZSBwcmV2aW91cyB2YWx1ZXMsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gInVuZG8iIHdoYXQgaXMgYmVpbmcgZG9uZS4KICAgICAgKi8KCiAgICAgIGZvcihjaCA9IDA7IGNoIDwgbkNoYW5uZWxzO2NoKyspewogICAgICAgIEZES21lbWNweSAoc2ZiTnJnUHJldlRlbXBbY2hdLCBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUuc2ZiX25yZ19wcmV2LAogICAgICAgICAgICAgIE1BWF9GUkVRX0NPRUZGUyAqIHNpemVvZiAoU0NIQVIpKTsKCiAgICAgICAgRkRLbWVtY3B5IChub2lzZVByZXZUZW1wW2NoXSwgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3Iuc2ZiX25yZ19wcmV2LAogICAgICAgICAgICAgIE1BWF9OVU1fTk9JU0VfQ09FRkZTICogc2l6ZW9mIChTQ0hBUikpOwoKICAgICAgICB1cERhdGVOcmdUZW1wW2NoXSA9IGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS51cERhdGU7CiAgICAgICAgdXBEYXRlTm9pc2VUZW1wW2NoXSA9IGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZTsKCiAgICAgICAgLyoKICAgICAgICAgIGZvcmJpZCB0aW1lIGNvZGluZyBpbiB0aGUgZmlyc3QgZW52ZWxvcGUgaW4gY2FzZSBvZiBhIGRpZmZlcmVudAogICAgICAgICAgcHJldmlvdXMgc3RlcmVvbW9kZQogICAgICAgICovCiAgICAgICAgaWYoc2JySGVhZGVyRGF0YS0+cHJldl9jb3VwbGluZyl7CiAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUudXBEYXRlID0gMDsKICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZSA9IDA7CiAgICAgICAgfQogICAgICB9IC8qIGNoICovCgoKICAgICAgLyoKICAgICAgICAgQ29kZSBvcmRpbmFyeSBMZWZ0L1JpZ2h0IHN0ZXJlbwogICAgICAqLwogICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5zZmJfbnJnLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAogICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZSwKICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywgMCwKICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAogICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CiAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzFdLnNmYl9ucmcsIGVEYXRhWzFdLmZyYW1lX2luZm8tPmZyZXFSZXMsCiAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZUVudmVsb3BlLAogICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLCAwLAogICAgICAgICAgICAgICAgICAgIGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDAsCiAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKCiAgICAgIGMgPSAwOwogICAgICBmb3IgKGkgPSAwOyBpIDwgZURhdGFbMF0ubkVudmVsb3BlczsgaSsrKSB7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5ub1NjZkJhbmRzW2ldOyBqKyspCiAgICAgICAgICB7CiAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5pZW52ZWxvcGVbaV1bal0gPSBlRGF0YVswXS5zZmJfbnJnW2NdOwogICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuaWVudmVsb3BlW2ldW2pdID0gZURhdGFbMV0uc2ZiX25yZ1tjXTsKICAgICAgICAgICAgYysrOwogICAgICAgICAgfQogICAgICB9CgoKCiAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzBdLm5vaXNlX2xldmVsLCBmRGF0YS0+cmVzLAogICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVOb2lzZUZsb29yLAogICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAwLAogICAgICAgICAgICAgICAgICAgIChlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMCwKICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwoKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKQogICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5zYnJfbm9pc2VfbGV2ZWxzW2ldID0gZURhdGFbMF0ubm9pc2VfbGV2ZWxbaV07CgoKICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMV0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCiAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZU5vaXNlRmxvb3IsCiAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDAsCiAgICAgICAgICAgICAgICAgICAgKGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAwLAogICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykKICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuc2JyX25vaXNlX2xldmVsc1tpXSA9IGVEYXRhWzFdLm5vaXNlX2xldmVsW2ldOwoKCiAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nID0gMDsKICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOwogICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7CgogICAgICBwYXlsb2FkYml0c0xSID0gRkRLc2JyRW5jX0NvdW50U2JyQ2hhbm5lbFBhaXJFbGVtZW50IChzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+ZW5jRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhDbW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+c2JyU3ludGF4RmxhZ3MpOwoKICAgICAgLyoKICAgICAgICBzd2FwIHNhdmVkIHN0b3JlZCB3aXRoIGN1cnJlbnQgdmFsdWVzCiAgICAgICovCiAgICAgIGZvcihjaCA9IDA7IGNoIDwgbkNoYW5uZWxzO2NoKyspewogICAgICAgIElOVCAgIGl0bXA7CiAgICAgICAgZm9yKGk9MDtpPE1BWF9GUkVRX0NPRUZGUztpKyspewogICAgICAgICAgLyoKICAgICAgICAgICAgc3dhcCBzZmIgZW5lcmdpZXMKICAgICAgICAgICovCiAgICAgICAgICBpdG1wID0gIGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS5zZmJfbnJnX3ByZXZbaV07CiAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUuc2ZiX25yZ19wcmV2W2ldPXNmYk5yZ1ByZXZUZW1wW2NoXVtpXTsKICAgICAgICAgIHNmYk5yZ1ByZXZUZW1wW2NoXVtpXT1pdG1wOwogICAgICAgIH0KICAgICAgICBmb3IoaT0wO2k8TUFYX05VTV9OT0lTRV9DT0VGRlM7aSsrKXsKICAgICAgICAgIC8qCiAgICAgICAgICAgIHN3YXAgbm9pc2UgZW5lcmdpZXMKICAgICAgICAgICovCiAgICAgICAgICBpdG1wID0gIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnNmYl9ucmdfcHJldltpXTsKICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnNmYl9ucmdfcHJldltpXT1ub2lzZVByZXZUZW1wW2NoXVtpXTsKICAgICAgICAgIG5vaXNlUHJldlRlbXBbY2hdW2ldPWl0bXA7CiAgICAgICB9CiAgICAgICAgLyogc3dhcCB1cGRhdGUgZmxhZ3MgKi8KICAgICAgICBpdG1wICA9IGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS51cERhdGU7CiAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZUVudmVsb3BlLnVwRGF0ZT11cERhdGVOcmdUZW1wW2NoXTsKICAgICAgICB1cERhdGVOcmdUZW1wW2NoXSA9IGl0bXA7CgogICAgICAgIGl0bXAgPSAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3IudXBEYXRlOwogICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZT11cERhdGVOb2lzZVRlbXBbY2hdOwogICAgICAgIHVwRGF0ZU5vaXNlVGVtcFtjaF09aXRtcDsKCiAgICAgICAgLyoKICAgICAgICAgICAgc2F2ZSBkb21haW4gdmVjcwogICAgICAgICovCiAgICAgICAgRkRLbWVtY3B5KGRvbWFpblZlY1RlbXBbY2hdLGhfZW52Q2hhbltjaF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYyxzaXplb2YoSU5UKSpNQVhfRU5WRUxPUEVTKTsKICAgICAgICBGREttZW1jcHkoZG9tYWluVmVjTm9pc2VUZW1wW2NoXSxoX2VudkNoYW5bY2hdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2Usc2l6ZW9mKElOVCkqTUFYX0VOVkVMT1BFUyk7CgogICAgICAgIC8qCiAgICAgICAgICBmb3JiaWQgdGltZSBjb2RpbmcgaW4gdGhlIGZpcnN0IGVudmVsb3BlIGluIGNhc2Ugb2YgYSBkaWZmZXJlbnQKICAgICAgICAgIHByZXZpb3VzIHN0ZXJlb21vZGUKICAgICAgICAqLwoKICAgICAgICBpZighc2JySGVhZGVyRGF0YS0+cHJldl9jb3VwbGluZyl7CiAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUudXBEYXRlID0gMDsKICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZSA9IDA7CiAgICAgICAgfQogICAgICB9IC8qIGNoICovCgoKICAgICAgLyoKICAgICAgICAgQ291cGxpbmcKICAgICAgICovCgogICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5zZmJfbnJnX2NvdXBsaW5nLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAogICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZSwKICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywgMSwKICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAogICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CgogICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVsxXS5zZmJfbnJnX2NvdXBsaW5nLCBlRGF0YVsxXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAogICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPnNickNvZGVFbnZlbG9wZSwKICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywgMSwKICAgICAgICAgICAgICAgICAgICBlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAxLAogICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CgoKICAgICAgYyA9IDA7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBlRGF0YVswXS5uRW52ZWxvcGVzOyBpKyspIHsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLm5vU2NmQmFuZHNbaV07IGorKykgewogICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmllbnZlbG9wZVtpXVtqXSA9IGVEYXRhWzBdLnNmYl9ucmdfY291cGxpbmdbY107CiAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuaWVudmVsb3BlW2ldW2pdID0gZURhdGFbMV0uc2ZiX25yZ19jb3VwbGluZ1tjXTsKICAgICAgICAgIGMrKzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzBdLm5vaXNlX2xldmVsX2NvdXBsaW5nLCBmRGF0YS0+cmVzLAogICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVOb2lzZUZsb29yLAogICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAxLAogICAgICAgICAgICAgICAgICAgIChlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMCwKICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKQogICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5zYnJfbm9pc2VfbGV2ZWxzW2ldID0gZURhdGFbMF0ubm9pc2VfbGV2ZWxfY291cGxpbmdbaV07CgoKICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMV0ubm9pc2VfbGV2ZWxfY291cGxpbmcsIGZEYXRhLT5yZXMsCiAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZU5vaXNlRmxvb3IsCiAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDEsCiAgICAgICAgICAgICAgICAgICAgKGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAxLAogICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykKICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuc2JyX25vaXNlX2xldmVsc1tpXSA9IGVEYXRhWzFdLm5vaXNlX2xldmVsX2NvdXBsaW5nW2ldOwoKICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcgPSAxOwoKICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgID0gMDsKICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmJhbGFuY2UgID0gMTsKCiAgICAgIHRlbXBGbGFnTGVmdCAgPSBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYWRkSGFybW9uaWNGbGFnOwogICAgICB0ZW1wRmxhZ1JpZ2h0ID0gaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljRmxhZzsKCiAgICAgIHBheWxvYWRiaXRzQ09VUExJTkcgPQogICAgICAgIEZES3NickVuY19Db3VudFNickNoYW5uZWxQYWlyRWxlbWVudCAoc2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhDbW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPnNiclN5bnRheEZsYWdzKTsKCgogICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYWRkSGFybW9uaWNGbGFnID0gdGVtcEZsYWdMZWZ0OwogICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuYWRkSGFybW9uaWNGbGFnID0gdGVtcEZsYWdSaWdodDsKCiAgICAgIGlmIChwYXlsb2FkYml0c0NPVVBMSU5HIDwgcGF5bG9hZGJpdHNMUikgewoKICAgICAgICAgIC8qCiAgICAgICAgICAgIGNvcHkgY29kZWQgY291cGxpbmcgZW52ZWxvcGUgYW5kIG5vaXNlIGRhdGEgdG8gbC9yCiAgICAgICAgICAqLwogICAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7Y2grKyl7CiAgICAgICAgICAgIFNCUl9FTlZfVEVNUF9EQVRBICplZCA9ICZlRGF0YVtjaF07CiAgICAgICAgICAgIEZES21lbWNweSAoZWQtPnNmYl9ucmcsIGVkLT5zZmJfbnJnX2NvdXBsaW5nLAogICAgICAgICAgICAgICAgICBNQVhfTlVNX0VOVkVMT1BFX1ZBTFVFUyAqIHNpemVvZiAoU0NIQVIpKTsKICAgICAgICAgICAgRkRLbWVtY3B5IChlZC0+bm9pc2VfbGV2ZWwsIGVkLT5ub2lzZV9sZXZlbF9jb3VwbGluZywKICAgICAgICAgICAgICAgICAgTUFYX05VTV9OT0lTRV9WQUxVRVMgKiBzaXplb2YgKFNDSEFSKSk7CiAgICAgICAgICB9CgogICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcgPSAxOwogICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgID0gMDsKICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5iYWxhbmNlICA9IDE7CiAgICAgIH0KICAgICAgZWxzZXsKICAgICAgICAgIC8qCiAgICAgICAgICAgIHJlc3RvcmUgc2F2ZWQgbC9yIGl0ZW1zCiAgICAgICAgICAqLwogICAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7Y2grKyl7CgogICAgICAgICAgICBGREttZW1jcHkgKGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS5zZmJfbnJnX3ByZXYsCiAgICAgICAgICAgICAgICAgICAgc2ZiTnJnUHJldlRlbXBbY2hdLCBNQVhfRlJFUV9DT0VGRlMgKiBzaXplb2YgKFNDSEFSKSk7CgogICAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUudXBEYXRlID0gdXBEYXRlTnJnVGVtcFtjaF07CgogICAgICAgICAgICBGREttZW1jcHkgKGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnNmYl9ucmdfcHJldiwKICAgICAgICAgICAgICAgICAgICBub2lzZVByZXZUZW1wW2NoXSwgTUFYX05VTV9OT0lTRV9DT0VGRlMgKiBzaXplb2YgKFNDSEFSKSk7CgogICAgICAgICAgICBGREttZW1jcHkgKGhfZW52Q2hhbltjaF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYyxkb21haW5WZWNUZW1wW2NoXSxzaXplb2YoSU5UKSpNQVhfRU5WRUxPUEVTKTsKICAgICAgICAgICAgRkRLbWVtY3B5IChoX2VudkNoYW5bY2hdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsZG9tYWluVmVjTm9pc2VUZW1wW2NoXSxzaXplb2YoSU5UKSpNQVhfRU5WRUxPUEVTKTsKCiAgICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZSA9IHVwRGF0ZU5vaXNlVGVtcFtjaF07CiAgICAgICAgICB9CgogICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcgPSAwOwogICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgID0gMDsKICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5iYWxhbmNlICA9IDA7CiAgICAgICAgfQogICAgfQogICAgYnJlYWs7CiAgfSAvKiBzd2l0Y2ggKi8KCgogIC8qIHRlbGwgdGhlIGVudmVsb3BlIGVuY29kZXJzIGhvdyBsb25nIGl0IGhhcyBiZWVuLCBzaW5jZSB3ZSBsYXN0IHNlbnQKICAgICBhIGZyYW1lIHN0YXJ0aW5nIHdpdGggYSBkRi1jb2RlZCBlbnZlbG9wZSAqLwogIGlmIChzdGVyZW9Nb2RlID09IFNCUl9NT05PICkgewogICAgaWYgKGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjWzBdID09IFRJTUUpCiAgICAgIGhfZW52Q2hhblswXS0+c2JyQ29kZUVudmVsb3BlLmRGX2VkZ2VfaW5jcl9mYWMrKzsKICAgIGVsc2UKICAgICAgaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUuZEZfZWRnZV9pbmNyX2ZhYyA9IDA7CiAgfQogIGVsc2UgewogICAgaWYgKGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjWzBdID09IFRJTUUgfHwKICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY1swXSA9PSBUSU1FKSB7CiAgICAgIGhfZW52Q2hhblswXS0+c2JyQ29kZUVudmVsb3BlLmRGX2VkZ2VfaW5jcl9mYWMrKzsKICAgICAgaF9lbnZDaGFuWzFdLT5zYnJDb2RlRW52ZWxvcGUuZEZfZWRnZV9pbmNyX2ZhYysrOwogICAgfQogICAgZWxzZSB7CiAgICAgIGhfZW52Q2hhblswXS0+c2JyQ29kZUVudmVsb3BlLmRGX2VkZ2VfaW5jcl9mYWMgPSAwOwogICAgICBoX2VudkNoYW5bMV0tPnNickNvZGVFbnZlbG9wZS5kRl9lZGdlX2luY3JfZmFjID0gMDsKICAgIH0KICB9CgogIC8qCiAgICBTZW5kIHRoZSBlbmNvZGVkIGRhdGEgdG8gdGhlIGJpdHN0cmVhbQogICovCiAgZm9yKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7Y2grKyl7CiAgICBTQlJfRU5WX1RFTVBfREFUQSAqZWQgPSAmZURhdGFbY2hdOwogICAgYyA9IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgZWQtPm5FbnZlbG9wZXM7IGkrKykgewogICAgICBmb3IgKGogPSAwOyBqIDwgaF9lbnZDaGFuW2NoXS0+ZW5jRW52RGF0YS5ub1NjZkJhbmRzW2ldOyBqKyspIHsKICAgICAgICBoX2VudkNoYW5bY2hdLT5lbmNFbnZEYXRhLmllbnZlbG9wZVtpXVtqXSA9IGVkLT5zZmJfbnJnW2NdOwoKICAgICAgICBjKys7CiAgICAgIH0KICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKXsKICAgICAgaF9lbnZDaGFuW2NoXS0+ZW5jRW52RGF0YS5zYnJfbm9pc2VfbGV2ZWxzW2ldID0gZWQtPm5vaXNlX2xldmVsW2ldOwogICAgfQogIH0vKiBjaCAqLwoKCiAgLyoKICAgIFdyaXRlIGJpdHN0cmVhbQogICovCiAgaWYgKG5DaGFubmVscyA9PSAyKSB7CiAgICBGREtzYnJFbmNfV3JpdGVFbnZDaGFubmVsUGFpckVsZW1lbnQoc2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaENtb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPnNiclN5bnRheEZsYWdzKTsKICB9CiAgZWxzZSB7CiAgICBGREtzYnJFbmNfV3JpdGVFbnZTaW5nbGVDaGFubmVsRWxlbWVudChzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+ZW5jRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaENtb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+c2JyU3ludGF4RmxhZ3MpOwogIH0KCiAgLyoKICAgKiBVcGRhdGUgYnVmZmVycy4KICAgKi8KICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykKICB7CiAgICAgIGludCBZQnVmZmVyTGVuZ3RoID0gaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLm5vX2NvbHMgPj4gaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTelNoaWZ0OwogICAgICBmb3IgKGkgPSAwOyBpIDwgaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJXcml0ZU9mZnNldDsgaSsrKSB7CiAgICAgICAgIEZES21lbWNweShoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlcltpXSwKICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyW2kgKyBZQnVmZmVyTGVuZ3RoXSwKICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkqUU1GX0NIQU5ORUxTKTsKICAgICAgfQogICAgICBoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlWzBdID0gaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZVsxXTsKICB9CgogIHNickhlYWRlckRhdGEtPnByZXZfY291cGxpbmcgPSBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCgogIFxicmllZiAgY3JlYXRlcyBhbiBlbnZlbG9wZSBleHRyYWN0b3IgaGFuZGxlCgogIFxyZXR1cm4gZXJyb3Igc3RhdHVzCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpJTlQKRkRLc2JyRW5jX0NyZWF0ZUV4dHJhY3RTYnJFbnZlbG9wZSAoSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFICBoU2JyQ3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2hhbm5lbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxJTlQgY2hJbkVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVDSEFSKiBkeW5hbWljX1JBTQogICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgSU5UIGk7CiAgRklYUF9EQkwqIFlCdWZmZXIgPSBHZXRSYW1fU2JyX2VudllCdWZmZXIoY2hhbm5lbCk7CgogIEZES21lbWNsZWFyKGhTYnJDdXQsc2l6ZW9mKFNCUl9FWFRSQUNUX0VOVkVMT1BFKSk7CiAgaFNickN1dC0+cF9ZQnVmZmVyID0gWUJ1ZmZlcjsKCgogIGZvciAoaSA9IDA7IGkgPCAoUU1GX01BWF9USU1FX1NMT1RTPj4xKTsgaSsrKSB7CiAgICBoU2JyQ3V0LT5ZQnVmZmVyW2ldID0gWUJ1ZmZlciArIChpKlFNRl9DSEFOTkVMUyk7CiAgfQogIEZJWFBfREJMICpZQnVmZmVyRHluID0gR2V0UmFtX1Nicl9lbnZZQnVmZmVyKGNoSW5FbCwgZHluYW1pY19SQU0pOwogIElOVCBuPTA7CiAgZm9yICg7IGkgPCBRTUZfTUFYX1RJTUVfU0xPVFM7IGkrKyxuKyspIHsKICAgIGhTYnJDdXQtPllCdWZmZXJbaV0gPSBZQnVmZmVyRHluICsgKG4qUU1GX0NIQU5ORUxTKTsKICB9CgogIEZJWFBfREJMKiByQnVmZmVyID0gR2V0UmFtX1Nicl9lbnZSQnVmZmVyKDAsIGR5bmFtaWNfUkFNKTsKICBGSVhQX0RCTCogaUJ1ZmZlciA9IEdldFJhbV9TYnJfZW52SUJ1ZmZlcigwLCBkeW5hbWljX1JBTSk7CgogIGZvciAoaSA9IDA7IGkgPCBRTUZfTUFYX1RJTUVfU0xPVFM7IGkrKykgewogICAgaFNickN1dC0+ckJ1ZmZlcltpXSA9IHJCdWZmZXIgKyAoaSpRTUZfQ0hBTk5FTFMpOwogICAgaFNickN1dC0+aUJ1ZmZlcltpXSA9IGlCdWZmZXIgKyAoaSpRTUZfQ0hBTk5FTFMpOwogIH0KCiAgcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKCiAgXGJyaWVmICBJbml0aWFsaXplIGFuIGVudmVsb3BlIGV4dHJhY3RvciBpbnN0YW5jZS4KCiAgXHJldHVybiBlcnJvciBzdGF0dXMKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCklOVApGREtzYnJFbmNfSW5pdEV4dHJhY3RTYnJFbnZlbG9wZSAoSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFICBoU2JyQ3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9fcm93cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lX3Nsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVfc3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuX29mZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIHN0YXRlc0luaXRGbGFnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxpbnQgY2hJbkVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiogZHluYW1pY19SQU0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVJTlQgc2JyU3ludGF4RmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogIGludCBZQnVmZmVyTGVuZ3RoLCByQnVmZmVyTGVuZ3RoOwogIGludCBpOwoKICBpZiAoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgewogICAgaW50IG9mZiA9IFRSQU5TSUVOVF9PRkZTRVRfTEQ7CiNpZm5kZWYgRlVMTF9ERUxBWQogICAgaFNickN1dC0+WUJ1ZmZlcldyaXRlT2Zmc2V0ID0gKG5vX2NvbHM+PjEpK29mZip0aW1lX3N0ZXA7CiNlbHNlCiAgICBoU2JyQ3V0LT5ZQnVmZmVyV3JpdGVPZmZzZXQgPSBub19jb2xzK29mZip0aW1lX3N0ZXA7CiNlbmRpZgogIH0gZWxzZQogIHsKICAgIGhTYnJDdXQtPllCdWZmZXJXcml0ZU9mZnNldCA9IHRyYW5fb2ZmKnRpbWVfc3RlcDsKICB9CiAgaFNickN1dC0+ckJ1ZmZlclJlYWRPZmZzZXQgID0gMDsKCgogIFlCdWZmZXJMZW5ndGggPSBoU2JyQ3V0LT5ZQnVmZmVyV3JpdGVPZmZzZXQgKyBub19jb2xzOwogIHJCdWZmZXJMZW5ndGggPSBub19jb2xzOwoKICBoU2JyQ3V0LT5wcmVfdHJhbnNpZW50X2luZm9bMF0gPSAwOwogIGhTYnJDdXQtPnByZV90cmFuc2llbnRfaW5mb1sxXSA9IDA7CgoKICBoU2JyQ3V0LT5ub19jb2xzID0gbm9fY29sczsKICBoU2JyQ3V0LT5ub19yb3dzID0gbm9fcm93czsKICBoU2JyQ3V0LT5zdGFydF9pbmRleCA9IHN0YXJ0X2luZGV4OwoKICBoU2JyQ3V0LT50aW1lX3Nsb3RzID0gdGltZV9zbG90czsKICBoU2JyQ3V0LT50aW1lX3N0ZXAgPSB0aW1lX3N0ZXA7CgogIEZES19BU1NFUlQobm9fcm93cyAgICAgICAgPD0gICBRTUZfQ0hBTk5FTFMpOwoKICAvKiBVc2UgaGFsZiB0aGUgRW5lcmd5IHZhbHVlcyBpZiB0aW1lIHN0ZXAgaXMgMiBvciBncmVhdGVyICovCiAgaWYgKHRpbWVfc3RlcCA+PSAyKQogICAgaFNickN1dC0+WUJ1ZmZlclN6U2hpZnQgPSAxOwogIGVsc2UKICAgIGhTYnJDdXQtPllCdWZmZXJTelNoaWZ0ID0gMDsKCiAgWUJ1ZmZlckxlbmd0aCAgICAgICAgICAgICAgID4+PSBoU2JyQ3V0LT5ZQnVmZmVyU3pTaGlmdDsKICBoU2JyQ3V0LT5ZQnVmZmVyV3JpdGVPZmZzZXQgPj49IGhTYnJDdXQtPllCdWZmZXJTelNoaWZ0OwoKICBGREtfQVNTRVJUKFlCdWZmZXJMZW5ndGg8PVFNRl9NQVhfVElNRV9TTE9UUyk7CgogIEZJWFBfREJMICpZQnVmZmVyRHluID0gR2V0UmFtX1Nicl9lbnZZQnVmZmVyKGNoSW5FbCwgZHluYW1pY19SQU0pOwogIElOVCBuPTA7CiAgZm9yIChpPShRTUZfTUFYX1RJTUVfU0xPVFM+PjEpOyBpIDwgUU1GX01BWF9USU1FX1NMT1RTOyBpKyssbisrKSB7CiAgICBoU2JyQ3V0LT5ZQnVmZmVyW2ldID0gWUJ1ZmZlckR5biArIChuKlFNRl9DSEFOTkVMUyk7CiAgfQoKICBpZihzdGF0ZXNJbml0RmxhZykgewogICAgZm9yIChpPTA7IGk8WUJ1ZmZlckxlbmd0aDsgaSsrKSB7CiAgICAgIEZES21lbWNsZWFyKCBoU2JyQ3V0LT5ZQnVmZmVyW2ldLFFNRl9DSEFOTkVMUypzaXplb2YoRklYUF9EQkwpKTsKICAgIH0KICB9CgogIGZvciAoaSA9IDA7IGkgPCByQnVmZmVyTGVuZ3RoOyBpKyspIHsKICAgIEZES21lbWNsZWFyKCBoU2JyQ3V0LT5yQnVmZmVyW2ldLFFNRl9DSEFOTkVMUypzaXplb2YoRklYUF9EQkwpKTsKICAgIEZES21lbWNsZWFyKCBoU2JyQ3V0LT5pQnVmZmVyW2ldLFFNRl9DSEFOTkVMUypzaXplb2YoRklYUF9EQkwpKTsKICB9CgogIEZES21lbWNsZWFyIChoU2JyQ3V0LT5lbnZlbG9wZUNvbXBlbnNhdGlvbixzaXplb2YoVUNIQVIpKk1BWF9GUkVRX0NPRUZGUyk7CgogIGlmKHN0YXRlc0luaXRGbGFnKSB7CiAgICBoU2JyQ3V0LT5ZQnVmZmVyU2NhbGVbMF0gPSBoU2JyQ3V0LT5ZQnVmZmVyU2NhbGVbMV0gPSBGUkFDVF9CSVRTLTE7CiAgfQoKICByZXR1cm4gKDApOwp9CgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKCiAgXGJyaWVmICBkZWluaXRpYWxpemVzIGFuIGVudmVsb3BlIGV4dHJhY3RvciBoYW5kbGUKCiAgXHJldHVybiB2b2lkCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZApGREtzYnJFbmNfZGVsZXRlRXh0cmFjdFNickVudmVsb3BlIChIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgaFNickN1dCkKewoKICBpZiAoaFNickN1dCkgewogICAgRnJlZVJhbV9TYnJfZW52WUJ1ZmZlcigmaFNickN1dC0+cF9ZQnVmZmVyKTsKICB9Cn0KCklOVApGREtzYnJFbmNfR2V0RW52RXN0RGVsYXkoSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIGhTYnIpCnsKICByZXR1cm4gaFNici0+bm9fcm93cyooKGhTYnItPllCdWZmZXJXcml0ZU9mZnNldCkqMiAgICAgLyogbXVsdCAyIGJlY2F1c2UgbnJnJ3MgYXJlIGdyb3VwZWQgaGFsZiAqLwogICAgICAgICAgICAgICAgICAgICAgICAtIGhTYnItPnJCdWZmZXJSZWFkT2Zmc2V0ICk7ICAgICAgIC8qIGluIHJlZmVyZW5jZSBob2xkIGhhbGYgc3BlYyBhbmQgY2FsYyBucmcncyBvbiBvdmVybGFwcGVkIHNwZWMgKi8KCn0KCgoKCg==