Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqICBGREsgUENNIHBvc3Rwcm9jZXNzb3IgbW9kdWxlICAqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBNYXR0aGlhcyBOZXVzaW5nZXIKICAgRGVzY3JpcHRpb246IEhhcmQgbGltaXRlciBmb3IgY2xpcHBpbmcgcHJldmVudGlvbgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJsaW1pdGVyLmgiCgoKc3RydWN0IFRETGltaXRlciB7CiAgdW5zaWduZWQgaW50ICBhdHRhY2s7CiAgRklYUF9EQkwgICAgICBhdHRhY2tDb25zdCwgcmVsZWFzZUNvbnN0OwogIHVuc2lnbmVkIGludCAgYXR0YWNrTXMsIHJlbGVhc2VNcywgbWF4QXR0YWNrTXM7CiAgRklYUF9QQ00gICAgICB0aHJlc2hvbGQ7CiAgdW5zaWduZWQgaW50ICBjaGFubmVscywgbWF4Q2hhbm5lbHM7CiAgdW5zaWduZWQgaW50ICBzYW1wbGVSYXRlLCBtYXhTYW1wbGVSYXRlOwogIEZJWFBfREJMICAgICAgY29yLCBtYXg7CiAgRklYUF9EQkwqICAgICBtYXhCdWY7CiAgRklYUF9EQkwqICAgICBkZWxheUJ1ZjsKICB1bnNpZ25lZCBpbnQgIG1heEJ1ZklkeCwgZGVsYXlCdWZJZHg7CiAgRklYUF9EQkwgICAgICBzbW9vdGhTdGF0ZTA7CiAgRklYUF9EQkwgICAgICBtaW5HYWluOwoKICBGSVhQX0RCTCAgICAgIGFkZGl0aW9uYWxHYWluUHJldjsKICBGSVhQX0RCTCAgICAgIGFkZGl0aW9uYWxHYWluRmlsdGVyU3RhdGU7CiAgRklYUF9EQkwgICAgICBhZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlMTsKfTsKCi8qIGNyZWF0ZSBsaW1pdGVyICovClRETGltaXRlclB0ciBjcmVhdGVMaW1pdGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIG1heEF0dGFja01zLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIHJlbGVhc2VNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICB0aHJlc2hvbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgbWF4Q2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgbWF4U2FtcGxlUmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICBURExpbWl0ZXJQdHIgbGltaXRlciA9IE5VTEw7CiAgdW5zaWduZWQgaW50IGF0dGFjaywgcmVsZWFzZTsKICBGSVhQX0RCTCBhdHRhY2tDb25zdCwgcmVsZWFzZUNvbnN0LCBleHBvbmVudDsKICBJTlQgZV9hbnM7CgogIC8qIGNhbGMgYXR0YWNrIGFuZCByZWxlYXNlIHRpbWUgaW4gc2FtcGxlcyAqLwogIGF0dGFjayA9ICh1bnNpZ25lZCBpbnQpKG1heEF0dGFja01zICogbWF4U2FtcGxlUmF0ZSAvIDEwMDApOwogIHJlbGVhc2UgPSAodW5zaWduZWQgaW50KShyZWxlYXNlTXMgKiBtYXhTYW1wbGVSYXRlIC8gMTAwMCk7CgogIC8qIGFsbG9jIGxpbWl0ZXIgc3RydWN0ICovCiAgbGltaXRlciA9IChURExpbWl0ZXJQdHIpRkRLY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgVERMaW1pdGVyKSk7CiAgaWYgKCFsaW1pdGVyKSByZXR1cm4gTlVMTDsKCiAgLyogYWxsb2MgbWF4IGFuZCBkZWxheSBidWZmZXJzICovCiAgbGltaXRlci0+bWF4QnVmICAgPSAoRklYUF9EQkwqKUZES2NhbGxvYyhhdHRhY2sgKyAxLCBzaXplb2YoRklYUF9EQkwpKTsKICBsaW1pdGVyLT5kZWxheUJ1ZiA9IChGSVhQX0RCTCopRkRLY2FsbG9jKGF0dGFjayAqIG1heENoYW5uZWxzLCBzaXplb2YoRklYUF9EQkwpKTsKCiAgaWYgKCFsaW1pdGVyLT5tYXhCdWYgfHwgIWxpbWl0ZXItPmRlbGF5QnVmKSB7CiAgICBkZXN0cm95TGltaXRlcihsaW1pdGVyKTsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgLyogYXR0YWNrQ29uc3QgPSBwb3coMC4xLCAxLjAgLyAoYXR0YWNrICsgMSkpICovCiAgZXhwb25lbnQgPSBpbnZGaXhwKGF0dGFjaysxKTsKICBhdHRhY2tDb25zdCA9IGZQb3coRkwyRlhDT05TVF9EQkwoMC4xZiksIDAsIGV4cG9uZW50LCAwLCAmZV9hbnMpOwogIGF0dGFja0NvbnN0ID0gc2NhbGVWYWx1ZShhdHRhY2tDb25zdCwgZV9hbnMpOwoKICAvKiByZWxlYXNlQ29uc3QgID0gKGZsb2F0KXBvdygwLjEsIDEuMCAvIChyZWxlYXNlICsgMSkpICovCiAgZXhwb25lbnQgPSBpbnZGaXhwKHJlbGVhc2UgKyAxKTsKICByZWxlYXNlQ29uc3QgPSBmUG93KEZMMkZYQ09OU1RfREJMKDAuMWYpLCAwLCBleHBvbmVudCwgMCwgJmVfYW5zKTsKICByZWxlYXNlQ29uc3QgPSBzY2FsZVZhbHVlKHJlbGVhc2VDb25zdCwgZV9hbnMpOwoKICAvKiBpbml0IHBhcmFtZXRlcnMgKi8KICBsaW1pdGVyLT5hdHRhY2tNcyAgICAgID0gbWF4QXR0YWNrTXM7CiAgbGltaXRlci0+bWF4QXR0YWNrTXMgICA9IG1heEF0dGFja01zOwogIGxpbWl0ZXItPnJlbGVhc2VNcyAgICAgPSByZWxlYXNlTXM7CiAgbGltaXRlci0+YXR0YWNrICAgICAgICA9IGF0dGFjazsKICBsaW1pdGVyLT5hdHRhY2tDb25zdCAgID0gYXR0YWNrQ29uc3Q7CiAgbGltaXRlci0+cmVsZWFzZUNvbnN0ICA9IHJlbGVhc2VDb25zdDsKICBsaW1pdGVyLT50aHJlc2hvbGQgICAgID0gKEZJWFBfUENNKXRocmVzaG9sZDsKICBsaW1pdGVyLT5jaGFubmVscyAgICAgID0gbWF4Q2hhbm5lbHM7CiAgbGltaXRlci0+bWF4Q2hhbm5lbHMgICA9IG1heENoYW5uZWxzOwogIGxpbWl0ZXItPnNhbXBsZVJhdGUgICAgPSBtYXhTYW1wbGVSYXRlOwogIGxpbWl0ZXItPm1heFNhbXBsZVJhdGUgPSBtYXhTYW1wbGVSYXRlOwoKICByZXNldExpbWl0ZXIobGltaXRlcik7CgogIHJldHVybiBsaW1pdGVyOwp9CgoKLyogcmVzZXQgbGltaXRlciAqLwpURExJTUlURVJfRVJST1IgcmVzZXRMaW1pdGVyKFRETGltaXRlclB0ciBsaW1pdGVyKQp7CiAgaWYgKGxpbWl0ZXIgIT0gTlVMTCkgewoKICAgIGxpbWl0ZXItPm1heEJ1ZklkeCA9IDA7CiAgICBsaW1pdGVyLT5kZWxheUJ1ZklkeCA9IDA7CiAgICBsaW1pdGVyLT5tYXggPSAoRklYUF9EQkwpMDsKICAgIGxpbWl0ZXItPmNvciA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PDEpKTsKICAgIGxpbWl0ZXItPnNtb290aFN0YXRlMCA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PDEpKTsKICAgIGxpbWl0ZXItPm1pbkdhaW4gPSBGTDJGWENPTlNUX0RCTCgxLjBmLygxPDwxKSk7CgogICAgbGltaXRlci0+YWRkaXRpb25hbEdhaW5QcmV2ID0gRkwyRlhDT05TVF9EQkwoMS4wZi8oMTw8VERMX0dBSU5fU0NBTElORykpOwogICAgbGltaXRlci0+YWRkaXRpb25hbEdhaW5GaWx0ZXJTdGF0ZSA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PFRETF9HQUlOX1NDQUxJTkcpKTsKICAgIGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluRmlsdGVyU3RhdGUxID0gRkwyRlhDT05TVF9EQkwoMS4wZi8oMTw8VERMX0dBSU5fU0NBTElORykpOwoKICAgIEZES21lbXNldChsaW1pdGVyLT5tYXhCdWYsICAgMCwgKGxpbWl0ZXItPmF0dGFjayArIDEpICogc2l6ZW9mKEZJWFBfREJMKSApOwogICAgRkRLbWVtc2V0KGxpbWl0ZXItPmRlbGF5QnVmLCAwLCBsaW1pdGVyLT5hdHRhY2sgKiBsaW1pdGVyLT5jaGFubmVscyAqIHNpemVvZihGSVhQX0RCTCkgKTsKICB9CiAgZWxzZSB7CiAgICByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKICB9CgogIHJldHVybiBURExJTUlUX09LOwp9CgoKLyogZGVzdHJveSBsaW1pdGVyICovClRETElNSVRFUl9FUlJPUiBkZXN0cm95TGltaXRlcihURExpbWl0ZXJQdHIgbGltaXRlcikKewogIGlmIChsaW1pdGVyICE9IE5VTEwpIHsKICAgIEZES2ZyZWUobGltaXRlci0+bWF4QnVmKTsKICAgIEZES2ZyZWUobGltaXRlci0+ZGVsYXlCdWYpOwoKICAgIEZES2ZyZWUobGltaXRlcik7CiAgfQogIGVsc2UgewogICAgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9IQU5ETEU7CiAgfQogIHJldHVybiBURExJTUlUX09LOwp9CgovKiBhcHBseSBsaW1pdGVyICovClRETElNSVRFUl9FUlJPUiBhcHBseUxpbWl0ZXIoVERMaW1pdGVyUHRyIGxpbWl0ZXIsCiAgICAgICAgICAgICAgICAgSU5UX1BDTSogICAgc2FtcGxlcywKICAgICAgICAgICAgICAgICBGSVhQX0RCTCogICAgcEdhaW4sCiAgICAgICAgICAgICAgICAgY29uc3QgSU5UKiAgIGdhaW5fc2NhbGUsCiAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgIGdhaW5fc2l6ZSwKICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgZ2Fpbl9kZWxheSwKICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgblNhbXBsZXMpCnsKICB1bnNpZ25lZCBpbnQgaSwgajsKICBGSVhQX1BDTSB0bXAxLCB0bXAyOwogIEZJWFBfREJMIHRtcCwgb2xkLCBnYWluLCBhZGRpdGlvbmFsR2FpbiwgYWRkaXRpb25hbEdhaW5VbmZpbHRlcmVkOwogIEZJWFBfREJMIG1pbkdhaW4gPSBGTDJGWENPTlNUX0RCTCgxLjBmLygxPDwxKSk7CgogIEZES19BU1NFUlQoZ2Fpbl9zaXplID09IDEpOwogIEZES19BU1NFUlQoZ2Fpbl9kZWxheSA8PSBuU2FtcGxlcyk7CgogIGlmICggbGltaXRlciA9PSBOVUxMICkgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9IQU5ETEU7CgogIHsKICAgIHVuc2lnbmVkIGludCBjaGFubmVscyAgICAgICA9IGxpbWl0ZXItPmNoYW5uZWxzOwogICAgdW5zaWduZWQgaW50IGF0dGFjayAgICAgICAgID0gbGltaXRlci0+YXR0YWNrOwogICAgRklYUF9EQkwgICAgIGF0dGFja0NvbnN0ICAgID0gbGltaXRlci0+YXR0YWNrQ29uc3Q7CiAgICBGSVhQX0RCTCAgICAgcmVsZWFzZUNvbnN0ICAgPSBsaW1pdGVyLT5yZWxlYXNlQ29uc3Q7CiAgICBGSVhQX0RCTCAgICAgdGhyZXNob2xkICAgICAgPSBGWF9QQ00yRlhfREJMKGxpbWl0ZXItPnRocmVzaG9sZCk+PlRETF9HQUlOX1NDQUxJTkc7CgogICAgRklYUF9EQkwgICAgIG1heCAgICAgICAgICAgID0gbGltaXRlci0+bWF4OwogICAgRklYUF9EQkwqICAgIG1heEJ1ZiAgICAgICAgID0gbGltaXRlci0+bWF4QnVmOwogICAgdW5zaWduZWQgaW50IG1heEJ1ZklkeCAgICAgID0gbGltaXRlci0+bWF4QnVmSWR4OwogICAgRklYUF9EQkwgICAgIGNvciAgICAgICAgICAgID0gbGltaXRlci0+Y29yOwogICAgRklYUF9EQkwqICAgIGRlbGF5QnVmICAgICAgID0gbGltaXRlci0+ZGVsYXlCdWY7CiAgICB1bnNpZ25lZCBpbnQgZGVsYXlCdWZJZHggICAgPSBsaW1pdGVyLT5kZWxheUJ1ZklkeDsKCiAgICBGSVhQX0RCTCAgICAgc21vb3RoU3RhdGUwICAgPSBsaW1pdGVyLT5zbW9vdGhTdGF0ZTA7CiAgICBGSVhQX0RCTCAgICAgYWRkaXRpb25hbEdhaW5TbW9vdGhTdGF0ZSA9IGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluRmlsdGVyU3RhdGU7CiAgICBGSVhQX0RCTCAgICAgYWRkaXRpb25hbEdhaW5TbW9vdGhTdGF0ZTEgPSBsaW1pdGVyLT5hZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlMTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgblNhbXBsZXM7IGkrKykgewoKICAgICAgaWYgKGkgPCBnYWluX2RlbGF5KSB7CiAgICAgICAgYWRkaXRpb25hbEdhaW5VbmZpbHRlcmVkID0gbGltaXRlci0+YWRkaXRpb25hbEdhaW5QcmV2OwogICAgICB9IGVsc2UgewogICAgICAgIGFkZGl0aW9uYWxHYWluVW5maWx0ZXJlZCA9IHBHYWluWzBdOwogICAgICB9CgogICAgICAvKiBTbW9vdGggYWRkaXRpb25hbEdhaW4gKi8KICAgICAgLyogW2IsYV0gPSBidXR0ZXIoMSwgMC4wMSkgKi8KICAgICAgc3RhdGljIGNvbnN0IEZJWFBfU0dMIGJbXSA9IHsgRkwyRlhDT05TVF9TR0woMC4wMTU0NjYqMi4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDE1NDY2KjIuMCkgfTsKICAgICAgc3RhdGljIGNvbnN0IEZJWFBfU0dMIGFbXSA9IHsgRkwyRlhDT05TVF9TR0woMS4wMDAwMDApLCBGTDJGWENPTlNUX1NHTCgtMC45NjkwNykgfTsKICAgICAgLyogW2IsYV0gPSBidXR0ZXIoMSwgMC4wMDEpICovCiAgICAgIC8vc3RhdGljIGNvbnN0IEZJWFBfU0dMIGJbXSA9IHsgRkwyRlhDT05TVF9TR0woMC4wMDE1NjgzKjIuMCksIEZMMkZYQ09OU1RfU0dMKCAwLjAwMTU2ODMqMi4wKSB9OwogICAgICAvL3N0YXRpYyBjb25zdCBGSVhQX1NHTCBhW10gPSB7IEZMMkZYQ09OU1RfU0dMKDEuMDAwMDAwMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5Njg2KSB9OwogICAgICBhZGRpdGlvbmFsR2FpbiA9IC0gZk11bHQoYWRkaXRpb25hbEdhaW5TbW9vdGhTdGF0ZSwgYVsxXSkgKyBmTXVsdERpdjIoIGFkZGl0aW9uYWxHYWluVW5maWx0ZXJlZCwgYlswXSkgKyBmTXVsdERpdjIoYWRkaXRpb25hbEdhaW5TbW9vdGhTdGF0ZTEsIGJbMV0pOwogICAgICBhZGRpdGlvbmFsR2FpblNtb290aFN0YXRlMSA9IGFkZGl0aW9uYWxHYWluVW5maWx0ZXJlZDsKICAgICAgYWRkaXRpb25hbEdhaW5TbW9vdGhTdGF0ZSA9IGFkZGl0aW9uYWxHYWluOwoKICAgICAgLyogQXBwbHkgdGhlIGFkZGl0aW9uYWwgc2NhbGluZyB0aGF0IGhhcyBubyBkZWxheSBhbmQgbm8gc21vb3RoaW5nICovCiAgICAgIGlmIChnYWluX3NjYWxlWzBdID4gMCkgewogICAgICAgIGFkZGl0aW9uYWxHYWluIDw8PSBnYWluX3NjYWxlWzBdOwogICAgICB9IGVsc2UgewogICAgICAgIGFkZGl0aW9uYWxHYWluID4+PSBnYWluX3NjYWxlWzBdOwogICAgICB9CgogICAgICAvKiBnZXQgbWF4aW11bSBhYnNvbHV0ZSBzYW1wbGUgdmFsdWUgb2YgYWxsIGNoYW5uZWxzLCBpbmNsdWRpbmcgdGhlIGFkZGl0aW9uYWwgZ2Fpbi4gKi8KICAgICAgdG1wMSA9IChGSVhQX1BDTSkwOwogICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgewogICAgICAgICAgdG1wMiA9IChGSVhQX1BDTSlzYW1wbGVzW2kgKiBjaGFubmVscyArIGpdOwogICAgICAgICAgaWYgKHRtcDIgPT0gKEZJWFBfUENNKVNBTVBMRV9NSU4pIC8qIHByb3RlY3QgZkFicyBmcm9tIC0xLjAgdmFsdWUgKi8KICAgICAgICAgICAgICB0bXAyID0gKEZJWFBfUENNKShTQU1QTEVfTUlOKzEpOwogICAgICAgIHRtcDEgPSBmTWF4KHRtcDEsIGZBYnModG1wMikpOwogICAgICB9CiAgICAgIHRtcCA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoZk11bHREaXYyKHRtcDEsIGFkZGl0aW9uYWxHYWluKSwgMSwgREZSQUNUX0JJVFMpOwoKICAgICAgLyogc2V0IHRocmVzaG9sZCBhcyBsb3dlciBib3JkZXIgdG8gc2F2ZSBjYWxjdWxhdGlvbnMgaW4gcnVubmluZyBtYXhpbXVtIGFsZ29yaXRobSAqLwogICAgICB0bXAgPSBmTWF4KHRtcCwgdGhyZXNob2xkKTsKCiAgICAgIC8qIHJ1bm5pbmcgbWF4aW11bSAqLwogICAgICBvbGQgPSBtYXhCdWZbbWF4QnVmSWR4XTsKICAgICAgbWF4QnVmW21heEJ1ZklkeF0gPSB0bXA7CgogICAgICBpZiAodG1wID49IG1heCkgewogICAgICAgIC8qIG5ldyBzYW1wbGUgaXMgZ3JlYXRlciB0aGFuIG9sZCBtYXhpbXVtLCBzbyBpdCBpcyB0aGUgbmV3IG1heGltdW0gKi8KICAgICAgICBtYXggPSB0bXA7CiAgICAgIH0KICAgICAgZWxzZSBpZiAob2xkIDwgbWF4KSB7CiAgICAgICAgLyogbWF4aW11bSBkb2VzIG5vdCBjaGFuZ2UsIGFzIHRoZSBzYW1wbGUsIHdoaWNoIGhhcyBsZWZ0IHRoZSB3aW5kb3cgd2FzCiAgICAgICAgICAgbm90IHRoZSBtYXhpbXVtICovCiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgLyogdGhlIG9sZCBtYXhpbXVtIGhhcyBsZWZ0IHRoZSB3aW5kb3csIHdlIGhhdmUgdG8gc2VhcmNoIHRoZSBjb21wbGV0ZQogICAgICAgICAgIGJ1ZmZlciBmb3IgdGhlIG5ldyBtYXggKi8KICAgICAgICBtYXggPSBtYXhCdWZbMF07CiAgICAgICAgZm9yIChqID0gMTsgaiA8PSBhdHRhY2s7IGorKykgewogICAgICAgICAgaWYgKG1heEJ1ZltqXSA+IG1heCkgbWF4ID0gbWF4QnVmW2pdOwogICAgICAgIH0KICAgICAgfQogICAgICBtYXhCdWZJZHgrKzsKICAgICAgaWYgKG1heEJ1ZklkeCA+PSBhdHRhY2srMSkgbWF4QnVmSWR4ID0gMDsKCiAgICAgIC8qIGNhbGMgZ2FpbiAqLwogICAgICAvKiBnYWluIGlzIGRvd25zY2FsZWQgYnkgb25lLCBzbyB0aGF0IGdhaW4gPSAxLjAgY2FuIGJlIHJlcHJlc2VudGVkICovCiAgICAgIGlmIChtYXggPiB0aHJlc2hvbGQpIHsKICAgICAgICBnYWluID0gZkRpdk5vcm0odGhyZXNob2xkLCBtYXgpPj4xOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGdhaW4gPSBGTDJGWENPTlNUX0RCTCgxLjBmLygxPDwxKSk7CiAgICAgIH0KCiAgICAgIC8qIGdhaW4gc21vb3RoaW5nLCBtZXRob2Q6IFRETF9FWFBPTkVOVElBTCAqLwogICAgICAvKiBmaXJzdCBvcmRlciBJSVIgZmlsdGVyIHdpdGggYXR0YWNrIGNvcnJlY3Rpb24gdG8gYXZvaWQgb3ZlcnNob290cyAqLwoKICAgICAgLyogY29ycmVjdCB0aGUgJ2FpbWluZycgdmFsdWUgb2YgdGhlIGV4cG9uZW50aWFsIGF0dGFjayB0byBhdm9pZCB0aGUgcmVtYWluaW5nIG92ZXJzaG9vdCAqLwogICAgICBpZiAoZ2FpbiA8IHNtb290aFN0YXRlMCkgewogICAgICAgIGNvciA9IGZNaW4oY29yLCBmTXVsdERpdjIoKGdhaW4gLSBmTXVsdERpdjIoRkwyRlhDT05TVF9TR0woMC4xZiooMTw8MSkpLHNtb290aFN0YXRlMCkpLCBGTDJGWENPTlNUX1NHTCgxLjExMTExMTExZi8oMTw8MSkpKTw8Mik7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgY29yID0gZ2FpbjsKICAgICAgfQoKICAgICAgLyogc21vb3RoaW5nIGZpbHRlciAqLwogICAgICBpZiAoY29yIDwgc21vb3RoU3RhdGUwKSB7CiAgICAgICAgc21vb3RoU3RhdGUwID0gZk11bHQoYXR0YWNrQ29uc3QsKHNtb290aFN0YXRlMCAtIGNvcikpICsgY29yOyAgLyogYXR0YWNrICovCiAgICAgICAgc21vb3RoU3RhdGUwID0gZk1heChzbW9vdGhTdGF0ZTAsIGdhaW4pOyAvKiBhdm9pZCBvdmVyc2hvb3RpbmcgdGFyZ2V0ICovCiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgLyogc2lnbiBpbnZlcnNpb24gdHdpY2UgdG8gcm91bmQgdG93YXJkcyAraW5maW5pdHksCiAgICAgICAgICAgc28gdGhhdCBnYWluIGNhbiBjb252ZXJnZSB0byAxLjAgYWdhaW4sCiAgICAgICAgICAgZm9yIGJpdC1pZGVudGljYWwgb3V0cHV0IHdoZW4gbGltaXRlciBpcyBub3QgYWN0aXZlICovCiAgICAgICAgc21vb3RoU3RhdGUwID0gLWZNdWx0KHJlbGVhc2VDb25zdCwtKHNtb290aFN0YXRlMCAtIGNvcikpICsgY29yOyAvKiByZWxlYXNlICovCiAgICAgIH0KCiAgICAgIGdhaW4gPSBzbW9vdGhTdGF0ZTA7CgogICAgICAvKiBsb29rYWhlYWQgZGVsYXksIGFwcGx5IGdhaW4gKi8KICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKCiAgICAgICAgdG1wID0gZGVsYXlCdWZbZGVsYXlCdWZJZHggKiBjaGFubmVscyArIGpdOwogICAgICAgIGRlbGF5QnVmW2RlbGF5QnVmSWR4ICogY2hhbm5lbHMgKyBqXSA9IGZNdWx0KChGSVhQX1BDTSlzYW1wbGVzW2kgKiBjaGFubmVscyArIGpdLCBhZGRpdGlvbmFsR2Fpbik7CgogICAgICAgIC8qIEFwcGx5IGdhaW4gdG8gZGVsYXllZCBzaWduYWwgKi8KICAgICAgICBpZiAoZ2FpbiA8IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PDEpKSkKICAgICAgICAgIHRtcCA9IGZNdWx0KHRtcCxnYWluPDwxKTsKCiAgICAgICAgc2FtcGxlc1tpICogY2hhbm5lbHMgKyBqXSA9IEZYX0RCTDJGWF9QQ00oKEZJWFBfREJMKVNBVFVSQVRFX0xFRlRfU0hJRlQodG1wLFRETF9HQUlOX1NDQUxJTkcsREZSQUNUX0JJVFMpKTsKICAgICAgfQogICAgICBkZWxheUJ1ZklkeCsrOwogICAgICBpZiAoZGVsYXlCdWZJZHggPj0gYXR0YWNrKSBkZWxheUJ1ZklkeCA9IDA7CgogICAgICAvKiBzYXZlIG1pbmltdW0gZ2FpbiBmYWN0b3IgKi8KICAgICAgaWYgKGdhaW4gPCBtaW5HYWluKSBtaW5HYWluID0gZ2FpbjsKICAgIH0KCgogICAgbGltaXRlci0+bWF4ID0gbWF4OwogICAgbGltaXRlci0+bWF4QnVmSWR4ID0gbWF4QnVmSWR4OwogICAgbGltaXRlci0+Y29yID0gY29yOwogICAgbGltaXRlci0+ZGVsYXlCdWZJZHggPSBkZWxheUJ1ZklkeDsKCiAgICBsaW1pdGVyLT5zbW9vdGhTdGF0ZTAgPSBzbW9vdGhTdGF0ZTA7CiAgICBsaW1pdGVyLT5hZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlID0gYWRkaXRpb25hbEdhaW5TbW9vdGhTdGF0ZTsKICAgIGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluRmlsdGVyU3RhdGUxID0gYWRkaXRpb25hbEdhaW5TbW9vdGhTdGF0ZTE7CgogICAgbGltaXRlci0+bWluR2FpbiA9IG1pbkdhaW47CgogICAgbGltaXRlci0+YWRkaXRpb25hbEdhaW5QcmV2ID0gcEdhaW5bMF07CgogICAgcmV0dXJuIFRETElNSVRfT0s7CiAgfQp9CgovKiBnZXQgZGVsYXkgaW4gc2FtcGxlcyAqLwp1bnNpZ25lZCBpbnQgZ2V0TGltaXRlckRlbGF5KFRETGltaXRlclB0ciBsaW1pdGVyKQp7CiAgRkRLX0FTU0VSVChsaW1pdGVyICE9IE5VTEwpOwogIHJldHVybiBsaW1pdGVyLT5hdHRhY2s7Cn0KCi8qIHNldCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KVERMSU1JVEVSX0VSUk9SIHNldExpbWl0ZXJOQ2hhbm5lbHMoVERMaW1pdGVyUHRyIGxpbWl0ZXIsIHVuc2lnbmVkIGludCBuQ2hhbm5lbHMpCnsKICBpZiAoIGxpbWl0ZXIgPT0gTlVMTCApIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOwoKICBpZiAobkNoYW5uZWxzID4gbGltaXRlci0+bWF4Q2hhbm5lbHMpIHJldHVybiBURExJTUlUX0lOVkFMSURfUEFSQU1FVEVSOwoKICBsaW1pdGVyLT5jaGFubmVscyA9IG5DaGFubmVsczsKICAvL3Jlc2V0TGltaXRlcihsaW1pdGVyKTsKCiAgcmV0dXJuIFRETElNSVRfT0s7Cn0KCi8qIHNldCBzYW1wbGluZyByYXRlICovClRETElNSVRFUl9FUlJPUiBzZXRMaW1pdGVyU2FtcGxlUmF0ZShURExpbWl0ZXJQdHIgbGltaXRlciwgdW5zaWduZWQgaW50IHNhbXBsZVJhdGUpCnsKICB1bnNpZ25lZCBpbnQgYXR0YWNrLCByZWxlYXNlOwogIEZJWFBfREJMIGF0dGFja0NvbnN0LCByZWxlYXNlQ29uc3QsIGV4cG9uZW50OwogIElOVCBlX2FuczsKCiAgaWYgKCBsaW1pdGVyID09IE5VTEwgKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKCiAgaWYgKHNhbXBsZVJhdGUgPiBsaW1pdGVyLT5tYXhTYW1wbGVSYXRlKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX1BBUkFNRVRFUjsKCiAgLyogdXBkYXRlIGF0dGFjayBhbmQgcmVsZWFzZSB0aW1lIGluIHNhbXBsZXMgKi8KICBhdHRhY2sgPSAodW5zaWduZWQgaW50KShsaW1pdGVyLT5hdHRhY2tNcyAqIHNhbXBsZVJhdGUgLyAxMDAwKTsKICByZWxlYXNlID0gKHVuc2lnbmVkIGludCkobGltaXRlci0+cmVsZWFzZU1zICogc2FtcGxlUmF0ZSAvIDEwMDApOwoKICAvKiBhdHRhY2tDb25zdCA9IHBvdygwLjEsIDEuMCAvIChhdHRhY2sgKyAxKSkgKi8KICBleHBvbmVudCA9IGludkZpeHAoYXR0YWNrKzEpOwogIGF0dGFja0NvbnN0ID0gZlBvdyhGTDJGWENPTlNUX0RCTCgwLjFmKSwgMCwgZXhwb25lbnQsIDAsICZlX2Fucyk7CiAgYXR0YWNrQ29uc3QgPSBzY2FsZVZhbHVlKGF0dGFja0NvbnN0LCBlX2Fucyk7CgogIC8qIHJlbGVhc2VDb25zdCAgPSAoZmxvYXQpcG93KDAuMSwgMS4wIC8gKHJlbGVhc2UgKyAxKSkgKi8KICBleHBvbmVudCA9IGludkZpeHAocmVsZWFzZSArIDEpOwogIHJlbGVhc2VDb25zdCA9IGZQb3coRkwyRlhDT05TVF9EQkwoMC4xZiksIDAsIGV4cG9uZW50LCAwLCAmZV9hbnMpOwogIHJlbGVhc2VDb25zdCA9IHNjYWxlVmFsdWUocmVsZWFzZUNvbnN0LCBlX2Fucyk7CgogIGxpbWl0ZXItPmF0dGFjayAgICAgICAgPSBhdHRhY2s7CiAgbGltaXRlci0+YXR0YWNrQ29uc3QgICA9IGF0dGFja0NvbnN0OwogIGxpbWl0ZXItPnJlbGVhc2VDb25zdCAgPSByZWxlYXNlQ29uc3Q7CiAgbGltaXRlci0+c2FtcGxlUmF0ZSAgICA9IHNhbXBsZVJhdGU7CgogIC8qIHJlc2V0ICovCiAgLy9yZXNldExpbWl0ZXIobGltaXRlcik7CgogIHJldHVybiBURExJTUlUX09LOwp9CgovKiBzZXQgYXR0YWNrIHRpbWUgKi8KVERMSU1JVEVSX0VSUk9SIHNldExpbWl0ZXJBdHRhY2soVERMaW1pdGVyUHRyIGxpbWl0ZXIsIHVuc2lnbmVkIGludCBhdHRhY2tNcykKewogIHVuc2lnbmVkIGludCBhdHRhY2s7CiAgRklYUF9EQkwgYXR0YWNrQ29uc3QsIGV4cG9uZW50OwogIElOVCBlX2FuczsKCiAgaWYgKCBsaW1pdGVyID09IE5VTEwgKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKCiAgaWYgKGF0dGFja01zID4gbGltaXRlci0+bWF4QXR0YWNrTXMpIHJldHVybiBURExJTUlUX0lOVkFMSURfUEFSQU1FVEVSOwoKICAvKiBjYWxjdWxhdGUgYXR0YWNrIHRpbWUgaW4gc2FtcGxlcyAqLwogIGF0dGFjayA9ICh1bnNpZ25lZCBpbnQpKGF0dGFja01zICogbGltaXRlci0+c2FtcGxlUmF0ZSAvIDEwMDApOwoKICAvKiBhdHRhY2tDb25zdCA9IHBvdygwLjEsIDEuMCAvIChhdHRhY2sgKyAxKSkgKi8KICBleHBvbmVudCA9IGludkZpeHAoYXR0YWNrKzEpOwogIGF0dGFja0NvbnN0ID0gZlBvdyhGTDJGWENPTlNUX0RCTCgwLjFmKSwgMCwgZXhwb25lbnQsIDAsICZlX2Fucyk7CiAgYXR0YWNrQ29uc3QgPSBzY2FsZVZhbHVlKGF0dGFja0NvbnN0LCBlX2Fucyk7CgogIGxpbWl0ZXItPmF0dGFjayAgICAgICAgPSBhdHRhY2s7CiAgbGltaXRlci0+YXR0YWNrQ29uc3QgICA9IGF0dGFja0NvbnN0OwogIGxpbWl0ZXItPmF0dGFja01zICAgICAgPSBhdHRhY2tNczsKCiAgcmV0dXJuIFRETElNSVRfT0s7Cn0KCi8qIHNldCByZWxlYXNlIHRpbWUgKi8KVERMSU1JVEVSX0VSUk9SIHNldExpbWl0ZXJSZWxlYXNlKFRETGltaXRlclB0ciBsaW1pdGVyLCB1bnNpZ25lZCBpbnQgcmVsZWFzZU1zKQp7CiAgdW5zaWduZWQgaW50IHJlbGVhc2U7CiAgRklYUF9EQkwgcmVsZWFzZUNvbnN0LCBleHBvbmVudDsKICBJTlQgZV9hbnM7CgogIGlmICggbGltaXRlciA9PSBOVUxMICkgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9IQU5ETEU7CgogIC8qIGNhbGN1bGF0ZSAgcmVsZWFzZSB0aW1lIGluIHNhbXBsZXMgKi8KICByZWxlYXNlID0gKHVuc2lnbmVkIGludCkocmVsZWFzZU1zICogbGltaXRlci0+c2FtcGxlUmF0ZSAvIDEwMDApOwoKICAvKiByZWxlYXNlQ29uc3QgID0gKGZsb2F0KXBvdygwLjEsIDEuMCAvIChyZWxlYXNlICsgMSkpICovCiAgZXhwb25lbnQgPSBpbnZGaXhwKHJlbGVhc2UgKyAxKTsKICByZWxlYXNlQ29uc3QgPSBmUG93KEZMMkZYQ09OU1RfREJMKDAuMWYpLCAwLCBleHBvbmVudCwgMCwgJmVfYW5zKTsKICByZWxlYXNlQ29uc3QgPSBzY2FsZVZhbHVlKHJlbGVhc2VDb25zdCwgZV9hbnMpOwoKICBsaW1pdGVyLT5yZWxlYXNlQ29uc3QgID0gcmVsZWFzZUNvbnN0OwogIGxpbWl0ZXItPnJlbGVhc2VNcyAgICAgPSByZWxlYXNlTXM7CgogIHJldHVybiBURExJTUlUX09LOwp9CgovKiBzZXQgbGltaXRlciB0aHJlc2hvbGQgKi8KVERMSU1JVEVSX0VSUk9SIHNldExpbWl0ZXJUaHJlc2hvbGQoVERMaW1pdGVyUHRyIGxpbWl0ZXIsIElOVF9QQ00gdGhyZXNob2xkKQp7CiAgaWYgKCBsaW1pdGVyID09IE5VTEwgKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKCiAgbGltaXRlci0+dGhyZXNob2xkID0gKEZJWFBfUENNKXRocmVzaG9sZDsKCiAgcmV0dXJuIFRETElNSVRfT0s7Cn0K