Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSAiZW52X2VzdC5oIgojaW5jbHVkZSAidHJhbl9kZXQuaCIKCiNpbmNsdWRlICJxbWYuaCIKCiNpbmNsdWRlICJmcmFtX2dlbi5oIgojaW5jbHVkZSAiYml0X3Nici5oIgojaW5jbHVkZSAiY21vbmRhdGEuaCIKI2luY2x1ZGUgInNicl9yYW0uaCIKCgojaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKCiNkZWZpbmUgUVVBTlRfRVJST1JfVEhSRVMgMjAwCiNkZWZpbmUgWV9OUkdfU0NBTEUgNSAvKiBub0NvbHMgPSAzMiAtPiBzaGlmdCg1KSAqLwoKCnN0YXRpYyBjb25zdCBVQ0hBUiBwYW5UYWJsZVsyXVsxMF0gPSB7IHsgMCwgMiwgNCwgNiwgOCwxMiwxNiwyMCwyNH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMCwgMiwgNCwgOCwxMiwgMCwgMCwgMCwgMCB9IH07CnN0YXRpYyBjb25zdCBVQ0hBUiBtYXhJbmRleFsyXSA9IHs5LCA1fTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfR2V0VG9uYWxpdHkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKCiAgXGJyaWVmICAgICAgQ2FsY3VsYXRlcyBjb21wbGV0ZSBlbmVyZ3kgcGVyIGJhbmQgZnJvbSB0aGUgZW5lcmd5IHZhbHVlcwogICAgICAgICAgICAgIG9mIHRoZSBRTUYgc3Vic2FtcGxlcy4KCiAgXGJyaWVmICAgICAgcXVvdGFNYXRyaXggLSBjYWxjdWxhdGVkIGluIEZES3NickVuY19DYWxjdWxhdGVUb25hbGl0eVF1b3RhcygpCiAgXGJyaWVmICAgICAgbm9Fc3RQZXJGcmFtZSAtIG51bWJlciBvZiBlc3RpbWF0aW9ucyBwZXIgZnJhbWUKICBcYnJpZWYgICAgICBzdGFydEluZGV4IC0gc3RhcnQgaW5kZXggZm9yIHRoZSBxdW90YSBtYXRyaXgKICBcYnJpZWYgICAgICBFbmVyZ2llcyAtIGVuZXJneSBtYXRyaXgKICBcYnJpZWYgICAgICBzdGFydEJhbmQgLSBzdGFydCBiYW5kCiAgXGJyaWVmICAgICAgc3RvcEJhbmQgLSBudW1iZXIgb2YgUU1GIGJhbmRzCiAgXGJyaWVmICAgICAgbnVtYmVyQ29scyAtIG51bWJlciBvZiBRTUYgc3Vic2FtcGxlcwoKICBccmV0dXJuICAgICBtZWFuIHRvbmFsaXR5IG9mIHRoZSA1IGJhbmRzIHdpdGggdGhlIGhpZ2hlc3QgZW5lcmd5CiAgICAgICAgICAgICAgc2NhbGVkIGJ5IDJeKFJFTEFYQVRJT05fU0hJRlQrMikqUkVMQVhBVElPTl9GUkFDVAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEZJWFBfREJMIEZES3NickVuY19HZXRUb25hbGl0eSgKICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgKnF1b3RhTWF0cml4LAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgbm9Fc3RQZXJGcmFtZSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgIHN0YXJ0SW5kZXgsCiAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICpFbmVyZ2llcywKICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgIHN0YXJ0QmFuZCwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgIHN0b3BCYW5kLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgbnVtYmVyQ29scwogICAgICAgICkKewogIFVDSEFSIGIsIGUsIGs7CiAgSU5UICAgICAgbm9fZW5NYXhCYW5kW1NCUl9NQVhfRU5FUkdZX1ZBTFVFU10gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSB9OwogIEZJWFBfREJMIGVuZXJneU1heFtTQlJfTUFYX0VORVJHWV9WQUxVRVNdID0geyBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpLCBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZikgfTsKICBGSVhQX0RCTCBlbmVyZ3lNYXhNaW4gPSBNQVhWQUxfREJMOyAvKiBtaW4uIGVuZXJneSBpbiBlbmVyZ3lNYXggYXJyYXkgKi8KICBVQ0hBUiAgICBwb3NFbmVyZ3lNYXhNaW4gPSAwOyAgICAgICAvKiBtaW4uIGVuZXJneSBpbiBlbmVyZ3lNYXggYXJyYXkgcG9zaXRpb24gKi8KICBGSVhQX0RCTCB0b25hbGl0eUJhbmRbU0JSX01BWF9FTkVSR1lfVkFMVUVTXSA9IHsgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpLCBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpIH07CiAgRklYUF9EQkwgZ2xvYmFsVG9uYWxpdHkgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICBGSVhQX0RCTCBlbmVyZ3lCYW5kW1FNRl9DSEFOTkVMU107CiAgSU5UICAgICAgbWF4TkVuZXJneVZhbHVlczsgLyogbWF4LiBudW1iZXIgb2YgbWF4LiBlbmVyZ3kgdmFsdWVzICovCgogIC8qKiogU3VtIHVwIGVuZXJnaWVzIGZvciBlYWNoIGJhbmQgKioqLwogIEZES19BU1NFUlQobnVtYmVyQ29scz09MTV8fG51bWJlckNvbHM9PTE2KTsKICAvKiBudW1iZXJDb2xzIGlzIGFsd2F5cyAxNSBvciAxNiBmb3IgRUxELiBJbiBjYXNlIG9mIDE2IGJhbmRzLCB0aGUKICAgICAgZW5lcmd5QmFuZHMgYXJlIGluaXRpYWxpemVkIHdpdGggdGhlIFsxNV10aCBjb2x1bW4uCiAgICAgIFRoZSByZXN0IG9mIHRoZSBjb2x1bW4gZW5lcmdpZXMgYXJlIGFkZGVkIGluIHRoZSBuZXh0IHN0ZXAuICAgKi8KICBpZiAobnVtYmVyQ29scz09MTUpIHsKICAgIGZvciAoYj1zdGFydEJhbmQ7IGI8c3RvcEJhbmQ7IGIrKykgewogICAgICBlbmVyZ3lCYW5kW2JdPUZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKGI9c3RhcnRCYW5kOyBiPHN0b3BCYW5kOyBiKyspIHsKICAgICAgZW5lcmd5QmFuZFtiXT1FbmVyZ2llc1sxNV1bYl0+PjQ7CiAgICB9CiAgfQoKICBmb3IgKGs9MDsgazwxNTsgaysrKSB7CiAgICBmb3IgKGI9c3RhcnRCYW5kOyBiPHN0b3BCYW5kOyBiKyspIHsKICAgICAgZW5lcmd5QmFuZFtiXSArPSBFbmVyZ2llc1trXVtiXT4+NDsKICAgIH0KICB9CgogIC8qKiogRGV0ZXJtaW5lIDUgaGlnaGVzdCBiYW5kLWVuZXJnaWVzICoqKi8KICBtYXhORW5lcmd5VmFsdWVzID0gZk1pbihTQlJfTUFYX0VORVJHWV9WQUxVRVMsIHN0b3BCYW5kLXN0YXJ0QmFuZCk7CgogIC8qIEdldCBtaW4uIHZhbHVlIGluIGVuZXJneU1heCBhcnJheSAqLwogIGVuZXJneU1heE1pbiA9IGVuZXJneU1heFswXSA9IGVuZXJneUJhbmRbc3RhcnRCYW5kXTsKICBub19lbk1heEJhbmRbMF0gPSBzdGFydEJhbmQ7CiAgcG9zRW5lcmd5TWF4TWluID0gMDsKICBmb3IgKGs9MTsgazxtYXhORW5lcmd5VmFsdWVzOyBrKyspIHsKICAgIGVuZXJneU1heFtrXSA9IGVuZXJneUJhbmRbc3RhcnRCYW5kK2tdOwogICAgbm9fZW5NYXhCYW5kW2tdID0gc3RhcnRCYW5kK2s7CiAgICBpZiAoZW5lcmd5TWF4TWluID4gZW5lcmd5TWF4W2tdKSB7CiAgICAgIGVuZXJneU1heE1pbiA9IGVuZXJneU1heFtrXTsKICAgICAgcG9zRW5lcmd5TWF4TWluID0gazsKICAgIH0KICB9CgogIGZvciAoYj1zdGFydEJhbmQrbWF4TkVuZXJneVZhbHVlczsgYjxzdG9wQmFuZDsgYisrKSB7CiAgICBpZiAoZW5lcmd5QmFuZFtiXSA+IGVuZXJneU1heE1pbikgewogICAgICBlbmVyZ3lNYXhbcG9zRW5lcmd5TWF4TWluXSA9IGVuZXJneUJhbmRbYl07CiAgICAgIG5vX2VuTWF4QmFuZFtwb3NFbmVyZ3lNYXhNaW5dID0gYjsKCiAgICAgIC8qIEFnYWluLCBnZXQgbWluLiB2YWx1ZSBpbiBlbmVyZ3lNYXggYXJyYXkgKi8KICAgICAgZW5lcmd5TWF4TWluID0gZW5lcmd5TWF4WzBdOwogICAgICBwb3NFbmVyZ3lNYXhNaW4gPSAwOwogICAgICBmb3IgKGs9MTsgazxtYXhORW5lcmd5VmFsdWVzOyBrKyspIHsKICAgICAgICBpZiAoZW5lcmd5TWF4TWluID4gZW5lcmd5TWF4W2tdKSB7CiAgICAgICAgICBlbmVyZ3lNYXhNaW4gPSBlbmVyZ3lNYXhba107CiAgICAgICAgICBwb3NFbmVyZ3lNYXhNaW4gPSBrOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICAvKioqIEVuZCBkZXRlcm1pbmUgNSBoaWdoZXN0IGJhbmQtZW5lcmdpZXMgKioqLwoKICAvKiBHZXQgdG9uYWxpdHkgdmFsdWVzIGZvciA1IGhpZ2hlc3QgZW5lcmdpZXMgKi8KICBmb3IgKGU9MDsgZTxtYXhORW5lcmd5VmFsdWVzOyBlKyspIHsKICAgIHRvbmFsaXR5QmFuZFtlXT1GTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgIGZvciAoaz0wOyBrPG5vRXN0UGVyRnJhbWU7IGsrKykgewogICAgICB0b25hbGl0eUJhbmRbZV0gKz0gcXVvdGFNYXRyaXhbc3RhcnRJbmRleCArIGtdW25vX2VuTWF4QmFuZFtlXV0gPj4gMTsKICAgIH0KICAgIGdsb2JhbFRvbmFsaXR5ICs9IHRvbmFsaXR5QmFuZFtlXSA+PiAyOyAvKiBoZWFkcm9vbSBvZiAyKzEgKG1heC4gNSBhZGRpdGlvbnMpICovCiAgfQoKICByZXR1cm4gZ2xvYmFsVG9uYWxpdHk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgICAgICBDYWxjdWxhdGVzIGVuZXJneSBmb3JtIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0IG9mCiAgICAgICAgICAgICAgdGhlIFFNRiBzdWJzYW1wbGVzCgogIFxyZXR1cm4gICAgIG5vbmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkxOS19TRUNUSU9OX0NPREVfTDEKc3RhdGljIHZvaWQKRkRLc2JyRW5jX2dldEVuZXJneUZyb21DcGx4UW1mRGF0YShGSVhQX0RCTCAqKlJFU1RSSUNUIGVuZXJneVZhbHVlcywvKiE8IHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgcmVhbFZhbHVlcywgIC8qITwgdGhlIHJlYWwgcGFydCBvZiB0aGUgUU1GIHN1YnNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIGltYWdWYWx1ZXMsICAvKiE8IHRoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGUgUU1GIHN1YnNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBudW1iZXJCYW5kcywgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBRTUYgYmFuZHMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBudW1iZXJDb2xzLCAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBRTUYgc3Vic2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICpxbWZTY2FsZSwgICAgICAgICAgICAgICAgIC8qITwgc2NsZWZhY3RvciBvZiBRTUYgc3Vic2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICplbmVyZ3lTY2FsZSkgICAgICAgICAgICAgIC8qITwgc2NhbGVmYWN0b3Igb2YgZW5lcmdpZXMgKi8KewogIGludCBqLCBrOwogIGludCBzY2FsZTsKICBGSVhQX0RCTCBtYXhfdmFsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CgogIC8qIEdldCBTY3JhdGNoIGJ1ZmZlciAqLwogIENfQUxMT0NfU0NSQVRDSF9TVEFSVCh0bXBOcmcsIEZJWFBfREJMLCBRTUZfQ0hBTk5FTFMqUU1GX01BWF9USU1FX1NMT1RTLzIpOwoKICAvKiBHZXQgbWF4IHBvc3NpYmxlIHNjYWxpbmcgb2YgUU1GIGRhdGEgKi8KICBzY2FsZSA9IERGUkFDVF9CSVRTOwogIGZvciAoaz0wOyBrPG51bWJlckNvbHM7IGsrKykgewogICAgc2NhbGUgPSBmaXhNaW4oc2NhbGUsIGZpeE1pbihnZXRTY2FsZWZhY3RvcihyZWFsVmFsdWVzW2tdLCBudW1iZXJCYW5kcyksIGdldFNjYWxlZmFjdG9yKGltYWdWYWx1ZXNba10sIG51bWJlckJhbmRzKSkpOwogIH0KCiAgLyogVHdlYWsgc2NhbGluZyBzdGFiaWxpdHkgZm9yIHplcm8gc2lnbmFsIHRvIG5vbi16ZXJvIHNpZ25hbCB0cmFuc2l0aW9ucyAqLwogIGlmIChzY2FsZSA+PSBERlJBQ1RfQklUUy0xKSB7CiAgICBzY2FsZSA9IChGUkFDVF9CSVRTLTEtKnFtZlNjYWxlKTsKICB9CiAgLyogcHJldmVudCBzY2FsaW5nIG9mIFFGTSB2YWx1ZXMgdG8gLTEuZiAqLwogIHNjYWxlID0gZml4TWF4KDAsc2NhbGUtMSk7CgogIC8qIFVwZGF0ZSBRTUYgc2NhbGUgKi8KICAqcW1mU2NhbGUgKz0gc2NhbGU7CgogIC8qCiAgICAgQ2FsY3VsYXRlIGVuZXJneSBvZiBlYWNoIHRpbWUgc2xvdCBwYWlyLCBtYXggZW5lcmd5CiAgICAgYW5kIHNoaWZ0IFFNRiB2YWx1ZXMgYXMgZmFyIGFzIHBvc3NpYmxlIHRvIHRoZSBsZWZ0LgogICAqLwogIHsKICAgIEZJWFBfREJMICpucmdWYWx1ZXMgPSB0bXBOcmc7CiAgICBmb3IgKGs9MDsgazxudW1iZXJDb2xzOyBrKz0yKQogICAgewogICAgICAvKiBMb2FkIGJhbmQgdmVjdG9yIGFkZHJlc3NlcyBvZiAyIGNvbnNlY3V0aXZlIHRpbWVzbG90cyAqLwogICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcjAgPSByZWFsVmFsdWVzW2tdOwogICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgaTAgPSBpbWFnVmFsdWVzW2tdOwogICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcjEgPSByZWFsVmFsdWVzW2srMV07CiAgICAgIEZJWFBfREJMICpSRVNUUklDVCBpMSA9IGltYWdWYWx1ZXNbaysxXTsKICAgICAgZm9yIChqPTA7IGo8bnVtYmVyQmFuZHM7IGorKykKICAgICAgewogICAgICAgIEZJWFBfREJMICBlbmVyZ3k7CiAgICAgICAgRklYUF9EQkwgIHRyMCx0cjEsdGkwLHRpMTsKCiAgICAgICAgLyogUmVhZCBRTUYgdmFsdWVzIG9mIDIgdGltZXNsb3RzICovCiAgICAgICAgdHIwID0gcjBbal07IHRyMSA9IHIxW2pdOyB0aTAgPSBpMFtqXTsgdGkxID0gaTFbal07CgogICAgICAgIC8qIFNjYWxlIFFNRiBWYWx1ZXMgYW5kIENhbGMgRW5lcmd5IG9mIGJvdGggdGltZXNsb3RzICovCiAgICAgICAgdHIwIDw8PSBzY2FsZTsKICAgICAgICB0aTAgPDw9IHNjYWxlOwogICAgICAgIGVuZXJneSA9IGZQb3cyQWRkRGl2MihmUG93MkRpdjIodHIwKSwgdGkwKSA+PiAxOwoKICAgICAgICB0cjEgPDw9IHNjYWxlOwogICAgICAgIHRpMSA8PD0gc2NhbGU7CiAgICAgICAgZW5lcmd5ICs9IGZQb3cyQWRkRGl2MihmUG93MkRpdjIodHIxKSwgdGkxKSA+PiAxOwoKICAgICAgICAvKiBXcml0ZSB0aW1lc2xvdCBwYWlyIGVuZXJneSB0byBzY3JhdGNoICovCiAgICAgICAgKm5yZ1ZhbHVlcysrID0gZW5lcmd5OwogICAgICAgIG1heF92YWwgPSBmaXhNYXgobWF4X3ZhbCwgZW5lcmd5KTsKCiAgICAgICAgLyogV3JpdGUgYmFjayBzY2FsZWQgUU1GIHZhbHVlcyAqLwogICAgICAgIHIwW2pdID0gdHIwOyByMVtqXSA9IHRyMTsgaTBbal0gPSB0aTA7IGkxW2pdID0gdGkxOwogICAgICB9CiAgICB9CiAgfQogIC8qIGVuZXJneVNjYWxlOiBzY2FsZWZhY3RvciBlbmVyZ2llcyBvZiBjdXJyZW50IGZyYW1lICovCiAgKmVuZXJneVNjYWxlID0gMiooKnFtZlNjYWxlKS0xOyAgICAgICAvKiBpZiBxbWZTY2FsZSA+IDA6IG5yIG9mIHJpZ2h0IHNoaWZ0cyBvdGhlcndpc2UgbnIgb2YgbGVmdCBzaGlmdHMgKi8KCiAgLyogU2NhbGUgdGltZXNsb3QgcGFpciBlbmVyZ2llcyBhbmQgd3JpdGUgdG8gb3V0cHV0IGJ1ZmZlciAqLwogIHNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhtYXhfdmFsKTsKICB7CiAgCUZJWFBfREJMICpucmdWYWx1ZXMgPSB0bXBOcmc7CiAgICBmb3IgKGs9MDsgazxudW1iZXJDb2xzPj4xOyBrKyspIHsKICAgICAgc2NhbGVWYWx1ZXMoZW5lcmd5VmFsdWVzW2tdLCBucmdWYWx1ZXMsIG51bWJlckJhbmRzLCBzY2FsZSk7CiAgICAgIG5yZ1ZhbHVlcyArPSBudW1iZXJCYW5kczsKICAgIH0KICAgICplbmVyZ3lTY2FsZSArPSBzY2FsZTsKICB9CgogIC8qIEZyZWUgU2NyYXRjaCBidWZmZXIgKi8KICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHRtcE5yZywgRklYUF9EQkwsIFFNRl9DSEFOTkVMUypRTUZfTUFYX1RJTUVfU0xPVFMvMik7Cn0KCkxOS19TRUNUSU9OX0NPREVfTDEKc3RhdGljIHZvaWQKRkRLc2JyRW5jX2dldEVuZXJneUZyb21DcGx4UW1mRGF0YUZ1bGwoRklYUF9EQkwgKipSRVNUUklDVCBlbmVyZ3lWYWx1ZXMsLyohPCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipSRVNUUklDVCByZWFsVmFsdWVzLCAgLyohPCB0aGUgcmVhbCBwYXJ0IG9mIHRoZSBRTUYgc3Vic2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIGltYWdWYWx1ZXMsICAvKiE8IHRoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGUgUU1GIHN1YnNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgbnVtYmVyQmFuZHMsICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgUU1GIGJhbmRzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIG51bWJlckNvbHMsICAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIFFNRiBzdWJzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICpxbWZTY2FsZSwgICAgICAgICAgICAgICAgIC8qITwgc2NsZWZhY3RvciBvZiBRTUYgc3Vic2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAqZW5lcmd5U2NhbGUpICAgICAgICAgICAgICAvKiE8IHNjYWxlZmFjdG9yIG9mIGVuZXJnaWVzICovCnsKICBpbnQgaiwgazsKICBpbnQgc2NhbGU7CiAgRklYUF9EQkwgbWF4X3ZhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwoKICAvKiBHZXQgU2NyYXRjaCBidWZmZXIgKi8KICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQodG1wTnJnLCBGSVhQX0RCTCwgUU1GX01BWF9USU1FX1NMT1RTKlFNRl9DSEFOTkVMUy8yKTsKCiAgRkRLX0FTU0VSVChudW1iZXJCYW5kcyA8PSBRTUZfQ0hBTk5FTFMpOwogIEZES19BU1NFUlQobnVtYmVyQ29scyA8PSBRTUZfTUFYX1RJTUVfU0xPVFMvMik7CgogIC8qIEdldCBtYXggcG9zc2libGUgc2NhbGluZyBvZiBRTUYgZGF0YSAqLwogIHNjYWxlID0gREZSQUNUX0JJVFM7CiAgZm9yIChrPTA7IGs8bnVtYmVyQ29sczsgaysrKSB7CiAgICBzY2FsZSA9IGZpeE1pbihzY2FsZSwgZml4TWluKGdldFNjYWxlZmFjdG9yKHJlYWxWYWx1ZXNba10sIG51bWJlckJhbmRzKSwgZ2V0U2NhbGVmYWN0b3IoaW1hZ1ZhbHVlc1trXSwgbnVtYmVyQmFuZHMpKSk7CiAgfQoKICAvKiBUd2VhayBzY2FsaW5nIHN0YWJpbGl0eSBmb3IgemVybyBzaWduYWwgdG8gbm9uLXplcm8gc2lnbmFsIHRyYW5zaXRpb25zICovCiAgaWYgKHNjYWxlID49IERGUkFDVF9CSVRTLTEpIHsKICAgIHNjYWxlID0gKEZSQUNUX0JJVFMtMS0qcW1mU2NhbGUpOwogIH0KICAvKiBwcmV2ZW50IHNjYWxpbmcgb2YgUUZNIHZhbHVlcyB0byAtMS5mICovCiAgc2NhbGUgPSBmaXhNYXgoMCxzY2FsZS0xKTsKCiAgLyogVXBkYXRlIFFNRiBzY2FsZSAqLwogICpxbWZTY2FsZSArPSBzY2FsZTsKCiAgLyoKICAgICBDYWxjdWxhdGUgZW5lcmd5IG9mIGVhY2ggdGltZSBzbG90IHBhaXIsIG1heCBlbmVyZ3kKICAgICBhbmQgc2hpZnQgUU1GIHZhbHVlcyBhcyBmYXIgYXMgcG9zc2libGUgdG8gdGhlIGxlZnQuCiAgICovCiAgewogICAgRklYUF9EQkwgKm5yZ1ZhbHVlcyA9IHRtcE5yZzsKICAgIGZvciAoaz0wOyBrPG51bWJlckNvbHM7IGsrKykKICAgIHsKICAgICAgLyogTG9hZCBiYW5kIHZlY3RvciBhZGRyZXNzZXMgb2YgMiBjb25zZWN1dGl2ZSB0aW1lc2xvdHMgKi8KICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHIwID0gcmVhbFZhbHVlc1trXTsKICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIGkwID0gaW1hZ1ZhbHVlc1trXTsKICAgICAgZm9yIChqPTA7IGo8bnVtYmVyQmFuZHM7IGorKykKICAgICAgewogICAgICAgIEZJWFBfREJMICBlbmVyZ3k7CiAgICAgICAgRklYUF9EQkwgIHRyMCx0aTA7CgogICAgICAgIC8qIFJlYWQgUU1GIHZhbHVlcyBvZiAyIHRpbWVzbG90cyAqLwogICAgICAgIHRyMCA9IHIwW2pdOyB0aTAgPSBpMFtqXTsKCiAgICAgICAgLyogU2NhbGUgUU1GIFZhbHVlcyBhbmQgQ2FsYyBFbmVyZ3kgb2YgYm90aCB0aW1lc2xvdHMgKi8KICAgICAgICB0cjAgPDw9IHNjYWxlOwogICAgICAgIHRpMCA8PD0gc2NhbGU7CiAgICAgICAgZW5lcmd5ID0gZlBvdzJBZGREaXYyKGZQb3cyRGl2Mih0cjApLCB0aTApOwogICAgICAgICpucmdWYWx1ZXMrKyA9IGVuZXJneTsKCiAgICAgICAgbWF4X3ZhbCA9IGZpeE1heChtYXhfdmFsLCBlbmVyZ3kpOwoKICAgICAgICAvKiBXcml0ZSBiYWNrIHNjYWxlZCBRTUYgdmFsdWVzICovCiAgICAgICAgcjBbal0gPSB0cjA7IGkwW2pdID0gdGkwOwogICAgICB9CiAgICB9CiAgfQogIC8qIGVuZXJneVNjYWxlOiBzY2FsZWZhY3RvciBlbmVyZ2llcyBvZiBjdXJyZW50IGZyYW1lICovCiAgKmVuZXJneVNjYWxlID0gMiooKnFtZlNjYWxlKS0xOyAgICAgICAvKiBpZiBxbWZTY2FsZSA+IDA6IG5yIG9mIHJpZ2h0IHNoaWZ0cyBvdGhlcndpc2UgbnIgb2YgbGVmdCBzaGlmdHMgKi8KCiAgLyogU2NhbGUgdGltZXNsb3QgcGFpciBlbmVyZ2llcyBhbmQgd3JpdGUgdG8gb3V0cHV0IGJ1ZmZlciAqLwogIHNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhtYXhfdmFsKTsKICB7CiAgCUZJWFBfREJMICpucmdWYWx1ZXMgPSB0bXBOcmc7CiAgICBmb3IgKGs9MDsgazxudW1iZXJDb2xzOyBrKyspIHsKICAgICAgc2NhbGVWYWx1ZXMoZW5lcmd5VmFsdWVzW2tdLCBucmdWYWx1ZXMsIG51bWJlckJhbmRzLCBzY2FsZSk7CiAgICAgIG5yZ1ZhbHVlcyArPSBudW1iZXJCYW5kczsKICAgIH0KICAgICplbmVyZ3lTY2FsZSArPSBzY2FsZTsKICB9CgogIC8qIEZyZWUgU2NyYXRjaCBidWZmZXIgKi8KICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHRtcE5yZywgRklYUF9EQkwsIFFNRl9NQVhfVElNRV9TTE9UUypRTUZfQ0hBTk5FTFMvMik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIFF1YW50aXNhdGlvbiBvZiB0aGUgcGFub3JhbWEgdmFsdWUgKGJhbGFuY2UpCgogIFxyZXR1cm4gdGhlIHF1YW50aXplZCBwYW4gdmFsdWUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBJTlQKbWFwUGFub3JhbWEoSU5UIG5yZ1ZhbCwgICAgIC8qISBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBlbmVyZ3kgKi8KICAgICAgICAgICAgSU5UIGFtcFJlcywgICAgIC8qISBhbXBsaXR1ZGUgcmVzb2x1dGlvbiBbMS41LzNkQl0gKi8KICAgICAgICAgICAgSU5UICpxdWFudEVycm9yIC8qISBxdWFudGl6YXRpb24gZXJyb3Igb2YgZW5lcmd5IHZhbCovCiAgICAgICAgICAgKQp7CiAgaW50IGk7CiAgSU5UIG1pbl92YWwsIHZhbDsKICBVQ0hBUiBwYW5JbmRleDsKICBJTlQgc2lnbjsKCiAgc2lnbiA9IG5yZ1ZhbCA+IDAgPyAxIDogLTE7CgogIG5yZ1ZhbCAqPSBzaWduOwoKICBtaW5fdmFsID0gRkRLX0lOVF9NQVg7CiAgcGFuSW5kZXggPSAwOwogIGZvciAoaSA9IDA7IGkgPCBtYXhJbmRleFthbXBSZXNdOyBpKyspIHsKICAgIHZhbCA9IGZpeHBfYWJzICgobnJnVmFsIC0gKElOVClwYW5UYWJsZVthbXBSZXNdW2ldKSk7CgogICAgaWYgKHZhbCA8IG1pbl92YWwpIHsKICAgICAgbWluX3ZhbCA9IHZhbDsKICAgICAgcGFuSW5kZXggPSBpOwogICAgfQogIH0KCiAgKnF1YW50RXJyb3I9bWluX3ZhbDsKCiAgcmV0dXJuIHBhblRhYmxlW2FtcFJlc11bbWF4SW5kZXhbYW1wUmVzXS0xXSArIHNpZ24gKiBwYW5UYWJsZVthbXBSZXNdW3BhbkluZGV4XTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIFF1YW50aXNhdGlvbiBvZiB0aGUgbm9pc2UgZmxvb3IgbGV2ZWxzCgogIFxyZXR1cm4gdm9pZAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihTQ0hBUiAgICAqUkVTVFJJQ1QgaU5vaXNlTGV2ZWxzLCAvKiEgcXVhbnRpemVkIG5vaXNlIGxldmVscyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBOb2lzZUxldmVscywgIC8qISB0aGUgbm9pc2UgbGV2ZWxzICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICBjb3VwbGluZyAgICAgICAgICAgICAgIC8qISB0aGUgY291cGxpbmcgZmxhZyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgSU5UIGk7CiAgSU5UIHRtcCwgZHVtbXk7CgogIC8qIFF1YW50aXNhdGlvbiwgc2ltaWxhciB0byBzZmIgcXVhbnQuLi4gKi8KICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykgewogICAgLyogdG1wID0gTm9pc2VMZXZlbHNbaV0gPiAoUEZMT0FUKTMwLjBmID8gMzA6IChJTlQpIChOb2lzZUxldmVsc1tpXSArIChQRkxPQVQpMC41KTsgKi8KICAgIC8qIDMwPj42ID0gMC40Njg3NSAqLwogICAgaWYgKChGSVhQX0RCTClOb2lzZUxldmVsc1tpXSA+IEZMMkZYQ09OU1RfREJMKDAuNDY4NzVmKSkgewogICAgICB0bXAgPSAzMDsKICAgIH0KICAgIGVsc2UgewogICAgICAvKiB0bXAgPSAoSU5UKSgoRklYUF9EQkwpTm9pc2VMZXZlbHNbaV0gKyAoRkwyRlhDT05TVF9EQkwoMC41Zik+PigqLyAvKiBGUkFDVF9CSVRTKyAqLyAvKiA2LTEpKSk7Ki8KICAgICAgLyogdG1wID0gdG1wID4+IChERlJBQ1RfQklUUy0xLTYpOyAqLyAvKiBjb252ZXJzaW9uIHRvIGludGVnZXIgaGFwcGVucyBoZXJlICovCiAgICAgIC8qIHJvdW5kaW5nIGlzIGRvbmUgYnkgc2hpZnRpbmcgb25lIGJpdCBsZXNzIHRoYW4gbmVjZXNzYXJ5IHRvIHRoZSByaWdodCwgYWRkaW5nICcxJyBhbmQgdGhlbiBzaGlmdGluZyB0aGUgZmluYWwgYml0ICovCiAgICAgIHRtcCA9ICgoKChJTlQpTm9pc2VMZXZlbHNbaV0pPj4oREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSkgKTsgLyogY29udmVyc2lvbiB0byBpbnRlZ2VyICovCgkJCSBpZiAodG1wICE9IDApCgkJCSAgIHRtcCArPSAxOwogICAgfQoKICAgIGlmIChjb3VwbGluZykgewogICAgICB0bXAgPSB0bXAgPCAtMzAgPyAtMzAgOiB0bXA7CiAgICAgIHRtcCA9IG1hcFBhbm9yYW1hICh0bXAsMSwmZHVtbXkpOwogICAgfQogICAgaU5vaXNlTGV2ZWxzW2ldID0gdG1wOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCgogIFxicmllZiAgQ2FsY3VsYXRpb24gb2Ygbm9pc2UgZmxvb3IgZm9yIGNvdXBsaW5nCgogIFxyZXR1cm4gdm9pZAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKY291cGxlTm9pc2VGbG9vcihGSVhQX0RCTCAqUkVTVFJJQ1Qgbm9pc2VfbGV2ZWxfbGVmdCwgLyohIG5vaXNlIGxldmVsIGxlZnQgIChtb2RpZmllZCkqLwogICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBub2lzZV9sZXZlbF9yaWdodCAvKiEgbm9pc2UgbGV2ZWwgcmlnaHQgKG1vZGlmaWVkKSovCiAgICAgICAgICAgICAgICApCnsKICBGSVhQX0RCTCBjbXBWYWxMZWZ0LGNtcFZhbFJpZ2h0OwogIElOVCBpOwogIEZJWFBfREJMIHRlbXAxLHRlbXAyOwoKICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykgewoKICAgIC8qIENhbGN1bGF0aW9uIG9mIHRoZSBwb3dlciBmdW5jdGlvbiB1c2luZyBsZDY0OgogICAgICAgeiAgPSB4Xnk7CiAgICAgICB6JyA9IENhbGNMZDY0KHopID0geSpDYWxjTGQ2NCh4KS82NDsKICAgICAgIHogID0gQ2FsY0ludkxkNjQoeicpOwogICAgKi8KICAgIGNtcFZhbExlZnQgID0gTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gbm9pc2VfbGV2ZWxfbGVmdFtpXTsKICAgIGNtcFZhbFJpZ2h0ID0gTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gbm9pc2VfbGV2ZWxfcmlnaHRbaV07CgogICAgaWYgKGNtcFZhbFJpZ2h0IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKICAgICAgdGVtcDEgPSBDYWxjSW52TGREYXRhKE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIG5vaXNlX2xldmVsX3JpZ2h0W2ldKTsKICAgIH0KICAgIGVsc2UgewogICAgICB0ZW1wMSA9IENhbGNJbnZMZERhdGEoTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gbm9pc2VfbGV2ZWxfcmlnaHRbaV0pOwogICAgICB0ZW1wMSA9IHRlbXAxIDw8IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMSk7ICAvKiBJTlQgdG8gZnJhY3QgY29udmVyc2lvbiBvZiByZXN1bHQsIGlmIGlucHV0IG9mIENhbGNJbnZMZERhdGEgaXMgcG9zaXRpdiAqLwogICAgfQoKICAgIGlmIChjbXBWYWxMZWZ0IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKICAgICAgdGVtcDIgPSBDYWxjSW52TGREYXRhKE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIG5vaXNlX2xldmVsX2xlZnRbaV0pOwogICAgfQogICAgZWxzZSB7CiAgICAgIHRlbXAyID0gQ2FsY0ludkxkRGF0YShOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSBub2lzZV9sZXZlbF9sZWZ0W2ldKTsKICAgICAgdGVtcDIgPSB0ZW1wMiA8PCAoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZULTEpOyAgLyogSU5UIHRvIGZyYWN0IGNvbnZlcnNpb24gb2YgcmVzdWx0LCBpZiBpbnB1dCBvZiBDYWxjSW52TGREYXRhIGlzIHBvc2l0aXYgKi8KICAgIH0KCgogICAgaWYgKChjbXBWYWxMZWZ0IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIChjbXBWYWxSaWdodCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgewogICAgICBub2lzZV9sZXZlbF9sZWZ0W2ldICA9IE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIChDYWxjTGREYXRhKCgodGVtcDE+PjEpICsgKHRlbXAyPj4xKSkpKTsgLyogbm8gc2NhbGluZyBuZWVkZWQhIGJvdGggdmFsdWVzIGFyZSBkZnJhY3QgKi8KICAgICAgbm9pc2VfbGV2ZWxfcmlnaHRbaV0gPSBDYWxjTGREYXRhKHRlbXAyKSAtIENhbGNMZERhdGEodGVtcDEpOwogICAgfQoKICAgIGlmICgoY21wVmFsTGVmdCA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYgKGNtcFZhbFJpZ2h0ID49IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgewogICAgICBub2lzZV9sZXZlbF9sZWZ0W2ldICA9IE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIChDYWxjTGREYXRhKCgodGVtcDE+PjEpICsgKHRlbXAyPj4xKSkpICsgRkwyRlhDT05TVF9EQkwoMC4xMDkzNzVmKSk7IC8qIHNjYWxlZCB3aXRoIDcvNjQgKi8KICAgICAgbm9pc2VfbGV2ZWxfcmlnaHRbaV0gPSBDYWxjTGREYXRhKHRlbXAyKSAtIENhbGNMZERhdGEodGVtcDEpOwogICAgfQoKICAgIGlmICgoY21wVmFsTGVmdCA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYgKGNtcFZhbFJpZ2h0IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpKSB7CiAgICAgIG5vaXNlX2xldmVsX2xlZnRbaV0gID0gTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gKENhbGNMZERhdGEoKCh0ZW1wMT4+KDcrMSkpICsgKHRlbXAyPj4xKSkpICsgRkwyRlhDT05TVF9EQkwoMC4xMDkzNzVmKSk7IC8qIHNjYWxlZCB3aXRoIDcvNjQgKi8KICAgICAgbm9pc2VfbGV2ZWxfcmlnaHRbaV0gPSAoQ2FsY0xkRGF0YSh0ZW1wMikgKyBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NWYpKSAtIENhbGNMZERhdGEodGVtcDEpOwogICAgfQoKICAgIGlmICgoY21wVmFsTGVmdCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAmJiAoY21wVmFsUmlnaHQgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikpKSB7CiAgICAgIG5vaXNlX2xldmVsX2xlZnRbaV0gID0gTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gKENhbGNMZERhdGEoKCh0ZW1wMT4+MSkgKyAodGVtcDI+Pig3KzEpKSkpICsgRkwyRlhDT05TVF9EQkwoMC4xMDkzNzVmKSk7IC8qIHNjYWxlZCB3aXRoIDcvNjQgKi8KICAgICAgbm9pc2VfbGV2ZWxfcmlnaHRbaV0gPSBDYWxjTGREYXRhKHRlbXAyKSAtIChDYWxjTGREYXRhKHRlbXAxKSArIEZMMkZYQ09OU1RfREJMKDAuMTA5Mzc1ZikpOyAvKiBzY2FsZWQgd2l0aCA3LzY0ICovCiAgICB9CiAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKCiAgXGJyaWVmICBDYWxjdWxhdGlvbiBvZiBlbmVyZ3kgc3RhcnRpbmcgaW4gbG93ZXIgYmFuZCAobGkpIHVwIHRvIHVwcGVyIGJhbmQgKHVpKQogICAgICAgICAgb3ZlciBzbG90cyAoc3RhcnRfcG9zKSB0byAoc3RvcF9wb3MpCgogIFxyZXR1cm4gdm9pZAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEZJWFBfREJMCmdldEVudlNmYkVuZXJneShJTlQgbGksICAgICAgICAgICAgICAvKiEgbG93ZXIgYmFuZCAqLwogICAgICAgICAgICAgICAgSU5UIHVpLCAgICAgICAgICAgICAgLyohIHVwcGVyIGJhbmQgKi8KICAgICAgICAgICAgICAgIElOVCBzdGFydF9wb3MsICAgICAgIC8qISBzdGFydCBzbG90ICovCiAgICAgICAgICAgICAgICBJTlQgc3RvcF9wb3MsICAgICAgICAvKiEgc3RvcCBzbG90ICovCiAgICAgICAgICAgICAgICBJTlQgYm9yZGVyX3BvcywgICAgICAvKiEgc2xvdHMgc2NhbGluZyBib3JkZXIgKi8KICAgICAgICAgICAgICAgIEZJWFBfREJMICoqWUJ1ZmZlciwgIC8qISBzZmIgZW5lcmd5IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgSU5UIFlCdWZmZXJTelNoaWZ0LCAgLyohIEVuZXJneSBidWZmZXIgaW5kZXggc2NhbGUgKi8KICAgICAgICAgICAgICAgIElOVCBzY2FsZU5yZzAsICAgICAgIC8qISBzY2FsaW5nIG9mIGxvd2VyIHNsb3RzICovCiAgICAgICAgICAgICAgICBJTlQgc2NhbGVOcmcxKSAgICAgICAvKiEgc2NhbGluZyBvZiB1cHBlciBzbG90cyAqLwp7CiAgLyogdXNlIGR5bmFtaWMgc2NhbGluZyBmb3Igb3V0ZXIgZW5lcmd5IGxvb3A7CiAgICAgZW5lcmdpZXMgYXJlIGNyaXRpY2FsIGFuZCBldmVyeSBiaXQgaXMgaW1wb3J0YW50ICovCiAgaW50IHNjMCwgc2MxLCBrLCBsOwoKICBGSVhQX0RCTCBucmdTdW0sIG5yZzEsIG5yZzIsIGFjY3UxLCBhY2N1MjsKICBJTlQgZHluU2NhbGUsIGR5blNjYWxlMSwgZHluU2NhbGUyOwogIGlmKHVpLWxpPT0wKSBkeW5TY2FsZSA9IERGUkFDVF9CSVRTLTE7CiAgZWxzZQogIGR5blNjYWxlID0gQ2FsY0xkSW50KHVpLWxpKT4+KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCk7CgogIHNjMCA9IGZpeE1pbihzY2FsZU5yZzAsWV9OUkdfU0NBTEUpOyBzYzEgPSBmaXhNaW4oc2NhbGVOcmcxLFlfTlJHX1NDQUxFKTsKICAvKiBkeW5TY2FsZXsxLDJ9IGlzIHNldCBzdWNoIHRoYXQgdGhlIHJpZ2h0IHNoaWZ0IGJlbG93IGlzIHBvc2l0aXZlICovCiAgZHluU2NhbGUxID0gZml4TWluKChzY2FsZU5yZzAtc2MwKSxkeW5TY2FsZSk7CiAgZHluU2NhbGUyID0gZml4TWluKChzY2FsZU5yZzEtc2MxKSxkeW5TY2FsZSk7CiAgbnJnU3VtID0gYWNjdTEgPSBhY2N1MiA9IChGSVhQX0RCTCkwOwoKICBmb3IgKGsgPSBsaTsgayA8IHVpOyBrKyspIHsKICAgIG5yZzEgPSBucmcyID0gKEZJWFBfREJMKTA7CiAgICBmb3IgKGwgPSBzdGFydF9wb3M7IGwgPCBib3JkZXJfcG9zOyBsKyspIHsKICAgICAgbnJnMSArPSBZQnVmZmVyW2w+PllCdWZmZXJTelNoaWZ0XVtrXSA+PiBzYzA7CiAgICB9CiAgICBmb3IgKDsgbCA8IHN0b3BfcG9zOyBsKyspIHsKICAgICAgbnJnMiArPSBZQnVmZmVyW2w+PllCdWZmZXJTelNoaWZ0XVtrXSA+PiBzYzE7CiAgICB9CiAgICBhY2N1MSArPSAobnJnMT4+ZHluU2NhbGUxKTsKICAgIGFjY3UyICs9IChucmcyPj5keW5TY2FsZTIpOwogIH0KICAvKiBUaGlzIHNoaWZ0IGZhY3RvciBpcyBhbHdheXMgcG9zaXRpdmUuIFNlZSBjb21tZW50IGFib3ZlLiAqLwogIG5yZ1N1bSArPSAoIGFjY3UxID4+IGZpeE1pbigoc2NhbGVOcmcwLXNjMC1keW5TY2FsZTEpLChERlJBQ1RfQklUUy0xKSkgKQogICAgICAgICAgKyAgKCBhY2N1MiA+PiBmaXhNaW4oKHNjYWxlTnJnMS1zYzEtZHluU2NhbGUyKSwoREZSQUNUX0JJVFMtMSkpICk7CgogIHJldHVybiBucmdTdW07Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIEVuZXJneSBjb21wZW5zYXRpb24gaW4gbWlzc2luZyBoYXJtb25pYyBtb2RlCgogIFxyZXR1cm4gdm9pZAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEZJWFBfREJMCm1oTG93ZXJpbmdFbmVyZ3koRklYUF9EQkwgbnJnLCBJTlQgTSkKewogIC8qCiAgICAgQ29tcGVuc2F0aW5nIGZvciB0aGUgZmFjdCB0aGF0IHdlIGluIHRoZSBkZWNvZGVyIG1hcCB0aGUgImF2ZXJhZ2UgZW5lcmd5IHRvIGV2ZXJ5IFFNRgogICAgIGJhbmQsIGFuZCB1c2UgdGhpcyB3aGVuIHdlIGNhbGN1bGF0ZSB0aGUgYm9vc3QtZmFjdG9yLiBTaW5jZSB0aGUgbWFwcGVkIGVuZXJneSBpc24ndAogICAgIHRoZSBhdmVyYWdlIGVuZXJneSBidXQgdGhlIG1heGltdW0gZW5lcmd5IGluIGNhc2Ugb2YgbWlzc2luZyBoYXJtb25pYyBjcmVhdGlvbiwgd2Ugd2lsbAogICAgIGluIHRoZSBib29zdCBmdW5jdGlvbiBjYWxjdWxhdGUgdGhhdCB0b28gbXVjaCBsaW1pdGluZyBoYXMgYmVlbiBhcHBsaWVkIGFuZCBoZW5jZSB3ZSB3aWxsCiAgICAgYm9vc3QgdGhlIHNpZ25hbCBhbHRob3VnaCBpdCBpc24ndCBjYWxsZWQgZm9yLiBIZW5jZSB3ZSBuZWVkIHRvIGNvbXBlbnNhdGUgZm9yIHRoaXMgYnkKICAgICBsb3dlcmluZyB0aGUgdHJhbnNtaXR0ZWQgZW5lcmd5IHZhbHVlcyBmb3IgdGhlIHNpbmVzIHNvIHRoZXkgd2lsbCBnZXQgdGhlIGNvcnJlY3QgbGV2ZWwKICAgICBhZnRlciB0aGUgYm9vc3QgaXMgYXBwbGllZC4KICAqLwogIGlmKE0gPiAyKXsKICAgIElOVCB0bXBTY2FsZTsKICAgIHRtcFNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhucmcpOwogICAgbnJnIDw8PSB0bXBTY2FsZTsKICAgIG5yZyA9IGZNdWx0KG5yZywgRkwyRlhDT05TVF9EQkwoMC4zOTgxMDcyNjdmKSk7IC8qIFRoZSBtYXhpbXVtIGJvb3N0IGlzIDEuNTg0ODkzLCBzbyB0aGUgbWF4aW11bSBhdHRlbnVhdGlvbiBzaG91bGQgYmUgc3F1YXJlKDEvMS41ODQ4OTMpID0gMC4zOTgxMDcyNjcgKi8KICAgIG5yZyA+Pj0gdG1wU2NhbGU7CiAgfQogIGVsc2V7CiAgICBpZihNID4gMSl7CiAgICAgIG5yZyA+Pj0gMTsKICAgIH0KICB9CgogIHJldHVybiBucmc7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIEVuZXJneSBjb21wZW5zYXRpb24gaW4gbm9uZSBtaXNzaW5nIGhhcm1vbmljIG1vZGUKCiAgXHJldHVybiB2b2lkCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgRklYUF9EQkwgbm1oTG93ZXJpbmdFbmVyZ3koCiAgICAgICAgRklYUF9EQkwgbnJnLAogICAgICAgIGNvbnN0IEZJWFBfREJMIG5yZ1N1bSwKICAgICAgICBjb25zdCBJTlQgbnJnU3VtX3NjYWxlLAogICAgICAgIGNvbnN0IElOVCBNCiAgICAgICAgKQp7CiAgaWYgKG5yZz5GTDJGWENPTlNUX0RCTCgwKSkgewogICAgaW50IHNjPTA7CiAgICAvKiBnYWluID0gbnJnU3VtIC8gKG5yZyooTSsxKSkgKi8KICAgIEZJWFBfREJMIGdhaW4gPSBmTXVsdChmRGl2Tm9ybShucmdTdW0sIG5yZywgJnNjKSwgR2V0SW52SW50KE0rMSkpOwogICAgc2MgKz0gbnJnU3VtX3NjYWxlOwoKICAgIC8qIHJlZHVjZSBucmcgaWYgZ2FpbiBzbWFsbGVyIDEuZiAqLwogICAgaWYgKCAhKChzYz49MCkgJiYgKCBnYWluID4gKChGSVhQX0RCTClNQVhWQUxfREJMPj5zYykgKSkgKSB7CiAgICAgIG5yZyA9IGZNdWx0KHNjYWxlVmFsdWUoZ2FpbixzYyksIG5yZyk7CiAgICB9CiAgfQogIHJldHVybiBucmc7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIGNhbGN1bGF0ZXMgdGhlIGVudmVsb3BlIHZhbHVlcyBmcm9tIHRoZSBlbmVyZ2llcywgZGVwZW5kaW5nIG9uCiAgICAgICAgICBmcmFtaW5nIGFuZCBzdGVyZW8gbW9kZQoKICBccmV0dXJuIHZvaWQKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmNhbGN1bGF0ZVNickVudmVsb3BlIChGSVhQX0RCTCAqKlJFU1RSSUNUIFlCdWZmZXJMZWZ0LCAgLyohIGVuZXJneSBidWZmZXIgbGVmdCAqLwogICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipSRVNUUklDVCBZQnVmZmVyUmlnaHQsIC8qISBlbmVyZ3kgYnVmZmVyIHJpZ2h0ICovCiAgICAgICAgICAgICAgICAgICAgICBpbnQgKlJFU1RSSUNUIFlCdWZmZXJTY2FsZUxlZnQsICAgLyohIHNjYWxlIGVuZXJneSBidWZmZXIgbGVmdCAqLwogICAgICAgICAgICAgICAgICAgICAgaW50ICpSRVNUUklDVCBZQnVmZmVyU2NhbGVSaWdodCwgIC8qISBzY2FsZSBlbmVyZ3kgYnVmZmVyIHJpZ2h0ICovCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQlJfRlJBTUVfSU5GTyAqZnJhbWVfaW5mbywgLyohIGZyYW1lIGluZm8gdmVjdG9yICovCiAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqUkVTVFJJQ1Qgc2ZiX25yZ0xlZnQsICAgICAgLyohIHNmYiBlbmVyZ3kgYnVmZmVyIGxlZnQgKi8KICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpSRVNUUklDVCBzZmJfbnJnUmlnaHQsICAgICAvKiEgc2ZiIGVuZXJneSBidWZmZXIgcmlnaHQgKi8KICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgaF9jb24sICAgICAvKiEgaGFuZGxlIHRvIGNvbmZpZyBkYXRhICAgKi8KICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoX3NiciwgICAgICAgICAvKiEgZW52ZWxvcGUgY2hhbm5lbCBoYW5kbGUgKi8KICAgICAgICAgICAgICAgICAgICAgIFNCUl9TVEVSRU9fTU9ERSBzdGVyZW9Nb2RlLCAgICAgICAvKiEgc3RlcmVvIGNvZGluZyBtb2RlICovCiAgICAgICAgICAgICAgICAgICAgICBJTlQqIG1heFF1YW50RXJyb3IsICAgICAgICAgICAgICAgLyohIG1heGltdW0gcXVhbnRpemF0aW9uIGVycm9yLCBmb3IgcGFub3JhbWEuICovCiAgICAgICAgICAgICAgICAgICAgICBpbnQgWUJ1ZmZlclN6U2hpZnQpICAgICAgICAgICAgICAgLyohIEVuZXJneSBidWZmZXIgaW5kZXggc2NhbGUgKi8KCnsKICBpbnQgaSwgaiwgbSA9IDA7CiAgSU5UIG5vX29mX2JhbmRzLCBzdGFydF9wb3MsIHN0b3BfcG9zLCBsaSwgdWk7CiAgRlJFUV9SRVMgZnJlcV9yZXM7CgogIElOVCBjYSA9IDIgLSBoX3Nici0+ZW5jRW52RGF0YS5pbml0X3Nicl9hbXBfcmVzOwogIElOVCBvbmVCaXRMZXNzID0gMDsKICBpZiAoY2EgPT0gMikKICAgIG9uZUJpdExlc3MgPSAxOyAvKiBMRF9EQVRBX1NISUZUID0+IGxkNjQgc2NhbGluZzsgb25lIGJpdCBsZXNzIGZvciByb3VuZGluZyAqLwoKICBJTlQgcXVhbnRFcnJvcjsKICBJTlQgbkVudmVsb3BlcyA9IGZyYW1lX2luZm8tPm5FbnZlbG9wZXM7CiAgSU5UIHNob3J0X2VudiA9IGZyYW1lX2luZm8tPnNob3J0RW52IC0gMTsKICBJTlQgdGltZVN0ZXAgPSBoX3Nici0+c2JyRXh0cmFjdEVudmVsb3BlLnRpbWVfc3RlcDsKICBJTlQgY29tbW9uU2NhbGUsc2NhbGVMZWZ0MCxzY2FsZUxlZnQxOwogIElOVCBzY2FsZVJpZ2h0MD0wLHNjYWxlUmlnaHQxPTA7CgogIGNvbW1vblNjYWxlID0gZml4TWluKFlCdWZmZXJTY2FsZUxlZnRbMF0sWUJ1ZmZlclNjYWxlTGVmdFsxXSk7CgogIGlmIChzdGVyZW9Nb2RlID09IFNCUl9DT1VQTElORykgewogICAgY29tbW9uU2NhbGUgPSBmaXhNaW4oY29tbW9uU2NhbGUsWUJ1ZmZlclNjYWxlUmlnaHRbMF0pOwogICAgY29tbW9uU2NhbGUgPSBmaXhNaW4oY29tbW9uU2NhbGUsWUJ1ZmZlclNjYWxlUmlnaHRbMV0pOwogIH0KCiAgY29tbW9uU2NhbGUgPSBjb21tb25TY2FsZSAtIDc7CgogIHNjYWxlTGVmdDAgPSBZQnVmZmVyU2NhbGVMZWZ0WzBdIC0gY29tbW9uU2NhbGU7CiAgc2NhbGVMZWZ0MSA9IFlCdWZmZXJTY2FsZUxlZnRbMV0gLSBjb21tb25TY2FsZSA7CiAgRkRLX0FTU0VSVCAoKHNjYWxlTGVmdDAgPj0gMCkgJiYgKHNjYWxlTGVmdDEgPj0gMCkpOwoKICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKICAgIHNjYWxlUmlnaHQwID0gWUJ1ZmZlclNjYWxlUmlnaHRbMF0gLSBjb21tb25TY2FsZTsKICAgIHNjYWxlUmlnaHQxID0gWUJ1ZmZlclNjYWxlUmlnaHRbMV0gLSBjb21tb25TY2FsZTsKICAgIEZES19BU1NFUlQgKChzY2FsZVJpZ2h0MCA+PSAwKSAmJiAoc2NhbGVSaWdodDEgPj0gMCkpOwogICAgKm1heFF1YW50RXJyb3IgPSAwOwogIH0KCiAgZm9yIChpID0gMDsgaSA8IG5FbnZlbG9wZXM7IGkrKykgewoKICAgIEZJWFBfREJMIHBOcmdMZWZ0W1FNRl9NQVhfVElNRV9TTE9UU107CiAgICBGSVhQX0RCTCBwTnJnUmlnaHRbUU1GX01BWF9USU1FX1NMT1RTXTsKICAgIGludCBlbnZOcmdfc2NhbGU7CiAgICBGSVhQX0RCTCBlbnZOcmdMZWZ0ICA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgRklYUF9EQkwgZW52TnJnUmlnaHQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgIGludCAgICAgIG1pc3NpbmdIYXJtb25pY1tRTUZfTUFYX1RJTUVfU0xPVFNdOwogICAgaW50ICAgICAgY291bnRbUU1GX01BWF9USU1FX1NMT1RTXTsKCiAgICBzdGFydF9wb3MgPSB0aW1lU3RlcCAqIGZyYW1lX2luZm8tPmJvcmRlcnNbaV07CiAgICBzdG9wX3BvcyA9IHRpbWVTdGVwICogZnJhbWVfaW5mby0+Ym9yZGVyc1tpICsgMV07CiAgICBmcmVxX3JlcyA9IGZyYW1lX2luZm8tPmZyZXFSZXNbaV07CiAgICBub19vZl9iYW5kcyA9IGhfY29uLT5uU2ZiW2ZyZXFfcmVzXTsKICAgIGVudk5yZ19zY2FsZSA9IERGUkFDVF9CSVRTLWZOb3JteigoRklYUF9EQkwpbm9fb2ZfYmFuZHMpOwoKICAgIGlmIChpID09IHNob3J0X2VudikgewogICAgICBzdG9wX3BvcyAtPSBmaXhNYXgoMiwgdGltZVN0ZXApOyAgLyogY29uc2lkZXIgYXQgbGVhc3QgMiBRTUYgc2xvdHMgbGVzcyBmb3Igc2hvcnQgZW52ZWxvcGVzIChlbnZlbG9wZXMganVzdCBiZWZvcmUgdHJhbnNpZW50cykgKi8KICAgIH0KCiAgICBmb3IgKGogPSAwOyBqIDwgbm9fb2ZfYmFuZHM7IGorKykgewogICAgICBGSVhQX0RCTCBucmdMZWZ0ICA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICBGSVhQX0RCTCBucmdSaWdodCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwoKICAgICAgbGkgPSBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtmcmVxX3Jlc11bal07CiAgICAgIHVpID0gaF9jb24tPmZyZXFCYW5kVGFibGVbZnJlcV9yZXNdW2ogKyAxXTsKCiAgICAgIGlmKGZyZXFfcmVzID09IEZSRVFfUkVTX0hJR0gpewogICAgICAgIGlmKGogPT0gMCAmJiB1aS1saSA+IDEpewogICAgICAgICAgbGkrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZXsKICAgICAgICBpZihqID09IDAgJiYgdWktbGkgPiAyKXsKICAgICAgICAgIGxpKys7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKgogICAgICAgIEZpbmQgb3V0IHdoZXRoZXIgYSBzaW5lIHdpbGwgYmUgbWlzc2luZyBpbiB0aGUgc2NhbGUtZmFjdG9yCiAgICAgICAgYmFuZCB0aGF0IHdlJ3JlIGN1cnJlbnRseSBwcm9jZXNzaW5nLgogICAgICAqLwogICAgICBtaXNzaW5nSGFybW9uaWNbal0gPSAwOwoKICAgICAgaWYoaF9zYnItPmVuY0VudkRhdGEuYWRkSGFybW9uaWNGbGFnKXsKCiAgICAgICAgaWYoZnJlcV9yZXMgPT0gRlJFUV9SRVNfSElHSCl7CiAgICAgICAgICBpZihoX3Nici0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY1tqXSl7ICAgIC8qQSBtaXNzaW5nIHNpbmUgaW4gdGhlIGN1cnJlbnQgYmFuZCovCiAgICAgICAgICAgIG1pc3NpbmdIYXJtb25pY1tqXSA9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICBJTlQgaTsKICAgICAgICAgIElOVCBzdGFydEJhbmRIaWdoID0gMDsKICAgICAgICAgIElOVCBzdG9wQmFuZEhpZ2ggPSAwOwoKICAgICAgICAgIHdoaWxlKGhfY29uLT5mcmVxQmFuZFRhYmxlW0ZSRVFfUkVTX0hJR0hdW3N0YXJ0QmFuZEhpZ2hdIDwgaF9jb24tPmZyZXFCYW5kVGFibGVbRlJFUV9SRVNfTE9XXVtqXSkKICAgICAgICAgICAgc3RhcnRCYW5kSGlnaCsrOwogICAgICAgICAgd2hpbGUoaF9jb24tPmZyZXFCYW5kVGFibGVbRlJFUV9SRVNfSElHSF1bc3RvcEJhbmRIaWdoXSA8IGhfY29uLT5mcmVxQmFuZFRhYmxlW0ZSRVFfUkVTX0xPV11baiArIDFdKQogICAgICAgICAgICBzdG9wQmFuZEhpZ2grKzsKCiAgICAgICAgICBmb3IoaSA9IHN0YXJ0QmFuZEhpZ2g7IGk8c3RvcEJhbmRIaWdoOyBpKyspewogICAgICAgICAgICBpZihoX3Nici0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY1tpXSl7CiAgICAgICAgICAgICAgbWlzc2luZ0hhcm1vbmljW2pdID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoKICAgICAgICBJZiBhIHNpbmUgaXMgbWlzc2luZyBpbiBhIHNjYWxlZmFjdG9yYmFuZCwgd2l0aCBtb3JlIHRoYW4gb25lIHFtZiBjaGFubmVsCiAgICAgICAgdXNlIHRoZSBucmcgZnJvbSB0aGUgY2hhbm5lbCB3aXRoIHRoZSBsYXJnZXN0IG5yZyByYXRoZXIgdGhhbiB0aGUgbWVhbi4KICAgICAgICBDb21wZW5zYXRlIGZvciB0aGUgYm9vc3QgY2FsY3VsYXRpb24gaW4gdGhlIGRlY2RvZGVyLgogICAgICAqLwogICAgICBpbnQgYm9yZGVyX3BvcyA9IGZpeE1pbihzdG9wX3BvcywgaF9zYnItPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyV3JpdGVPZmZzZXQ8PFlCdWZmZXJTelNoaWZ0KTsKCiAgICAgIGlmKG1pc3NpbmdIYXJtb25pY1tqXSl7CgogICAgICAgIGludCBrOwogICAgICAgIGNvdW50W2pdID0gc3RvcF9wb3MgLSBzdGFydF9wb3M7CiAgICAgICAgbnJnTGVmdCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwoKICAgICAgICBmb3IgKGsgPSBsaTsgayA8IHVpOyBrKyspIHsKICAgICAgICAgIEZJWFBfREJMIHRtcE5yZzsKICAgICAgICAgIHRtcE5yZyA9IGdldEVudlNmYkVuZXJneShrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsrMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcF9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUxlZnQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlTGVmdDEpOwoKICAgICAgICAgIG5yZ0xlZnQgPSBmaXhNYXgobnJnTGVmdCwgdG1wTnJnKTsKICAgICAgICB9CgogICAgICAgIC8qIEVuZXJneSBsb3dlcmluZyBjb21wZW5zYXRpb24gKi8KICAgICAgICBucmdMZWZ0ID0gbWhMb3dlcmluZ0VuZXJneShucmdMZWZ0LCB1aS1saSk7CgogICAgICAgIGlmIChzdGVyZW9Nb2RlID09IFNCUl9DT1VQTElORykgewoKICAgICAgICAgIG5yZ1JpZ2h0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CgogICAgICAgICAgZm9yIChrID0gbGk7IGsgPCB1aTsgaysrKSB7CiAgICAgICAgICAgIEZJWFBfREJMIHRtcE5yZzsKICAgICAgICAgICAgdG1wTnJnID0gZ2V0RW52U2ZiRW5lcmd5KGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcl9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlUmlnaHQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVSaWdodDEpOwoKICAgICAgICAgICAgbnJnUmlnaHQgPSBmaXhNYXgobnJnUmlnaHQsIHRtcE5yZyk7CiAgICAgICAgICB9CgogICAgICAgICAgLyogRW5lcmd5IGxvd2VyaW5nIGNvbXBlbnNhdGlvbiAqLwogICAgICAgICAgbnJnUmlnaHQgPSBtaExvd2VyaW5nRW5lcmd5KG5yZ1JpZ2h0LCB1aS1saSk7CiAgICAgICAgfQogICAgICB9IC8qIGVuZCBtaXNzaW5nSGFybW9uaWMgKi8KICAgICAgZWxzZXsKICAgICAgICBjb3VudFtqXSA9IChzdG9wX3BvcyAtIHN0YXJ0X3BvcykgKiAodWkgLSBsaSk7CgogICAgICAgIG5yZ0xlZnQgPSBnZXRFbnZTZmJFbmVyZ3kobGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BfcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUxlZnQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVMZWZ0MSk7CgogICAgICAgIGlmIChzdGVyZW9Nb2RlID09IFNCUl9DT1VQTElORykgewogICAgICAgICAgbnJnUmlnaHQgPSBnZXRFbnZTZmJFbmVyZ3kobGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BfcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJTelNoaWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVSaWdodDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVJpZ2h0MSk7CiAgICAgICAgfQogICAgICB9IC8qICFtaXNzaW5nSGFybW9uaWMgKi8KCiAgICAgIC8qIHNhdmUgZW5lcmdpZXMgKi8KICAgICAgcE5yZ0xlZnRbal0gID0gbnJnTGVmdDsKICAgICAgcE5yZ1JpZ2h0W2pdID0gbnJnUmlnaHQ7CiAgICAgIGVudk5yZ0xlZnQgICs9IChucmdMZWZ0Pj5lbnZOcmdfc2NhbGUpOwogICAgICBlbnZOcmdSaWdodCArPSAobnJnUmlnaHQ+PmVudk5yZ19zY2FsZSk7CiAgICB9IC8qIGogKi8KCiAgICBmb3IgKGogPSAwOyBqIDwgbm9fb2ZfYmFuZHM7IGorKykgewoKICAgICAgRklYUF9EQkwgbnJnTGVmdDIgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgRklYUF9EQkwgbnJnTGVmdCAgPSBwTnJnTGVmdFtqXTsKICAgICAgRklYUF9EQkwgbnJnUmlnaHQgPSBwTnJnUmlnaHRbal07CgogICAgICAvKiBOb25lIG1pc3NpbmcgaGFybW9uaWMgRW5lcmd5IGxvd2VyaW5nIGNvbXBlbnNhdGlvbiAqLwogICAgICBpZighbWlzc2luZ0hhcm1vbmljW2pdICYmIGhfc2JyLT5mTGV2ZWxQcm90ZWN0KSB7CiAgICAgICAgLyogaW4gY2FzZSBvZiBtaXNzaW5nIGVuZXJneSBpbiBiYXNlIGJhbmQsCiAgICAgICAgICAgcmVkdWNlIHJlZmVyZW5jZSBlbmVyZ3kgdG8gcHJldmVudCBvdmVyZmxvd3MgaW4gZGVjb2RlciBvdXRwdXQgKi8KICAgICAgICBucmdMZWZ0ID0gbm1oTG93ZXJpbmdFbmVyZ3kobnJnTGVmdCwgZW52TnJnTGVmdCwgZW52TnJnX3NjYWxlLCBub19vZl9iYW5kcyk7CiAgICAgICAgaWYgKHN0ZXJlb01vZGUgPT0gU0JSX0NPVVBMSU5HKSB7CiAgICAgICAgICBucmdSaWdodCA9IG5taExvd2VyaW5nRW5lcmd5KG5yZ1JpZ2h0LCBlbnZOcmdSaWdodCwgZW52TnJnX3NjYWxlLCBub19vZl9iYW5kcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKICAgICAgICAvKiBjYWxjIG9wZXJhdGlvbiBsYXRlciB3aXRoIGxvZyAqLwogICAgICAgIG5yZ0xlZnQyID0gbnJnTGVmdDsKICAgICAgICBucmdMZWZ0ID0gKG5yZ1JpZ2h0ICsgbnJnTGVmdCkgPj4gMTsKICAgICAgfQoKICAgICAgLyogbnJnTGVmdCA9IGYyMF9sb2cyKG5yZ0xlZnQgLyAoUEZMT0FUKShjb3VudCAqIGhfc2JyLT5zYnJRbWYubm9fY2hhbm5lbHMpKSsoUEZMT0FUKTQ0OyAqLwogICAgICAvKiBJZiBucmdMZWZ0ID09IDAgdGhlbiB0aGUgTG9nIGNhbGN1bGF0aW9ucyBiZWxvdyBkbyBmYWlsLiAqLwogICAgICBpZiAobnJnTGVmdCA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKQogICAgICB7CiAgICAgICAgRklYUF9EQkwgdG1wMCx0bXAxLHRtcDIsdG1wMzsKICAgICAgICBJTlQgdG1wU2NhbGU7CgogICAgICAgIHRtcFNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhucmdMZWZ0KTsKICAgICAgICBucmdMZWZ0ID0gbnJnTGVmdCA8PCB0bXBTY2FsZTsKCiAgICAgICAgdG1wMCA9IENhbGNMZERhdGEobnJnTGVmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlZCBieSAxLzY0ICovCiAgICAgICAgdG1wMSA9ICgoRklYUF9EQkwpIChjb21tb25TY2FsZSt0bXBTY2FsZSkpIDw8IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMSk7ICAgIC8qIHNjYWxlZCBieSAxLzY0ICovCiAgICAgICAgdG1wMiA9ICgoRklYUF9EQkwpKGNvdW50W2pdKmhfY29uLT5ub1FtZkJhbmRzKSkgPDwgKERGUkFDVF9CSVRTLTEtMTQtMSk7CiAgICAgICAgdG1wMiA9IENhbGNMZERhdGEodG1wMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlZCBieSAxLzY0ICovCiAgICAgICAgdG1wMyA9IEZMMkZYQ09OU1RfREJMKDAuNjg3NWYtMC4yMTg3NWYtMC4wMTU2MjVmKT4+MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlZCBieSAxLzY0ICovCgogICAgICAgIG5yZ0xlZnQgPSAoKHRtcDAtdG1wMik+PjEpICsgKHRtcDMgLSB0bXAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBucmdMZWZ0ID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOwogICAgICB9CgogICAgICAvKiBsZDY0IHRvIGludGVnZXIgY29udmVyc2lvbiAqLwogICAgICBucmdMZWZ0ID0gZml4TWluKGZpeE1heChucmdMZWZ0LEZMMkZYQ09OU1RfREJMKDAuMGYpKSwoRkwyRlhDT05TVF9EQkwoMC41Zik+Pm9uZUJpdExlc3MpKTsKICAgICAgbnJnTGVmdCA9IChGSVhQX0RCTCkoTE9ORylucmdMZWZ0ID4+IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMS1vbmVCaXRMZXNzLTEpOwogICAgICBzZmJfbnJnTGVmdFttXSA9ICgoSU5UKW5yZ0xlZnQrMSk+PjE7IC8qIHJvdW5kaW5nICovCgogICAgICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKICAgICAgICBGSVhQX0RCTCBzY2FsZUZyYWN0OwogICAgICAgIGludCBzYzAsIHNjMTsKCiAgICAgICAgbnJnTGVmdDIgPSBmaXhNYXgoKEZJWFBfREJMKTB4MSwgbnJnTGVmdDIpOwogICAgICAgIG5yZ1JpZ2h0ID0gZml4TWF4KChGSVhQX0RCTCkweDEsIG5yZ1JpZ2h0KTsKCiAgICAgICAgc2MwID0gQ291bnRMZWFkaW5nQml0cyhucmdMZWZ0Mik7CiAgICAgICAgc2MxID0gQ291bnRMZWFkaW5nQml0cyhucmdSaWdodCk7CgogICAgICAgIHNjYWxlRnJhY3QgPSAoKEZJWFBfREJMKShzYzAtc2MxKSkgPDwgKERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCk7IC8qIHNjYWxlIHZhbHVlIGluIGxkNjQgcmVwcmVzZW50YXRpb24gKi8KICAgICAgICBucmdSaWdodCA9IENhbGNMZERhdGEobnJnTGVmdDI8PHNjMCkgLSBDYWxjTGREYXRhKG5yZ1JpZ2h0PDxzYzEpIC0gc2NhbGVGcmFjdDsKCiAgICAgICAgLyogbGQ2NCB0byBpbnRlZ2VyIGNvbnZlcnNpb24gKi8KICAgICAgICBucmdSaWdodCA9IChGSVhQX0RCTCkoTE9ORykobnJnUmlnaHQpID4+IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMS1vbmVCaXRMZXNzKTsKICAgICAgICBucmdSaWdodCAgPSAobnJnUmlnaHQrKEZJWFBfREJMKTEpPj4xOyAvKiByb3VuZGluZyAqLwoKICAgICAgICBzZmJfbnJnUmlnaHRbbV0gPSBtYXBQYW5vcmFtYSAobnJnUmlnaHQsaF9zYnItPmVuY0VudkRhdGEuaW5pdF9zYnJfYW1wX3JlcywmcXVhbnRFcnJvcik7CgogICAgICAgICptYXhRdWFudEVycm9yID0gZml4TWF4KHF1YW50RXJyb3IsICptYXhRdWFudEVycm9yKTsKICAgICAgfQoKICAgICAgbSsrOwogICAgfSAvKiBqICovCgogICAgIC8qIERvIGVuZXJneSBjb21wZW5zYXRpb24gZm9yIHNpbmVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdHdvCiAgICAgICAgIFFNRi1iYW5kcyBpbiB0aGUgb3JpZ2luYWwsIGJ1dCB3aWxsIG9ubHkgb2NjdXIgaW4gb25lIGJhbmQgaW4KICAgICAgICAgdGhlIGRlY29kZXIgZHVlIHRvIHRoZSBzeW50aGV0aWMgc2luZSBjb2RpbmcuKi8KICAgIGlmIChoX2Nvbi0+dXNlUGFyYW1ldHJpY0NvZGluZykgewogICAgICBtLT1ub19vZl9iYW5kczsKICAgICAgZm9yIChqID0gMDsgaiA8IG5vX29mX2JhbmRzOyBqKyspIHsKICAgICAgICBpZiAoZnJlcV9yZXM9PUZSRVFfUkVTX0hJR0ggJiYgaF9zYnItPnNickV4dHJhY3RFbnZlbG9wZS5lbnZlbG9wZUNvbXBlbnNhdGlvbltqXSl7CiAgICAgICAgICBzZmJfbnJnTGVmdFttXSAtPSAoY2EgKiBmaXhwX2FicygoSU5UKWhfc2JyLT5zYnJFeHRyYWN0RW52ZWxvcGUuZW52ZWxvcGVDb21wZW5zYXRpb25bal0pKTsKICAgICAgICB9CiAgICAgICAgc2ZiX25yZ0xlZnRbbV0gPSBmaXhNYXgoMCwgc2ZiX25yZ0xlZnRbbV0pOwogICAgICAgIG0rKzsKICAgICAgfQogICAgfSAvKiB1c2VQYXJhbWV0cmljQ29kaW5nICovCgogIH0gLyogaSovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIGNhbGN1bGF0ZXMgdGhlIG5vaXNlIGZsb29yIGFuZCB0aGUgZW52ZWxvcGUgdmFsdWVzIGZyb20gdGhlCiAgICAgICAgICBlbmVyZ2llcywgZGVwZW5kaW5nIG9uIGZyYW1pbmcgYW5kIHN0ZXJlbyBtb2RlCgogIEZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUgaXMgdGhlIG1haW4gZnVuY3Rpb24gZm9yIGVuY29kaW5nIGFuZCB3cml0aW5nIHRoZQogIGVudmVsb3BlIGFuZCB0aGUgbm9pc2UgZmxvb3IuIFRoZSBmdW5jdGlvbiBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHByb2Nlc3NlczoKCiAgLUFuYWx5c2lzIHN1YmJhbmQgZmlsdGVyaW5nLgogIC1FbmNvZGluZyBTQSBhbmQgcGFuIHBhcmFtZXRlcnMgKGlmIGVuYWJsZWQpLgogIC1UcmFuc2llbnQgZGV0ZWN0aW9uLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCkxOS19TRUNUSU9OX0NPREVfTDEKdm9pZApGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMSAoCiAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSBoX2NvbiwgLyohIGhhbmRsZSB0byBjb25maWcgZGF0YSAgICovCiAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgc2JyQml0c3RyZWFtRGF0YSwKICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgaEVudkNoYW4sCiAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBIGhDbW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICBTQlJfRU5WX1RFTVBfREFUQSAgICplRGF0YSwKICAgICAgICAgICAgICAgICAgICBTQlJfRlJBTUVfVEVNUF9EQVRBICpmRGF0YQogICAgICAgICAgICAgICAgICAgKQp7CgogIEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSBzYnJFeHRyRW52ID0gJmhFbnZDaGFuLT5zYnJFeHRyYWN0RW52ZWxvcGU7CgogIGlmIChzYnJFeHRyRW52LT5ZQnVmZmVyU3pTaGlmdCA9PSAwKQogICAgRkRLc2JyRW5jX2dldEVuZXJneUZyb21DcGx4UW1mRGF0YUZ1bGwoJnNickV4dHJFbnYtPllCdWZmZXJbc2JyRXh0ckVudi0+WUJ1ZmZlcldyaXRlT2Zmc2V0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPnJCdWZmZXIgKyBzYnJFeHRyRW52LT5yQnVmZmVyUmVhZE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPmlCdWZmZXIgKyBzYnJFeHRyRW52LT5yQnVmZmVyUmVhZE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5ub1FtZkJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+bm9fY29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5xbWZTY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNickV4dHJFbnYtPllCdWZmZXJTY2FsZVsxXSk7CiAgZWxzZQogICAgRkRLc2JyRW5jX2dldEVuZXJneUZyb21DcGx4UW1mRGF0YSgmc2JyRXh0ckVudi0+WUJ1ZmZlcltzYnJFeHRyRW52LT5ZQnVmZmVyV3JpdGVPZmZzZXRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5yQnVmZmVyICsgc2JyRXh0ckVudi0+ckJ1ZmZlclJlYWRPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPmlCdWZmZXIgKyBzYnJFeHRyRW52LT5yQnVmZmVyUmVhZE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPm5vUW1mQmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPm5vX2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5xbWZTY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2JyRXh0ckVudi0+WUJ1ZmZlclNjYWxlWzFdKTsKCgoKICAvKgogICAgUHJlY2FsY3VsYXRpb24gb2YgVG9uYWxpdHkgUXVvdGFzICBDT0VGRiBUcmFuc2Zvcm0gT0sKICAqLwogIEZES3NickVuY19DYWxjdWxhdGVUb25hbGl0eVF1b3RhcygmaEVudkNoYW4tPlRvbkNvcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5yQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+aUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5mcmVxQmFuZFRhYmxlW0hJXVtoX2Nvbi0+blNmYltISV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkNoYW4tPnFtZlNjYWxlKTsKCgogIGlmKGhfY29uLT5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSB7CiAgICBGSVhQX0RCTCB0b25hbGl0eSA9IEZES3NickVuY19HZXRUb25hbGl0eSAoCiAgICAgICAgICBoRW52Q2hhbi0+VG9uQ29yci5xdW90YU1hdHJpeCwKICAgICAgICAgIGhFbnZDaGFuLT5Ub25Db3JyLm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUsCiAgICAgICAgICBoRW52Q2hhbi0+VG9uQ29yci5zdGFydEluZGV4TWF0cml4LAogICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlciArIHNickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldCwKICAgICAgICAgIGhfY29uLT5mcmVxQmFuZFRhYmxlW0hJXVswXSsxLAogICAgICAgICAgaF9jb24tPm5vUW1mQmFuZHMsCiAgICAgICAgICBzYnJFeHRyRW52LT5ub19jb2xzCiAgICAgICAgKTsKCiAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS50b25fSEZbMV0gPSBoRW52Q2hhbi0+ZW5jRW52RGF0YS50b25fSEZbMF07CiAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS50b25fSEZbMF0gPSB0b25hbGl0eTsKCiAgICAvKiB0b25hbGl0eSBpcyBzY2FsZWQgYnkgMl4xOS8wLjUyNDI4OGYgKGZyYWN0IHBhcnQgb2YgUkVMQVhBVElPTikgKi8KICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmdsb2JhbF90b25hbGl0eSA9IChoRW52Q2hhbi0+ZW5jRW52RGF0YS50b25fSEZbMF0+PjEpICsgKGhFbnZDaGFuLT5lbmNFbnZEYXRhLnRvbl9IRlsxXT4+MSk7CiAgfQoKCgogIC8qCiAgICBUcmFuc2llbnQgZGV0ZWN0aW9uIENPRUZGIFRyYW5zZm9ybSBPSwogICovCiAgaWYoaF9jb24tPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpCiAgewogICAgRkRLc2JyRW5jX2Zhc3RUcmFuc2llbnREZXRlY3QoCiAgICAgICAgICAgICZoRW52Q2hhbi0+c2JyRmFzdFRyYW5zaWVudERldGVjdG9yLAogICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlciwKICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJTY2FsZSwKICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldCwKICAgICAgICAgICAgIGVEYXRhLT50cmFuc2llbnRfaW5mbwogICAgICAgICAgICAgKTsKCiAgfQogIGVsc2UKICB7CiAgRkRLc2JyRW5jX3RyYW5zaWVudERldGVjdCgmaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlclNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhLT50cmFuc2llbnRfaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyV3JpdGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlclN6U2hpZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+dGltZV9zdGVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZDaGFuLT5TYnJFbnZGcmFtZS5mcmFtZU1pZGRsZVNsb3QpOwogIH0KCgoKICAvKgogICAgR2VuZXJhdGUgZmxhZ3MgZm9yIDIgZW52IGluIGEgRklYRklYLWZyYW1lLgogICAgUmVtb3ZlIHRoaXMgZnVuY3Rpb24gdG8gZ2V0IGFsd2F5cyAxIGVudiBwZXIgRklYRklYLWZyYW1lLgogICovCgogIC8qCiAgICBmcmFtZSBTcGxpdHRlciBDT0VGRiBUcmFuc2Zvcm0gT0sKICAqLwogIEZES3NickVuY19mcmFtZVNwbGl0dGVyKHNickV4dHJFbnYtPllCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlclNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5zYnJUcmFuc2llbnREZXRlY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YS0+dHJhbnNpZW50X2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlcldyaXRlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJTelNoaWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5uU2ZiWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPnRpbWVfc3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ub19jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5lbmNFbnZEYXRhLmdsb2JhbF90b25hbGl0eSk7CgoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCgogIFxicmllZiAgY2FsY3VsYXRlcyB0aGUgbm9pc2UgZmxvb3IgYW5kIHRoZSBlbnZlbG9wZSB2YWx1ZXMgZnJvbSB0aGUKICAgICAgICAgIGVuZXJnaWVzLCBkZXBlbmRpbmcgb24gZnJhbWluZyBhbmQgc3RlcmVvIG1vZGUKCiAgRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZSBpcyB0aGUgbWFpbiBmdW5jdGlvbiBmb3IgZW5jb2RpbmcgYW5kIHdyaXRpbmcgdGhlCiAgZW52ZWxvcGUgYW5kIHRoZSBub2lzZSBmbG9vci4gVGhlIGZ1bmN0aW9uIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc2VzOgoKICAtRGV0ZXJtaW5lIHRpbWUvZnJlcXVlbmN5IGRpdmlzaW9uIG9mIGN1cnJlbnQgZ3JhbnVsZS4KICAtU2VuZGluZyB0cmFuc2llbnQgaW5mbyB0byBiaXRzdHJlYW0uCiAgLVNldCBhbXBfcmVzIHRvIDEuNSBkQiBpZiB0aGUgY3VycmVudCBmcmFtZSBjb250YWlucyBvbmx5IG9uZSBlbnZlbG9wZS4KICAtTG9jayBkeW5hbWljIGJhbmR3aWR0aCBmcmVxdWVuY3kgY2hhbmdlIGlmIHRoZSBuZXh0IGVudmVsb3BlIG5vdCBzdGFydHMgb24gYQogIGZyYW1lIGJvdW5kYXJ5LgogIC1NRENUIHRyYW5zcG9zZXIgKG5lZWRlZCB0byBkZXRlY3Qgd2hlcmUgaGFybW9uaWNzIHdpbGwgYmUgbWlzc2luZykuCiAgLVNwZWN0cnVtIEVzdGltYXRpb24gKHVzZWQgZm9yIHB1bHNlIHRyYWluIGFuZCBtaXNzaW5nIGhhcm1vbmljcyBkZXRlY3Rpb24pLgogIC1QdWxzZSB0cmFpbiBkZXRlY3Rpb24uCiAgLUludmVyc2UgRmlsdGVyaW5nIGRldGVjdGlvbi4KICAtV2F2ZWZvcm0gQ29kaW5nLgogIC1NaXNzaW5nIEhhcm1vbmljcyBkZXRlY3Rpb24uCiAgLUV4dHJhY3QgZW52ZWxvcGUgb2YgY3VycmVudCBmcmFtZS4KICAtTm9pc2UgZmxvb3IgZXN0aW1hdGlvbi4KICAtTm9pc2UgZmxvb3IgcXVhbnRpc2F0aW9uIGFuZCBjb2RpbmcuCiAgLUVuY29kZSBlbnZlbG9wZSBvZiBjdXJyZW50IGZyYW1lLgogIC1TZW5kIHRoZSBlbmNvZGVkIGRhdGEgdG8gdGhlIGJpdHN0cmVhbS4KICAtV3JpdGUgdG8gYml0c3RyZWFtLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCkxOS19TRUNUSU9OX0NPREVfTDEKdm9pZApGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMiAoCiAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSBoX2NvbiwgLyohIGhhbmRsZSB0byBjb25maWcgZGF0YSAgICovCiAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgICBoUGFyYW1ldHJpY1N0ZXJlbywKICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBIHNickJpdHN0cmVhbURhdGEsCiAgICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMICAgaF9lbnZDaGFuMCwKICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgICBoX2VudkNoYW4xLAogICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgIGhDbW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICBTQlJfRU5WX1RFTVBfREFUQSAgICplRGF0YSwKICAgICAgICAgICAgICAgICAgICBTQlJfRlJBTUVfVEVNUF9EQVRBICpmRGF0YSwKICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBjbGVhck91dHB1dAogICAgICAgICAgICAgICAgICAgKQp7CiAgSEFORExFX0VOVl9DSEFOTkVMIGhfZW52Q2hhbltNQVhfTlVNX0NIQU5ORUxTXSA9IHtoX2VudkNoYW4wLCBoX2VudkNoYW4xfTsKICBpbnQgY2gsIGksIGosIGMsIFlTelNoaWZ0ID0gaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclN6U2hpZnQ7CgogIFNCUl9TVEVSRU9fTU9ERSBzdGVyZW9Nb2RlID0gaF9jb24tPnN0ZXJlb01vZGU7CiAgaW50IG5DaGFubmVscyA9IGhfY29uLT5uQ2hhbm5lbHM7CiAgY29uc3QgaW50ICp2X3R1bmluZzsKICBzdGF0aWMgY29uc3QgaW50IHZfdHVuaW5nSEVBQUNbNl0gPSB7IDAsIDIsIDQsIDAsIDAsIDAgfTsKCiAgc3RhdGljIGNvbnN0IGludCB2X3R1bmluZ0VMRFs2XSA9IHsgMCwgMiwgMywgMCwgMCwgMCB9OwoKICBpZiAoaF9jb24tPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpCiAgICB2X3R1bmluZyA9IHZfdHVuaW5nRUxEOwogIGVsc2UKICAgIHZfdHVuaW5nID0gdl90dW5pbmdIRUFBQzsKCgogIC8qCiAgICBTZWxlY3Qgc3RlcmVvIG1vZGUuCiAgKi8KICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKICAgIGlmIChlRGF0YVswXS50cmFuc2llbnRfaW5mb1sxXSAmJiBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1sxXSkgewogICAgICBlRGF0YVswXS50cmFuc2llbnRfaW5mb1swXSA9IGZpeE1pbihlRGF0YVsxXS50cmFuc2llbnRfaW5mb1swXSwgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0pOwogICAgICBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1swXSA9IGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdOwogICAgfQogICAgZWxzZSB7CiAgICAgIGlmIChlRGF0YVswXS50cmFuc2llbnRfaW5mb1sxXSAmJiAhZURhdGFbMV0udHJhbnNpZW50X2luZm9bMV0pIHsKICAgICAgICBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1swXSA9IGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGlmICghZURhdGFbMF0udHJhbnNpZW50X2luZm9bMV0gJiYgZURhdGFbMV0udHJhbnNpZW50X2luZm9bMV0pCiAgICAgICAgICBlRGF0YVswXS50cmFuc2llbnRfaW5mb1swXSA9IGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvWzBdOwogICAgICAgIGVsc2UgewogICAgICAgICAgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0gPSBmaXhNYXgoZURhdGFbMV0udHJhbnNpZW50X2luZm9bMF0sIGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdKTsKICAgICAgICAgIGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvWzBdID0gZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvKgogICAgRGV0ZXJtaW5lIHRpbWUvZnJlcXVlbmN5IGRpdmlzaW9uIG9mIGN1cnJlbnQgZ3JhbnVsZQogICovCiAgZURhdGFbMF0uZnJhbWVfaW5mbyA9IEZES3NickVuY19mcmFtZUluZm9HZW5lcmF0b3IoJmhfZW52Q2hhblswXS0+U2JyRW52RnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMF0udHJhbnNpZW50X2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUucHJlX3RyYW5zaWVudF9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5sZEdyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl90dW5pbmcpOwoKICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuaFNickJTR3JpZCA9ICZoX2VudkNoYW5bMF0tPlNickVudkZyYW1lLlNickdyaWQ7CgogIC8qIEFBQyBMRCBwYXRjaCBmb3IgdHJhbnNpZW50IHByZWRpY3Rpb24gKi8KICBpZiAoaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmxkR3JpZCAmJiBlRGF0YVswXS50cmFuc2llbnRfaW5mb1syXSkgewogICAgLyogaWYgbmV4dCBmcmFtZSB3aWxsIHN0YXJ0IHdpdGggdHJhbnNpZW50LCBzZXQgc2hvcnRFbnYgdG8gbnVtRW52ZWxvcGVzKHNob3J0ZW5kIEVudmVsb3BlID0gc2hvcnRFbnYtMSkqLwogICAgaF9lbnZDaGFuWzBdLT5TYnJFbnZGcmFtZS5TYnJGcmFtZUluZm8uc2hvcnRFbnYgPSBoX2VudkNoYW5bMF0tPlNickVudkZyYW1lLlNickZyYW1lSW5mby5uRW52ZWxvcGVzOwogIH0KCgogIHN3aXRjaCAoc3RlcmVvTW9kZSkgewogIGNhc2UgU0JSX0xFRlRfUklHSFQ6CiAgY2FzZSBTQlJfU1dJVENIX0xSQzoKICAgIGVEYXRhWzFdLmZyYW1lX2luZm8gPSBGREtzYnJFbmNfZnJhbWVJbmZvR2VuZXJhdG9yKCZoX2VudkNoYW5bMV0tPlNickVudkZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMV0udHJhbnNpZW50X2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5wcmVfdHJhbnNpZW50X2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEubGRHcmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl90dW5pbmcpOwoKICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5oU2JyQlNHcmlkID0gJmhfZW52Q2hhblsxXS0+U2JyRW52RnJhbWUuU2JyR3JpZDsKCiAgICBpZiAoaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmxkR3JpZCAmJiBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1syXSkgewogICAgICAvKiBpZiBuZXh0IGZyYW1lIHdpbGwgc3RhcnQgd2l0aCB0cmFuc2llbnQsIHNldCBzaG9ydEVudiB0byBudW1FbnZlbG9wZXMoc2hvcnRlbmQgRW52ZWxvcGUgPSBzaG9ydEVudi0xKSovCiAgICAgIGhfZW52Q2hhblsxXS0+U2JyRW52RnJhbWUuU2JyRnJhbWVJbmZvLnNob3J0RW52ID0gaF9lbnZDaGFuWzFdLT5TYnJFbnZGcmFtZS5TYnJGcmFtZUluZm8ubkVudmVsb3BlczsKICAgIH0KCiAgICAvKiBjb21wYXJlIGxlZnQgYW5kIHJpZ2h0IGZyYW1lX2luZm9zICovCiAgICBpZiAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyAhPSBlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzKSB7CiAgICAgIHN0ZXJlb01vZGUgPSBTQlJfTEVGVF9SSUdIVDsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzICsgMTsgaSsrKSB7CiAgICAgICAgaWYgKGVEYXRhWzBdLmZyYW1lX2luZm8tPmJvcmRlcnNbaV0gIT0gZURhdGFbMV0uZnJhbWVfaW5mby0+Ym9yZGVyc1tpXSkgewogICAgICAgICAgc3RlcmVvTW9kZSA9IFNCUl9MRUZUX1JJR0hUOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAoaSA9IDA7IGkgPCBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzOyBpKyspIHsKICAgICAgICBpZiAoZURhdGFbMF0uZnJhbWVfaW5mby0+ZnJlcVJlc1tpXSAhPSBlRGF0YVsxXS5mcmFtZV9pbmZvLT5mcmVxUmVzW2ldKSB7CiAgICAgICAgICBzdGVyZW9Nb2RlID0gU0JSX0xFRlRfUklHSFQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGVEYXRhWzBdLmZyYW1lX2luZm8tPnNob3J0RW52ICE9IGVEYXRhWzFdLmZyYW1lX2luZm8tPnNob3J0RW52KSB7CiAgICAgICAgc3RlcmVvTW9kZSA9IFNCUl9MRUZUX1JJR0hUOwogICAgICB9CiAgICB9CiAgICBicmVhazsKICBjYXNlIFNCUl9DT1VQTElORzoKICAgIGVEYXRhWzFdLmZyYW1lX2luZm8gPSBlRGF0YVswXS5mcmFtZV9pbmZvOwogICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmhTYnJCU0dyaWQgPSAmaF9lbnZDaGFuWzBdLT5TYnJFbnZGcmFtZS5TYnJHcmlkOwogICAgYnJlYWs7CiAgY2FzZSBTQlJfTU9OTzoKICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICBGREtfQVNTRVJUICgwKTsKICB9CgoKICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7Y2grKykKICB7CiAgICBIQU5ETEVfRU5WX0NIQU5ORUwgaEVudkNoYW4gPSBoX2VudkNoYW5bY2hdOwogICAgSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIHNickV4dHJFbnYgPSAmaEVudkNoYW4tPnNickV4dHJhY3RFbnZlbG9wZTsKICAgIFNCUl9FTlZfVEVNUF9EQVRBICplZCA9ICZlRGF0YVtjaF07CgoKICAgIC8qCiAgICAgICBTZW5kIHRyYW5zaWVudCBpbmZvIHRvIGJpdHN0cmVhbSBhbmQgc3RvcmUgZm9yIG5leHQgY2FsbAogICAgKi8KICAgIHNickV4dHJFbnYtPnByZV90cmFuc2llbnRfaW5mb1swXSA9IGVkLT50cmFuc2llbnRfaW5mb1swXTsvKiB0cmFuX3BvcyAqLwogICAgc2JyRXh0ckVudi0+cHJlX3RyYW5zaWVudF9pbmZvWzFdID0gZWQtPnRyYW5zaWVudF9pbmZvWzFdOy8qIHRyYW5fZmxhZyAqLwogICAgaEVudkNoYW4tPmVuY0VudkRhdGEubm9PZkVudmVsb3BlcyA9IGVkLT5uRW52ZWxvcGVzID0gZWQtPmZyYW1lX2luZm8tPm5FbnZlbG9wZXM7ICAgICAvKiBudW1iZXIgb2YgZW52ZWxvcGVzIG9mIGN1cnJlbnQgZnJhbWUgKi8KCiAgICAvKgogICAgICBDaGVjayBpZiB0aGUgY3VycmVudCBmcmFtZSBpcyBkaXZpZGVkIGludG8gb25lIGVudmVsb3BlIG9ubHkuIElmIHNvLCBzZXQgdGhlIGFtcGxpdHVkZQogICAgICByZXNvbHV0aW9uIHRvIDEuNSBkQiwgb3RoZXJ3aXNlIG1heSBzZXQgYmFjayB0byBjaG9zZW4gdmFsdWUKICAgICovCiAgIGlmKCAoIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgPT0gRklYRklYICkKICAgICAgICAmJiAoIGVkLT5uRW52ZWxvcGVzID09IDEgKSApCiAgIHsKCiAgICAgaWYgKGhfY29uLT5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKQogICAgIHsKICAgICAgIC8qIE5vdGU6IGdsb2JhbF90b25hbGl5X2Zsb2F0X3ZhbHVlID09ICgoZmxvYXQpaEVudkNoYW4tPmVuY0VudkRhdGEuZ2xvYmFsX3RvbmFsaXR5LygoSU5UNjQpKDEpPDwoMzEtKDE5KzIpKSkvMC41MjQyODgqKDIuMC8zLjApKSk7CiAgICAgICAgICAgICAgICB0aHJlc2hvbGRfZmxvYXRfdmFsdWUgPT0gKChmbG9hdCloX2Nvbi0+dGhyZXNob2xkQW1wUmVzRkZfbS8oKElOVDY0KSgxKTw8KDMxLShoX2Nvbi0+dGhyZXNob2xkQW1wUmVzRkZfZSkpKS8wLjUyNDI4OCooMi4wLzMuMCkpKTsgKi8KICAgICAgIC8qIGRlY2lzaW9uIG9mIFNCUl9BTVBfUkVTICovCiAgICAgICBpZiAoZklzTGVzc1RoYW4oIC8qIGdsb2JhbF90b25hbGl0eSA+IHRocmVzaG9sZCA/ICovCiAgICAgICAgICAgICBoX2Nvbi0+dGhyZXNob2xkQW1wUmVzRkZfbSwgaF9jb24tPnRocmVzaG9sZEFtcFJlc0ZGX2UsCiAgICAgICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5nbG9iYWxfdG9uYWxpdHksIFJFTEFYQVRJT05fU0hJRlQrMiApCiAgICAgICAgICApCiAgICAgICB7CiAgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRiA9IFNCUl9BTVBfUkVTXzFfNTsKICAgICAgIH0KICAgICAgIGVsc2UgewogICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5jdXJyZW50QW1wUmVzRkYgPSBTQlJfQU1QX1JFU18zXzA7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRiA9IFNCUl9BTVBfUkVTXzFfNTsKICAgICB9CgogICAgICBpZiAoIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRiAhPSBoRW52Q2hhbi0+ZW5jRW52RGF0YS5pbml0X3Nicl9hbXBfcmVzKSB7CgogICAgICAgIEZES3NickVuY19Jbml0U2JySHVmZm1hblRhYmxlcygmaEVudkNoYW4tPmVuY0VudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52Q2hhbi0+c2JyQ29kZUVudmVsb3BlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPnNickNvZGVOb2lzZUZsb29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5jdXJyZW50QW1wUmVzRkYpOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgaWYoc2JySGVhZGVyRGF0YS0+c2JyX2FtcF9yZXMgIT0gaEVudkNoYW4tPmVuY0VudkRhdGEuaW5pdF9zYnJfYW1wX3JlcyApIHsKCiAgICAgICAgRkRLc2JyRW5jX0luaXRTYnJIdWZmbWFuVGFibGVzKCZoRW52Q2hhbi0+ZW5jRW52RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5zYnJDb2RlRW52ZWxvcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52Q2hhbi0+c2JyQ29kZU5vaXNlRmxvb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9hbXBfcmVzKTsKICAgICAgfQogICAgfQoKICAgIGlmICghY2xlYXJPdXRwdXQpIHsKCiAgICAgIC8qCiAgICAgICAgVG9uYWxpdHkgY29ycmVjdGlvbiBwYXJhbWV0ZXIgZXh0cmFjdGlvbiAoaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWwsIG5vaXNlIGZsb29yIGFkZGl0aW9uYWwgc2luZXMpLgogICAgICAqLwogICAgICBGREtzYnJFbmNfVG9uQ29yclBhcmFtRXh0cigmaEVudkNoYW4tPlRvbkNvcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5zYnJfaW52Zl9tb2RlX3ZlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkLT5ub2lzZUZsb29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPmVuY0VudkRhdGEuYWRkSGFybW9uaWNGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuYWRkSGFybW9uaWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5lbnZlbG9wZUNvbXBlbnNhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkLT5mcmFtZV9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWQtPnRyYW5zaWVudF9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPmZyZXFCYW5kVGFibGVbSEldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPm5TZmJbSEldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuc2JyX3hwb3NfbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5zYnJTeW50YXhGbGFncyk7CgogICAgfQoKICAgIC8qIExvdyBlbmVyZ3kgaW4gbG93IGJhbmQgZml4ICovCiAgICBpZiAoIGhFbnZDaGFuLT5zYnJUcmFuc2llbnREZXRlY3Rvci5wcmV2TG93QmFuZEVuZXJneSA8IGhFbnZDaGFuLT5zYnJUcmFuc2llbnREZXRlY3Rvci5wcmV2SGlnaEJhbmRFbmVyZ3kKICAgICAgJiYgaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLnByZXZIaWdoQmFuZEVuZXJneSA+IEZMMkZYX0RCTCgwLjAzKQogICAgICAvKiBUaGUgZml4IG5lZWRzIHRoZSBub24tZmFzdCB0cmFuc2llbnQgZGV0ZWN0b3IgcnVubmluZy4KICAgICAgICAgSXQgc2V0cyBwcmV2TG93QmFuZEVuZXJneSBhbmQgcHJldkhpZ2hCYW5kRW5lcmd5LiAgICAgICovCiAgICAgICYmICEoaF9jb24tPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpCiAgICAgICkKICAgIHsKICAgICAgaW50IGk7CgogICAgICBoRW52Q2hhbi0+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==