Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSAidHJhbl9kZXQuaCIKCiNpbmNsdWRlICJmcmFtX2dlbi5oIgojaW5jbHVkZSAic2JyX3JhbS5oIgojaW5jbHVkZSAic2JyX21pc2MuaCIKCiNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgoKI2RlZmluZSBOT1JNX1FNRl9FTkVSR1kgOS4zMTMyMjU3NDYxNTQ3OUUtMTAgLyogMl4tMzAgKi8KCi8qIHN0YXRpYyBGSVhQX0RCTCBBQlNfVEhSRVMgPSBmaXhNYXgoIEZMMkZYQ09OU1RfREJMKDEuMjhlNSAqICBOT1JNX1FNRl9FTkVSR1kpLCAoRklYUF9EQkwpMSkgIE1pbmltdW0gdGhyZXNob2xkIGZvciBkZXRlY3RpbmcgY2hhbmdlcyAqLwojZGVmaW5lIEFCU19USFJFUyAoKEZJWFBfREJMKTE2KQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIHNwZWN0cmFsQ2hhbmdlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBcYnJpZWYgICBDYWxjdWxhdGVzIGEgbWVhc3VyZSBmb3IgdGhlIHNwZWN0cmFsIGNoYW5nZSB3aXRoaW4gdGhlIGZyYW1lCgogVGhlIGZ1bmN0aW9uIHNheXMgaG93IGdvb2QgaXQgd291bGQgYmUgdG8gc3BsaXQgdGhlIGZyYW1lIGF0IHRoZSBnaXZlbiBib3JkZXIKIHBvc2l0aW9uIGludG8gMiBlbnZlbG9wZXMuCgogVGhlIHJldHVybiB2YWx1ZSBkZWx0YV9zdW0gaXMgc2NhbGVkIHdpdGggdGhlIGZhY3RvciAxLzY0CgogXHJldHVybiAgY2FsY3VsYXRlZCB2YWx1ZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojZGVmaW5lIE5SR19TSElGVCAgMyAvKiBmb3IgZW5lcmd5IHN1bW1hdGlvbiAqLwoKc3RhdGljIEZJWFBfREJMIHNwZWN0cmFsQ2hhbmdlKEZJWFBfREJMIEVuZXJnaWVzW05VTUJFUl9USU1FX1NMT1RTXzIzMDRdW01BWF9GUkVRX0NPRUZGU10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNjYWxlRW5lcmdpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBFbmVyZ3lUb3RhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJvcmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBZQnVmZmVyV3JpdGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcmVzdWx0X2UpCnsKICBJTlQgaSxqOwogIElOVCBsZW4xLGxlbjI7CiAgU0NIQVIgZW5lcmdpZXNfZV9kaWZmW05VTUJFUl9USU1FX1NMT1RTXzIzMDRdLCBlbmVyZ2llc19lLCBlbmVyZ3lUb3RhbF9lPTE5LCBlbmVyZ2llc19lX2FkZDsKICBTQ0hBUiBwcmV2RW5lcmdpZXNfZV9kaWZmLCBuZXdFbmVyZ2llc19lX2RpZmY7CiAgRklYUF9EQkwgdG1wMCx0bXAxOwogIEZJWFBfREJMIGFjY3UxLGFjY3UyLGFjY3UxX2luaXQsYWNjdTJfaW5pdDsKICBGSVhQX0RCTCBkZWx0YSwgZGVsdGFfc3VtOwogIElOVCBhY2N1X2UsIHRtcF9lOwoKICBkZWx0YV9zdW0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAqcmVzdWx0X2UgPSAwOwoKICBsZW4xID0gYm9yZGVyLXN0YXJ0OwogIGxlbjIgPSBzdG9wLWJvcmRlcjsKCiAgLyogcHJlZmVyIGJvcmRlcnMgbmVhciB0aGUgbWlkZGxlIG9mIHRoZSBmcmFtZSAqLwogIEZJWFBfREJMICAgcG9zX3dlaWdodDsKICBwb3Nfd2VpZ2h0ID0gRkwyRlhDT05TVF9EQkwoMC41ZikgLSAobGVuMSpHZXRJbnZJbnQobGVuMStsZW4yKSk7CiAgcG9zX3dlaWdodCA9IC8qRkwyRlhDT05TVF9EQkwoMS4wKSovIChGSVhQX0RCTClNQVhWQUxfREJMIC0gKGZNdWx0KHBvc193ZWlnaHQsIHBvc193ZWlnaHQpPDwyKTsKCiAgLyoqKiBDYWxjIHNjYWxpbmcgZm9yIGVuZXJnaWVzICoqKi8KICBGREtfQVNTRVJUKHNjYWxlRW5lcmdpZXNbMF0gPj0gMCk7CiAgRkRLX0FTU0VSVChzY2FsZUVuZXJnaWVzWzFdID49IDApOwoKICBlbmVyZ2llc19lID0gMTkgLSBGREttaW4oc2NhbGVFbmVyZ2llc1swXSwgc2NhbGVFbmVyZ2llc1sxXSk7CgogIC8qIGxpbWl0IHNoaWZ0IGZvciBlbmVyZ3kgYWNjdW11bGF0aW9uLCBlbmVyZ2llc19lIGNhbiBiZSAtMTAgbWluLiAqLwogIGlmIChlbmVyZ2llc19lIDwgLTEwKSB7CiAgICAgZW5lcmdpZXNfZV9hZGQgPSAtMTAgLSBlbmVyZ2llc19lOwogICAgIGVuZXJnaWVzX2UgPSAtMTA7CiAgfSBlbHNlIGlmIChlbmVyZ2llc19lID4gMTcpIHsKICAgICBlbmVyZ2llc19lX2FkZCA9IGVuZXJnaWVzX2UgLSAxNzsKICAgICBlbmVyZ2llc19lID0gMTc7CiAgfSBlbHNlIHsKICAgICBlbmVyZ2llc19lX2FkZCA9IDA7CiAgfQoKICAvKiBjb21wZW5zYXRlIHNjYWxpbmcgZGlmZmVyZW5jZXMgYmV0d2VlbiBzY2FsZUVuZXJnaWVzWzBdIGFuZCBzY2FsZUVuZXJnaWVzWzFdICAqLwogIHByZXZFbmVyZ2llc19lX2RpZmYgPSBzY2FsZUVuZXJnaWVzWzBdIC0gRkRLbWluKHNjYWxlRW5lcmdpZXNbMF0sIHNjYWxlRW5lcmdpZXNbMV0pICsgZW5lcmdpZXNfZV9hZGQgKyBOUkdfU0hJRlQ7CiAgbmV3RW5lcmdpZXNfZV9kaWZmICA9IHNjYWxlRW5lcmdpZXNbMV0gLSBGREttaW4oc2NhbGVFbmVyZ2llc1swXSwgc2NhbGVFbmVyZ2llc1sxXSkgKyBlbmVyZ2llc19lX2FkZCArIE5SR19TSElGVDsKCiAgcHJldkVuZXJnaWVzX2VfZGlmZiA9IGZNaW4ocHJldkVuZXJnaWVzX2VfZGlmZiwgREZSQUNUX0JJVFMtMSk7CiAgbmV3RW5lcmdpZXNfZV9kaWZmICA9IGZNaW4obmV3RW5lcmdpZXNfZV9kaWZmLCAgREZSQUNUX0JJVFMtMSk7CgogIGZvciAoaT1zdGFydDsgaTxZQnVmZmVyV3JpdGVPZmZzZXQ7IGkrKykgewogICAgZW5lcmdpZXNfZV9kaWZmW2ldID0gcHJldkVuZXJnaWVzX2VfZGlmZjsKICB9CiAgZm9yIChpPVlCdWZmZXJXcml0ZU9mZnNldDsgaTxzdG9wOyBpKyspIHsKICAgIGVuZXJnaWVzX2VfZGlmZltpXSA9IG5ld0VuZXJnaWVzX2VfZGlmZjsKICB9CgogIC8qIFN1bSB1cCBlbmVyZ2llcyBvZiBhbGwgUU1GLXRpbWVzbG90cyBmb3IgYm90aCBoYWxmcyAqLwogIEZES19BU1NFUlQobGVuMTw9OCk7IC8qIG90aGVyd2lzZSBhbiBvdmVyZmxvdyBpcyBwb3NzaWJsZSAqLwogIEZES19BU1NFUlQobGVuMjw9OCk7IC8qIG90aGVyd2lzZSBhbiBvdmVyZmxvdyBpcyBwb3NzaWJsZSAqLwogIC8qIGluaXQgd2l0aCBzb21lIGVuZXJneSB0byBwcmV2ZW50IGRpdmlzaW9uIGJ5IHplcm8KICAgICAgYW5kIHRvIHByZXZlbnQgc3BsaXR0aW5nIGZvciB2ZXJ5IGxvdyBsZXZlbHMgKi8KICBhY2N1MV9pbml0ID0gc2NhbGVWYWx1ZSgoRkwyRlhDT05TVF9EQkwoKDEuMGU2Kk5PUk1fUU1GX0VORVJHWSkpKSwtZW5lcmdpZXNfZSk7CiAgYWNjdTJfaW5pdCA9IHNjYWxlVmFsdWUoKEZMMkZYQ09OU1RfREJMKCgxLjBlNipOT1JNX1FNRl9FTkVSR1kpKSksLWVuZXJnaWVzX2UpOwogIGFjY3UxX2luaXQgPSBmTXVsdChhY2N1MV9pbml0LCAoRklYUF9EQkwpbGVuMTw8KChERlJBQ1RfQklUUy0xKS1OUkdfU0hJRlQtMSkpPDwxOwogIGFjY3UyX2luaXQgPSBmTXVsdChhY2N1Ml9pbml0LCAoRklYUF9EQkwpbGVuMjw8KChERlJBQ1RfQklUUy0xKS1OUkdfU0hJRlQtMSkpPDwxOwoKICBmb3IgKGo9MDsgajxuU2ZiOyBqKyspIHsKCiAgICBhY2N1MSA9IGFjY3UxX2luaXQ7CiAgICBhY2N1MiA9IGFjY3UyX2luaXQ7CiAgICBhY2N1X2UgPSBlbmVyZ2llc19lKzM7CgogICAgLyogU3VtIHVwIGVuZXJnaWVzIGluIGZpcnN0IGhhbGYgKi8KICAgIGZvciAoaT1zdGFydDsgaTxib3JkZXI7IGkrKykgewogICAgICBhY2N1MSArPSBzY2FsZVZhbHVlKEVuZXJnaWVzW2ldW2pdLCAtZW5lcmdpZXNfZV9kaWZmW2ldKTsKICAgIH0KCiAgICAvKiBTdW0gdXAgZW5lcmdpZXMgaW4gc2Vjb25kIGhhbGYgKi8KICAgIGZvciAoaT1ib3JkZXI7IGk8c3RvcDsgaSsrKSB7CiAgICAgIGFjY3UyICs9IHNjYWxlVmFsdWUoRW5lcmdpZXNbaV1bal0sIC1lbmVyZ2llc19lX2RpZmZbaV0pOwogICAgfQoKICAgIC8qIEVuZXJneSBjaGFuZ2UgaW4gY3VycmVudCBiYW5kICovCiAgICAjZGVmaW5lIExOMiBGTDJGWENPTlNUX0RCTCgwLjY5MzE0NzE4MDZmKSAvKiBsbigyKSAqLwogICAgdG1wMCA9IGZMb2cyKGFjY3UyLCBhY2N1X2UpIC0gZkxvZzIoYWNjdTEsIGFjY3VfZSk7CiAgICB0bXAxID0gZkxvZzIoKEZJWFBfREJMKWxlbjEsIDMxKSAtIGZMb2cyKChGSVhQX0RCTClsZW4yLCAzMSk7CiAgICBkZWx0YSA9IGZNdWx0KExOMiwgKHRtcDAgKyB0bXAxKSk7CiAgICBkZWx0YSA9IChGSVhQX0RCTClGREthYnMoIGRlbHRhICk7CgogICAgLyogV2VpZ2h0aW5nIHdpdGggYW1wbGl0dWRlIHJhdGlvIG9mIHRoaXMgYmFuZCAqLwogICAgYWNjdV9lKys7CiAgICBhY2N1MT4+PTE7CiAgICBhY2N1Mj4+PTE7CiAgICBpZiAoYWNjdV9lICYgMSkgewogICAgICBhY2N1X2UrKzsKICAgICAgYWNjdTE+Pj0xOwogICAgICBhY2N1Mj4+PTE7CiAgICB9CgogICAgZGVsdGFfc3VtICs9IGZNdWx0KHNxcnRGaXhwKGFjY3UxK2FjY3UyKSwgZGVsdGEpOwogICAgKnJlc3VsdF9lID0gKChhY2N1X2U+PjEpICsgTERfREFUQV9TSElGVCk7CiAgfQoKICBlbmVyZ3lUb3RhbF9lKz0xOyAvKiBmb3IgYSBkZWZpbmVkIHNxdWFyZSByZXN1bHQgZXhwb25lbnQsIHRoZSBleHBvbmVudCBoYXMgdG8gYmUgZXZlbiAqLwogIEVuZXJneVRvdGFsPDw9MTsKICBkZWx0YV9zdW0gPSBmTXVsdChkZWx0YV9zdW0sIGludlNxcnROb3JtMihFbmVyZ3lUb3RhbCwgJnRtcF9lKSk7CiAgKnJlc3VsdF9lID0gKnJlc3VsdF9lICsgKHRtcF9lLShlbmVyZ3lUb3RhbF9lPj4xKSk7CgogIHJldHVybiBmTXVsdChkZWx0YV9zdW0sIHBvc193ZWlnaHQpOwoKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBhZGRMb3diYW5kRW5lcmdpZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFxicmllZiAgIENhbGN1bGF0ZXMgdG90YWwgbG93YmFuZCBlbmVyZ3kKCiBUaGUgaW5wdXQgdmFsdWVzIEVuZXJnaWVzWzBdIChsb3ctYmFuZCkgYXJlIHNjYWxlZCBieSB0aGUgZmFjdG9yCiAyXigxNC0qc2NhbGVFbmVyZ2llc1swXSkKIFRoZSBpbnB1dCB2YWx1ZXMgRW5lcmdpZXNbMV0gKGhpZ2gtYmFuZCkgYXJlIHNjYWxlZCBieSB0aGUgZmFjdG9yCiAyXigxNC0qc2NhbGVFbmVyZ2llc1sxXSkKCiBccmV0dXJuICB0b3RhbCBlbmVyZ3kgaW4gdGhlIGxvd2JhbmQsIHNjYWxlZCBieSB0aGUgZmFjdG9yIDJeMTkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEZJWFBfREJMIGFkZExvd2JhbmRFbmVyZ2llcyhGSVhQX0RCTCAqKkVuZXJnaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAqc2NhbGVFbmVyZ2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIG5yZ1N6U2hpZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICB0cmFuX29mZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgKmZyZXFCYW5kVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBzbG90cykKewogIEZJWFBfREJMIG5yZ1RvdGFsOwogIEZJWFBfREJMIGFjY3UxID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgRklYUF9EQkwgYWNjdTIgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICBpbnQgdHJhbl9vZmZkaXYyID0gdHJhbl9vZmY+Pm5yZ1N6U2hpZnQ7CiAgaW50IHRzLGs7CgogIC8qIFN1bSB1cCBsb3diYW5kIGVuZXJneSBmcm9tIG9uZSBmcmFtZSBhdCBvZmZzZXQgdHJhbl9vZmYgKi8KICAvKiBmcmVxQmFuZFRhYmxlW0xPUkVTXSBoYXMgTUFYX0ZSRVFfQ09FRkZTLzIgKzEgY29lZWZzIG1heC4gKi8KICBmb3IgKHRzPXRyYW5fb2ZmZGl2MjsgdHM8WUJ1ZmZlcldyaXRlT2Zmc2V0OyB0cysrKSB7CiAgICBmb3IgKGsgPSAwOyBrIDwgZnJlcUJhbmRUYWJsZVswXTsgaysrKSB7CiAgICAgIGFjY3UxICs9IEVuZXJnaWVzW3RzXVtrXSA+PiA2OwogICAgfQogIH0KICBmb3IgKDsgdHM8dHJhbl9vZmZkaXYyKyhzbG90cz4+bnJnU3pTaGlmdCk7IHRzKyspIHsKICAgIGZvciAoayA9IDA7IGsgPCBmcmVxQmFuZFRhYmxlWzBdOyBrKyspIHsKICAgICAgYWNjdTIgKz0gRW5lcmdpZXNbdHNdW2tdID4+IDk7CiAgICB9CiAgfQoKICBucmdUb3RhbCA9ICggc2NhbGVWYWx1ZVNhdHVyYXRlKGFjY3UxLCAxLXNjYWxlRW5lcmdpZXNbMF0pICkKICAgICAgICAgICArICggc2NhbGVWYWx1ZVNhdHVyYXRlKGFjY3UyLCA0LXNjYWxlRW5lcmdpZXNbMV0pICk7CgogIHJldHVybihucmdUb3RhbCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb25uYW1lOiAgYWRkSGlnaGJhbmRFbmVyZ2llcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogXGJyaWVmICAgQWRkIGhpZ2hiYW5kIGVuZXJnaWVzCgogSGlnaGJhbmQgZW5lcmdpZXMgYXJlIG1hcHBlZCB0byBhbiBhcnJheSB3aXRoIHNtYWxsZXIgZGltZW5zaW9uOgogSXRzIHRpbWUgcmVzb2x1dGlvbiBpcyBvbmx5IDEgU0JSLXRpbWVzbG90IGFuZCBpdHMgZnJlcXVlbmN5IHJlc29sdXRpb24KIGlzIDEgU0JSLWJhbmQuIFRoZXJlZm9yZSB0aGUgZGF0YSB0byBiZSBmZWQgaW50byB0aGUgc3BlY3RyYWxDaGFuZ2UKIGZ1bmN0aW9uIGlzIHJlZHVjZWQuCgogVGhlIHZhbHVlcyBFbmVyZ2llc00gYXJlIHNjYWxlZCBieSB0aGUgZmFjdG9yICgyXjE5LXNjYWxlRW5lcmdpZXNbMF0pIGZvcgogc2xvdHM8WUJ1ZmZlcldyaXRlT2Zmc2V0IGFuZCBieSB0aGUgZmFjdG9yICgyXjE5LXNjYWxlRW5lcmdpZXNbMV0pIGZvcgogc2xvdHM+PVlCdWZmZXJXcml0ZU9mZnNldC4KCiBccmV0dXJuICB0b3RhbCBlbmVyZ3kgaW4gdGhlIGhpZ2hiYW5kLCBzY2FsZWQgYnkgZmFjdG9yIDJeMTkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBGSVhQX0RCTCBhZGRIaWdoYmFuZEVuZXJnaWVzKEZJWFBfREJMICoqUkVTVFJJQ1QgRW5lcmdpZXMsIC8qITwgaW5wdXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICpzY2FsZUVuZXJnaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICBFbmVyZ2llc01bTlVNQkVSX1RJTUVfU0xPVFNfMjMwNF1bTUFYX0ZSRVFfQ09FRkZTXSwgLyohPCBDb21iaW5lZCBvdXRwdXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICpSRVNUUklDVCBmcmVxQmFuZFRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgIG5TZmIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgc2JyU2xvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgdGltZVN0ZXApCnsKICBJTlQgaSxqLGssc2xvdEluLHNsb3RPdXQsc2NhbGVbMl07CiAgSU5UIGxpLHVpOwogIEZJWFBfREJMIG5yZ1RvdGFsOwogIEZJWFBfREJMIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKCiAgLyogQ29tYmluZSBRTUYtdGltZXNsb3RzIHRvIFNCUi10aW1lc2xvdHMsCiAgICAgY29tYmluZSBRTUYtYmFuZHMgdG8gU0JSLWJhbmRzLAogICAgIGNvbWJpbmUgTGVmdCBhbmQgUmlnaHQgY2hhbm5lbCAqLwogIGZvciAoc2xvdE91dD0wOyBzbG90T3V0PHNiclNsb3RzOyBzbG90T3V0KyspIHsKICAgIHNsb3RJbiA9IHRpbWVTdGVwKnNsb3RPdXQ7CgogICAgZm9yIChqPTA7IGo8blNmYjsgaisrKSB7CiAgICAgIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKCiAgICAgIGxpID0gZnJlcUJhbmRUYWJsZVtqXTsKICAgICAgdWkgPSBmcmVxQmFuZFRhYmxlW2ogKyAxXTsKCiAgICAgIGZvciAoaz1saTsgazx1aTsgaysrKSB7CiAgICAgICAgZm9yIChpPTA7IGk8dGltZVN0ZXA7IGkrKykgewogICAgICAgICBhY2N1ICs9IChFbmVyZ2llc1soc2xvdEluK2kpPj4xXVtrXSA+PiA1KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgRW5lcmdpZXNNW3Nsb3RPdXRdW2pdID0gYWNjdTsKICAgIH0KICB9CgogIC8qIHNjYWxlIGVuZXJnaWVzIGRvd24gYmVmb3JlIGFkZCB1cCAqLwogIHNjYWxlWzBdID0gZml4TWluKDgsc2NhbGVFbmVyZ2llc1swXSk7CiAgc2NhbGVbMV0gPSBmaXhNaW4oOCxzY2FsZUVuZXJnaWVzWzFdKTsKCiAgaWYgKChzY2FsZUVuZXJnaWVzWzBdLXNjYWxlWzBdKSA+IChERlJBQ1RfQklUUy0xKSB8fCAoc2NhbGVFbmVyZ2llc1sxXS1zY2FsZVswXSkgPiAoREZSQUNUX0JJVFMtMSkpCiAgICBucmdUb3RhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogIGVsc2UgewogICAgLyogTm93IGFkZCBhbGwgZW5lcmdpZXMgKi8KICAgIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKCiAgICBmb3IgKHNsb3RPdXQ9MDsgc2xvdE91dDxZQnVmZmVyV3JpdGVPZmZzZXQ7IHNsb3RPdXQrKykgewogICAgICBmb3IgKGo9MDsgajxuU2ZiOyBqKyspIHsKICAgICAgICBhY2N1ICs9IChFbmVyZ2llc01bc2xvdE91dF1bal0gPj4gc2NhbGVbMF0pOwogICAgICB9CiAgICB9CiAgICBucmdUb3RhbCA9IGFjY3UgPj4gKHNjYWxlRW5lcmdpZXNbMF0tc2NhbGVbMF0pOwoKICAgIGZvciAoc2xvdE91dD1ZQnVmZmVyV3JpdGVPZmZzZXQ7IHNsb3RPdXQ8c2JyU2xvdHM7IHNsb3RPdXQrKykgewogICAgICBmb3IgKGo9MDsgajxuU2ZiOyBqKyspIHsKICAgICAgICBhY2N1ICs9IChFbmVyZ2llc01bc2xvdE91dF1bal0gPj4gc2NhbGVbMF0pOwogICAgICB9CiAgICB9CiAgICBucmdUb3RhbCA9IGFjY3UgPj4gKHNjYWxlRW5lcmdpZXNbMV0tc2NhbGVbMV0pOwogIH0KCiAgcmV0dXJuKG5yZ1RvdGFsKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfZnJhbWVTcGxpdHRlcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogXGJyaWVmICAgRGVjaWRlcyBpZiBhIEZJWEZJWC1mcmFtZSBzaGFsbCBiZSBzcGxpdHRlZCBpbnRvIDIgZW52ZWxvcGVzCgogSWYgbm8gdHJhbnNpZW50IGhhcyBiZWVuIGRldGVjdGVkIGJlZm9yZSwgdGhlIGZyYW1lIGNhbiBzdGlsbCBiZSBzcGxpdHRlZAogaW50byAyIGVudmVsb3Blcy4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZApGREtzYnJFbmNfZnJhbWVTcGxpdHRlcihGSVhQX0RCTCAqKkVuZXJnaWVzLAogICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNjYWxlRW5lcmdpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdHJhbl92ZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyV3JpdGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyU3pTaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TZmIsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lU3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiB0b25hbGl0eSkKewogIGlmICh0cmFuX3ZlY3RvclsxXT09MCkgLyogbm8gdHJhbnNpZW50IHdhcyBkZXRlY3RlZCAqLwogIHsKICAgIEZJWFBfREJMIGRlbHRhOwogICAgSU5UIGRlbHRhX2U7CiAgICBGSVhQX0RCTCAoKkVuZXJnaWVzTSlbTUFYX0ZSRVFfQ09FRkZTXTsKICAgIEZJWFBfREJMIEVuZXJneVRvdGFsLG5ld0xvd2JhbmRFbmVyZ3ksbmV3SGlnaGJhbmRFbmVyZ3k7CiAgICBJTlQgYm9yZGVyOwogICAgSU5UIHNiclNsb3RzID0gZk11bHRJKEdldEludkludCh0aW1lU3RlcCksbm9fY29scyk7CiAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoX0VuZXJnaWVzTSwgRklYUF9EQkwsIE5VTUJFUl9USU1FX1NMT1RTXzIzMDQqTUFYX0ZSRVFfQ09FRkZTKQoKICAgIEZES19BU1NFUlQoIHNiclNsb3RzICogdGltZVN0ZXAgPT0gbm9fY29scyApOwoKICAgIEVuZXJnaWVzTSA9IChGSVhQX0RCTCgqKVtNQVhfRlJFUV9DT0VGRlNdKV9FbmVyZ2llc007CgogICAgLyoKICAgICAgR2V0IExvd2JhbmQtZW5lcmd5IG92ZXIgYSByYW5nZSBvZiAyIGZyYW1lcyAoTG9vayBoYWxmIGEgZnJhbWUgYmFjayBhbmQgYWhlYWQpLgogICAgKi8KICAgIG5ld0xvd2JhbmRFbmVyZ3kgPSBhZGRMb3diYW5kRW5lcmdpZXMoRW5lcmdpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRW5lcmdpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5fb2ZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub19jb2xzKTsKCiAgICBuZXdIaWdoYmFuZEVuZXJneSA9IGFkZEhpZ2hiYW5kRW5lcmdpZXMoRW5lcmdpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVFbmVyZ2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5lcmdpZXNNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXFCYW5kVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblNmYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJTbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU3RlcCk7CgogICAgewogICAgICAvKiBwcmV2TG93QmFuZEVuZXJneTogQ29ycmVzcG9uZHMgdG8gMSBmcmFtZSwgc3RhcnRpbmcgd2l0aCBoYWxmIGEgZnJhbWUgbG9vay1iZWhpbmQKICAgICAgICAgbmV3TG93YmFuZEVuZXJneTogIENvcnJlc3BvbmRzIHRvIDEgZnJhbWUsIHN0YXJ0aW5nIGluIHRoZSBtaWRkbGUgb2YgdGhlIGN1cnJlbnQgZnJhbWUgKi8KICAgICAgRW5lcmd5VG90YWwgPSAobmV3TG93YmFuZEVuZXJneSArIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnByZXZMb3dCYW5kRW5lcmd5KSA+PiAxOwogICAgICBFbmVyZ3lUb3RhbCArPSBuZXdIaWdoYmFuZEVuZXJneTsKICAgICAgLyogVGhlIGJlbG93IGJvcmRlciBzaG91bGQgc3BlY2lmeSB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgbWlkZGxlIGJvcmRlcgogICAgICAgICBvZiBhIEZJWEZJWC1mcmFtZSB3aXRoIDIgZW52ZWxvcGVzLiAqLwogICAgICBib3JkZXIgPSAoc2JyU2xvdHMrMSkgPj4gMTsKCiAgICAgIGlmICggKElOVClFbmVyZ3lUb3RhbCYweGZmZmZmZmUwICYmIChzY2FsZUVuZXJnaWVzWzBdPDMyIHx8IHNjYWxlRW5lcmdpZXNbMV08MzIpICkgLyogaS5lLiA+IDMxICovIHsKICAgICAgZGVsdGEgPSBzcGVjdHJhbENoYW5nZShFbmVyZ2llc00sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVFbmVyZ2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmVyZ3lUb3RhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU2ZiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJTbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkZWx0YSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgIGRlbHRhX2UgPSAwOwoKICAgICAgICAvKiBzZXQgdG9uYWxpdHkgdG8gMCB3aGVuIGVuZXJneSBpcyB2ZXJ5IGxvdywgc2luY2UgdGhlIGFtcGxpdHVkZQogICAgICAgICAgIHJlc29sdXRpb24gc2hvdWxkIHRoZW4gYmUgbG93IGFzIHdlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgKnRvbmFsaXR5ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgIH0KCgogICAgICBpZiAoIGZJc0xlc3NUaGFuKGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnNwbGl0X3Rocl9tLCBoX3NiclRyYW5zaWVudERldGVjdG9yLT5zcGxpdF90aHJfZSwgZGVsdGEsIGRlbHRhX2UpICkgewogICAgICAgIHRyYW5fdmVjdG9yWzBdID0gMTsgLyogU2V0IGZsYWcgZm9yIHNwbGl0dGluZyAqLwogICAgICB9IGVsc2UgewogICAgICAgIHRyYW5fdmVjdG9yWzBdID0gMDsKICAgICAgfQoKICAgIH0KCiAgICAvKiBVcGRhdGUgcHJldkxvd0JhbmRFbmVyZ3kgKi8KICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnByZXZMb3dCYW5kRW5lcmd5ID0gbmV3TG93YmFuZEVuZXJneTsKICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnByZXZIaWdoQmFuZEVuZXJneSA9IG5ld0hpZ2hiYW5kRW5lcmd5OwogICAgQ19BTExPQ19TQ1JBVENIX0VORChfRW5lcmdpZXNNLCBGSVhQX0RCTCwgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNCpNQVhfRlJFUV9DT0VGRlMpCiAgfQp9CgovKgogKiBDYWxjdWxhdGUgdHJhbnNpZW50IGVuZXJneSB0aHJlc2hvbGQgZm9yIGVhY2ggUU1GIGJhbmQKICovCnN0YXRpYyB2b2lkCmNhbGN1bGF0ZVRocmVzaG9sZHMoRklYUF9EQkwgKipSRVNUUklDVCBFbmVyZ2llcywKICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgKlJFU1RSSUNUIHNjYWxlRW5lcmdpZXMsCiAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpSRVNUUklDVCB0aHJlc2hvbGRzLAogICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCiAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBub0NvbHMsCiAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBub1Jvd3MsCiAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICB0cmFuX29mZikKewogIEZJWFBfREJMIG1lYW5fdmFsLHN0ZF92YWwsdGVtcDsKICBGSVhQX0RCTCBpX25vQ29sczsKICBGSVhQX0RCTCBpX25vQ29sczE7CiAgRklYUF9EQkwgYWNjdSxhY2N1MCxhY2N1MTsKICBpbnQgc2NhbGVGYWN0b3IwLHNjYWxlRmFjdG9yMSxjb21tb25TY2FsZTsKICBpbnQgaSxqOwoKICBpX25vQ29scyAgPSBHZXRJbnZJbnQobm9Db2xzICsgdHJhbl9vZmYgKSA8PCBZQnVmZmVyU3pTaGlmdDsKICBpX25vQ29sczEgPSBHZXRJbnZJbnQobm9Db2xzICsgdHJhbl9vZmYgLSAxKSA8PCBZQnVmZmVyU3pTaGlmdDsKCiAgLyogY2FsYyBtaW5pbXVtIHNjYWxlIG9mIGVuZXJnaWVzIG9mIHByZXZpb3VzIGFuZCBjdXJyZW50IGZyYW1lICovCiAgY29tbW9uU2NhbGUgPSBmaXhNaW4oc2NhbGVFbmVyZ2llc1swXSxzY2FsZUVuZXJnaWVzWzFdKTsKCiAgLyogY2FsYyBzY2FsZWZhY3RvcnMgdG8gYWRhcHQgZW5lcmdpZXMgdG8gY29tbW9uIHNjYWxlICovCiAgc2NhbGVGYWN0b3IwID0gZml4TWluKChzY2FsZUVuZXJnaWVzWzBdLWNvbW1vblNjYWxlKSwgKERGUkFDVF9CSVRTLTEpKTsKICBzY2FsZUZhY3RvcjEgPSBmaXhNaW4oKHNjYWxlRW5lcmdpZXNbMV0tY29tbW9uU2NhbGUpLCAoREZSQUNUX0JJVFMtMSkpOwoKICBGREtfQVNTRVJUKChzY2FsZUZhY3RvcjAgPj0gMCkgJiYgKHNjYWxlRmFjdG9yMSA+PSAwKSk7CgogIC8qIGNhbGN1bGF0ZSBzdGFuZGFyZCBkZXZpYXRpb24gaW4gZXZlcnkgc3ViYmFuZCAqLwogIGZvciAoaT0wOyBpPG5vUm93czsgaSsrKQogIHsKICAgIGludCBzdGFydEVuZXJneSA9ICh0cmFuX29mZj4+WUJ1ZmZlclN6U2hpZnQpOwogICAgaW50IGVuZEVuZXJneSA9ICgobm9Db2xzPj5ZQnVmZmVyU3pTaGlmdCkrdHJhbl9vZmYpOwogICAgaW50IHNoaWZ0OwoKICAgIC8qIGNhbGN1bGF0ZSBtZWFuIHZhbHVlIG92ZXIgZGVjaW1hdGVkIGVuZXJneSB2YWx1ZXMgKGRvd25zYW1wbGVkIGJ5IDIpLiAqLwogICAgYWNjdTAgPSBhY2N1MSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwoKICAgIGZvciAoaj1zdGFydEVuZXJneTsgajxZQnVmZmVyV3JpdGVPZmZzZXQ7IGorKykKICAgICAgYWNjdTAgKz0gZk11bHQoRW5lcmdpZXNbal1baV0sIGlfbm9Db2xzKTsKICAgIGZvciAoOyBqPGVuZEVuZXJneTsgaisrKQogICAgICBhY2N1MSArPSBmTXVsdChFbmVyZ2llc1tqXVtpXSwgaV9ub0NvbHMpOwoKICAgIG1lYW5fdmFsID0gKGFjY3UwID4+IHNjYWxlRmFjdG9yMCkgKyAoYWNjdTEgPj4gc2NhbGVGYWN0b3IxKTsgIC8qIGF2ZXJhZ2UgKi8KICAgIHNoaWZ0ICAgID0gZml4TWF4KDAsQ291bnRMZWFkaW5nQml0cyhtZWFuX3ZhbCktNik7ICAgICAgICAgICAgIC8qIC02IHRvIGtlZXAgcm9vbSBmb3IgYWNjdW11bGF0aW5nIHVwdG8gTiA9IDI0IHZhbHVlcyAqLwoKICAgIC8qIGNhbGN1bGF0ZSBzdGFuZGFyZCBkZXZpYXRpb24gKi8KICAgIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKCiAgICAvKiBzdW1tZSB7ICgobWVhbl92YWwtbnJnKV4yKSAqIGlfbm9Db2xzMSB9ICovCiAgICBmb3IgKGo9c3RhcnRFbmVyZ3k7IGo8WUJ1ZmZlcldyaXRlT2Zmc2V0OyBqKyspIHsKICAgICAgdGVtcCA9ICgoRklYUF9EQkwpbWVhbl92YWwgLSAoKEZJWFBfREJMKUVuZXJnaWVzW2pdW2ldID4+IHNjYWxlRmFjdG9yMCkpPDxzaGlmdDsKICAgICAgdGVtcCA9IGZQb3cyKHRlbXApOwogICAgICB0ZW1wID0gZk11bHQodGVtcCwgaV9ub0NvbHMxKTsKICAgICAgYWNjdSArPSB0ZW1wOwogICAgfQogICAgZm9yICg7IGo8ZW5kRW5lcmd5OyBqKyspIHsKICAgICAgdGVtcCA9ICgoRklYUF9EQkwpbWVhbl92YWwgLSAoKEZJWFBfREJMKUVuZXJnaWVzW2pdW2ldID4+IHNjYWxlRmFjdG9yMSkpPDxzaGlmdDsKICAgICAgdGVtcCA9IGZQb3cyKHRlbXApOwogICAgICB0ZW1wID0gZk11bHQodGVtcCwgaV9ub0NvbHMxKTsKICAgICAgYWNjdSArPSB0ZW1wOwogICAgfQoKICAgIHN0ZF92YWwgPSBzcXJ0Rml4cChhY2N1KT4+c2hpZnQ7ICAgICAvKiBzdGFuZGFyZCBkZXZpYXRpb24gKi8KCiAgICAvKgogICAgVGFrZSBuZXcgdGhyZXNob2xkIGFzIGF2ZXJhZ2Ugb2YgY2FsY3VsYXRlZCBzdGFuZGFyZCBkZXZpYXRpb24gcmF0aW8KICAgIGFuZCBvbGQgdGhyZXNob2xkIGlmIGdyZWF0ZXIgdGhhbiBhYnNvbHV0ZSB0aHJlc2hvbGQKICAgICovCiAgICB0ZW1wID0gKCBjb21tb25TY2FsZTw9KERGUkFDVF9CSVRTLTEpICkKICAgICAgICAgICAgPyBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjY2ZiksIHRocmVzaG9sZHNbaV0pICsgKGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMzRmKSwgc3RkX3ZhbCkgPj4gY29tbW9uU2NhbGUpCiAgICAgICAgICAgIDogKEZJWFBfREJMKSAwOwoKICAgIHRocmVzaG9sZHNbaV0gPSBmaXhNYXgoQUJTX1RIUkVTLHRlbXApOwoKICAgIEZES19BU1NFUlQoY29tbW9uU2NhbGUgPj0gMCk7CiAgfQp9CgovKgogKiBDYWxjdWxhdGUgdHJhbnNpZW50IGxldmVscyBmb3IgZWFjaCBRTUYgdGltZSBzbG90LgogKi8Kc3RhdGljIHZvaWQKZXh0cmFjdFRyYW5zaWVudENhbmRpZGF0ZXMoRklYUF9EQkwgICoqUkVTVFJJQ1QgRW5lcmdpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgKlJFU1RSSUNUIHNjYWxlRW5lcmdpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKlJFU1RSSUNUIHRocmVzaG9sZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKlJFU1RSSUNUIHRyYW5zaWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5vQ29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgc3RhcnRfYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgc3RvcF9iYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICB0cmFuX29mZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYWRkUHJldlNhbXBsZXMpCnsKICBGSVhQX0RCTCBpX3RocmVzOwogIENfQUxMT0NfU0NSQVRDSF9TVEFSVChFbmVyZ2llc1RlbXAsIEZJWFBfREJMLCAyKlFNRl9NQVhfVElNRV9TTE9UUyk7CiAgRklYUF9EQkwgKlJFU1RSSUNUIHBFbmVyZ2llc1RlbXAgPSBFbmVyZ2llc1RlbXA7CiAgaW50IHRtcFNjYWxlRW5lcmdpZXMwLCB0bXBTY2FsZUVuZXJnaWVzMTsKICBpbnQgZW5kQ29uZDsKICBpbnQgc3RhcnRFbmVyZyxlbmRFbmVyZzsKICBpbnQgaSxqLGpJbmRleCxqcEJNOwoKICB0bXBTY2FsZUVuZXJnaWVzMCA9IHNjYWxlRW5lcmdpZXNbMF07CiAgdG1wU2NhbGVFbmVyZ2llczEgPSBzY2FsZUVuZXJnaWVzWzFdOwoKICAvKiBTY2FsZSB2YWx1ZSBmb3IgZmlyc3QgZW5lcmdpZXMsIHVwdG8gWUJ1ZmZlcldyaXRlT2Zmc2V0ICovCiAgdG1wU2NhbGVFbmVyZ2llczAgPSBmaXhNaW4odG1wU2NhbGVFbmVyZ2llczAsIE1BWF9TSElGVF9EQkwpOwogIC8qIFNjYWxlIHZhbHVlIGZvciBmaXJzdCBlbmVyZ2llcywgZnJvbSBZQnVmZmVyV3JpdGVPZmZzZXQgdXB3YXJkcyAqLwogIHRtcFNjYWxlRW5lcmdpZXMxID0gZml4TWluKHRtcFNjYWxlRW5lcmdpZXMxLCBNQVhfU0hJRlRfREJMKTsKCiAgRkRLX0FTU0VSVCgodG1wU2NhbGVFbmVyZ2llczAgPj0gMCkgJiYgKHRtcFNjYWxlRW5lcmdpZXMxID49IDApKTsKCiAgLyogS2VlcCBhZGRQcmV2U2FtcGxlcyBleHRyYSBwcmV2aW91cyB0cmFuc2llbnQgY2FuZGlkYXRlcy4gKi8KICBGREttZW1tb3ZlKHRyYW5zaWVudHMsIHRyYW5zaWVudHMgKyBub0NvbHMgLSBhZGRQcmV2U2FtcGxlcywgKHRyYW5fb2ZmK2FkZFByZXZTYW1wbGVzKSAqIHNpemVvZiAoRklYUF9EQkwpKTsKICBGREttZW1jbGVhcih0cmFuc2llbnRzICsgdHJhbl9vZmYgKyBhZGRQcmV2U2FtcGxlcywgbm9Db2xzICogc2l6ZW9mIChGSVhQX0RCTCkpOwoKICBlbmRDb25kID0gbm9Db2xzOyAvKiBBbW91bnQgb2YgbmV3IHRyYW5zaWVudCB2YWx1ZXMgdG8gYmUgY2FsY3VsYXRlZC4gKi8KICBzdGFydEVuZXJnID0gKHRyYW5fb2ZmLTMpPj5ZQnVmZmVyU3pTaGlmdDsgLyogPj5ZQnVmZmVyU3pTaGlmdCBiZWNhdXNlIG9mIGFtb3VudCBvZiBlbmVyZ3kgdmFsdWVzLiAtMyBiZWNhdXNlIG9mIG5laWdoYm9ycyBiZWluZyB3YXRjaGVkLiAqLwogIGVuZEVuZXJnID0gKChub0NvbHMrIChZQnVmZmVyV3JpdGVPZmZzZXQ8PFlCdWZmZXJTelNoaWZ0KSktMSk+PllCdWZmZXJTelNoaWZ0OyAvKiBZQnVmZmVyU3pTaGlmdCBzaGlmdHMgYmVjYXVzZSBvZiBoYWxmIGVuZXJneSB2YWx1ZXMuICovCgogIC8qIENvbXB1dGUgZGlmZmVyZW50aWFsIHZhbHVlcyB3aXRoIHR3byBkaWZmZXJlbnQgd2VpZ2h0aW5ncyBpbiBldmVyeSBzdWJiYW5kICovCiAgZm9yIChpPXN0YXJ0X2JhbmQ7IGk8c3RvcF9iYW5kOyBpKyspCiAgewogICAgRklYUF9EQkwgdGhyZXMgPSB0aHJlc2hvbGRzW2ldOwoKICAgIGlmKChMT05HKXRocmVzaG9sZHNbaV0+PTI1NikKICAgICAgaV90aHJlcyA9IChMT05HKSggKExPTkcpTUFYVkFMX0RCTCAvICgoKChMT05HKXRocmVzaG9sZHNbaV0pKSsxKSApPDwoMzItMjQpOwogICAgZWxzZQogICAgICBpX3RocmVzID0gKExPTkcpTUFYVkFMX0RCTDsKCiAgICAvKiBDb3B5IG9uZSB0aW1lc2xvdCBhbmQgZGUtc2NhbGUgYW5kIGRlLXNxdWlzaCAqLwogICAgaWYgKFlCdWZmZXJTelNoaWZ0ID09IDEpIHsKICAgICAgZm9yKGo9c3RhcnRFbmVyZzsgajxZQnVmZmVyV3JpdGVPZmZzZXQ7IGorKykgewogICAgICAgIEZJWFBfREJMIHRtcCA9IEVuZXJnaWVzW2pdW2ldOwogICAgICAgIEVuZXJnaWVzVGVtcFsoajw8MSkrMV0gPSBFbmVyZ2llc1RlbXBbajw8MV0gPSB0bXA+PnRtcFNjYWxlRW5lcmdpZXMwOwogICAgICB9CiAgICAgIGZvcig7IGo8PWVuZEVuZXJnOyBqKyspIHsKICAgICAgICBGSVhQX0RCTCB0bXAgPSBFbmVyZ2llc1tqXVtpXTsKICAgICAgICBFbmVyZ2llc1RlbXBbKGo8PDEpKzFdID0gRW5lcmdpZXNUZW1wW2o8PDFdID0gdG1wPj50bXBTY2FsZUVuZXJnaWVzMTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yKGo9c3RhcnRFbmVyZzsgajxZQnVmZmVyV3JpdGVPZmZzZXQ7IGorKykgewogICAgICAgIEZJWFBfREJMIHRtcCA9IEVuZXJnaWVzW2pdW2ldOwogICAgICAgIEVuZXJnaWVzVGVtcFtqXSA9IHRtcD4+dG1wU2NhbGVFbmVyZ2llczA7CiAgICAgIH0KICAgICAgZm9yKDsgajw9ZW5kRW5lcmc7IGorKykgewogICAgICAgIEZJWFBfREJMIHRtcCA9IEVuZXJnaWVzW2pdW2ldOwogICAgICAgIEVuZXJnaWVzVGVtcFtqXSA9IHRtcD4+dG1wU2NhbGVFbmVyZ2llczE7CiAgICAgIH0KICAgIH0KCiAgICAvKiBEZXRlY3QgcGVha3MgaW4gZW5lcmd5IHZhbHVlcy4gKi8KCiAgICBqSW5kZXggPSB0cmFuX29mZjsKICAgIGpwQk0gPSBqSW5kZXgrYWRkUHJldlNhbXBsZXM7CgogICAgZm9yIChqPWVuZENvbmQ7IGotLTsgakluZGV4KyssIGpwQk0rKykKICAgIHsKCiAgICAgIEZJWFBfREJMIGRlbHRhLCB0cmFuOwogICAgICBpbnQgZDsKCiAgICAgIGRlbHRhID0gKEZJWFBfREJMKTA7CiAgICAgIHRyYW4gID0gKEZJWFBfREJMKTA7CgogICAgICBmb3IgKGQ9MTsgZDw0OyBkKyspIHsKICAgICAgICBkZWx0YSArPSBwRW5lcmdpZXNUZW1wW2pJbmRleCtkXTsgLyogUiAqLwogICAgICAgIGRlbHRhIC09IHBFbmVyZ2llc1RlbXBbakluZGV4LWRdOyAvKiBMICovCiAgICAgICAgZGVsdGEgLT0gdGhyZXM7CgogICAgICAgIGlmICggZGVsdGEgPiAoRklYUF9EQkwpMCApIHsKICAgICAgICAgIHRyYW4gKz0gZk11bHQoaV90aHJlcywgZGVsdGEpOwogICAgICAgIH0KICAgICAgfQogICAgICB0cmFuc2llbnRzW2pwQk1dICs9IHRyYW47CiAgICB9CiAgfQogIENfQUxMT0NfU0NSQVRDSF9FTkQoRW5lcmdpZXNUZW1wLCBGSVhQX0RCTCwgMipRTUZfTUFYX1RJTUVfU0xPVFMpOwp9Cgp2b2lkCkZES3NickVuY190cmFuc2llbnREZXRlY3QoSEFORExFX1NCUl9UUkFOU0lFTlRfREVURUNUT1IgaF9zYnJUcmFuLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqRW5lcmdpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzY2FsZUVuZXJnaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp0cmFuc2llbnRfaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgWUJ1ZmZlcldyaXRlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyU3pTaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZVN0ZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lTWlkZGxlQm9yZGVyKQp7CiAgaW50IG5vX2NvbHMgPSBoX3NiclRyYW4tPm5vX2NvbHM7CiAgaW50IHFtZlN0YXJ0U2FtcGxlOwogIGludCBhZGRQcmV2U2FtcGxlczsKICBpbnQgdGltZVN0ZXBTaGlmdD0wOwogIGludCBpLCBjb25kOwoKICAvKiBXaGVyZSB0byBzdGFydCBsb29raW5nIGZvciB0cmFuc2llbnRzIGluIHRoZSB0cmFuc2llbnQgY2FuZGlkYXRlIGJ1ZmZlciAqLwogIHFtZlN0YXJ0U2FtcGxlID0gdGltZVN0ZXAgKiBmcmFtZU1pZGRsZUJvcmRlcjsKICAvKiBXZSBuZWVkIHRvIGxvb2sgb25lIHZhbHVlIGJhY2t3YXJkcyBpbiB0aGUgdHJhbnNpZW50cywgc28gd2UgbWlnaHQgbmVlZCBvbmUgbW9yZSBwcmV2aW91cyB2YWx1ZS4gKi8KICBhZGRQcmV2U2FtcGxlcyA9IChxbWZTdGFydFNhbXBsZSA+IDApID8gMDogMTsKCiAgc3dpdGNoICh0aW1lU3RlcCkgewogICAgY2FzZSAxOiB0aW1lU3RlcFNoaWZ0ID0gMDsgYnJlYWs7CiAgICBjYXNlIDI6IHRpbWVTdGVwU2hpZnQgPSAxOyBicmVhazsKICAgIGNhc2UgNDogdGltZVN0ZXBTaGlmdCA9IDI7IGJyZWFrOwogIH0KCiAgY2FsY3VsYXRlVGhyZXNob2xkcyhFbmVyZ2llcywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRW5lcmdpZXMsCiAgICAgICAgICAgICAgICAgICAgICBoX3NiclRyYW4tPnRocmVzaG9sZHMsCiAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+bm9fY29scywKICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+bm9fcm93cywKICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+dHJhbl9vZmYpOwoKICBleHRyYWN0VHJhbnNpZW50Q2FuZGlkYXRlcyhFbmVyZ2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUVuZXJnaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+dGhyZXNob2xkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3NiclRyYW4tPnRyYW5zaWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJTelNoaWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+bm9fY29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+bm9fcm93cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3NiclRyYW4tPnRyYW5fb2ZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFByZXZTYW1wbGVzICk7CgogIHRyYW5zaWVudF9pbmZvWzBdID0gMDsKICB0cmFuc2llbnRfaW5mb1sxXSA9IDA7CiAgdHJhbnNpZW50X2luZm9bMl0gPSAwOwoKICAvKiBPZmZzZXQgYnkgdGhlIGFtb3VudCBvZiBhZGRpdGlvbmFsIHByZXZpb3VzIHRyYW5zaWVudCBjYW5kaWRhdGVzIGJlaW5nIGtlcHQuICovCiAgcW1mU3RhcnRTYW1wbGUgKz0gYWRkUHJldlNhbXBsZXM7CgogIC8qIENoZWNrIGZvciB0cmFuc2llbnRzIGluIHNlY29uZCBncmFudWxlIChwaWNrIHRoZSBsYXN0IHZhbHVlIG9mIHN1YnNlcXVlbnQgdmFsdWVzKSAgKi8KICBmb3IgKGk9cW1mU3RhcnRTYW1wbGU7IGk8cW1mU3RhcnRTYW1wbGUgKyBub19jb2xzOyBpKyspIHsKICAgIGNvbmQgPSAgICAoaF9zYnJUcmFuLT50cmFuc2llbnRzW2ldIDwgZk11bHQoRkwyRlhDT05TVF9EQkwoMC45ZiksIGhfc2JyVHJhbi0+dHJhbnNpZW50c1tpIC0gMV0pICkKICAgICAgICAgICAmJiAoaF9zYnJUcmFuLT50cmFuc2llbnRzW2kgLSAxXSA+IGhfc2JyVHJhbi0+dHJhbl90aHIpOwoKICAgIGlmIChjb25kKSB7CiAgICAgIHRyYW5zaWVudF9pbmZvWzBdID0gKGkgLSBxbWZTdGFydFNhbXBsZSk+PnRpbWVTdGVwU2hpZnQ7CiAgICAgIHRyYW5zaWVudF9pbmZvWzFdID0gMTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBpZiAoIGhfc2JyVHJhbi0+ZnJhbWVTaGlmdCAhPSAwKSB7CiAgICAgIC8qIHRyYW5zaWVudCBwcmVkaWN0aW9uIGZvciBMRFNCUiAqLwogICAgICAvKiBDaGVjayBmb3IgdHJhbnNpZW50cyBpbiBmaXJzdCA8ZnJhbWVTaGlmdD4gcW1mLXNsb3RzIG9mIHNlY29uZCBmcmFtZSAqLwogICAgICBmb3IgKGk9cW1mU3RhcnRTYW1wbGUrbm9fY29sczsgaTxxbWZTdGFydFNhbXBsZSArIG5vX2NvbHMraF9zYnJUcmFuLT5mcmFtZVNoaWZ0OyBpKyspIHsKCiAgICAgICAgY29uZCA9ICAgIChoX3NiclRyYW4tPnRyYW5zaWVudHNbaV0gPCBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjlmKSwgaF9zYnJUcmFuLT50cmFuc2llbnRzW2kgLSAxXSkgKQogICAgICAgICAgICAgICAmJiAoaF9zYnJUcmFuLT50cmFuc2llbnRzW2kgLSAxXSA+IGhfc2JyVHJhbi0+dHJhbl90aHIpOwoKICAgICAgICBpZiAoY29uZCkgewogICAgICAgICAgaW50IHBvcyA9IChpbnQpICggKGkgLSBxbWZTdGFydFNhbXBsZS1ub19jb2xzKSA+PiB0aW1lU3RlcFNoaWZ0ICk7CiAgICAgICAgICBpZiAoKHBvcyA8IDMpICYmICh0cmFuc2llbnRfaW5mb1sxXT09MCkpIHsKICAgICAgICAgICAgdHJhbnNpZW50X2luZm9bMl0gPSAxOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgfQp9CgppbnQKRkRLc2JyRW5jX0luaXRTYnJUcmFuc2llbnREZXRlY3RvcihIQU5ETEVfU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUiBoX3NiclRyYW5zaWVudERldGVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgIHNiclN5bnRheEZsYWdzLCAvKiBTQlIgc3ludGF4IGZsYWdzIGRlcml2ZWQgZnJvbSBBT1QuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgZnJhbWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIHNhbXBsZUZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlndXJhdGlvblB0ciBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgdHJhbl9mYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBub19jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIG5vX3Jvd3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIFlCdWZmZXJTelNoaWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIGZyYW1lU2hpZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgdHJhbl9vZmYpCnsKICAgIElOVCB0b3RhbEJpdHJhdGUgPSBwYXJhbXMtPmNvZGVjU2V0dGluZ3Muc3RhbmRhcmRCaXRyYXRlICogcGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVsczsKICAgIElOVCBjb2RlY0JpdHJhdGUgPSBwYXJhbXMtPmNvZGVjU2V0dGluZ3MuYml0UmF0ZTsKICAgIEZJWFBfREJMIGJpdHJhdGVGYWN0b3JfbSwgZnJhbWVkdXJfZml4OwogICAgSU5UIGJpdHJhdGVGYWN0b3JfZSwgdG1wX2U7CgogICAgRkRLbWVtY2xlYXIoaF9zYnJUcmFuc2llbnREZXRlY3RvcixzaXplb2YoU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUikpOwoKICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPmZyYW1lU2hpZnQgPSBmcmFtZVNoaWZ0OwogICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+dHJhbl9vZmYgPSB0cmFuX29mZjsKCiAgICBpZihjb2RlY0JpdHJhdGUpIHsKICAgICAgYml0cmF0ZUZhY3Rvcl9tID0gZkRpdk5vcm0oKEZJWFBfREJMKXRvdGFsQml0cmF0ZSwgKEZJWFBfREJMKShjb2RlY0JpdHJhdGU8PDIpLCZiaXRyYXRlRmFjdG9yX2UpOwogICAgICBiaXRyYXRlRmFjdG9yX2UgKz0gMjsKICAgIH0KICAgIGVsc2UgewogICAgICBiaXRyYXRlRmFjdG9yX20gPSBGTDJGWENPTlNUX0RCTCgxLjAvNC4wKTsKICAgICAgYml0cmF0ZUZhY3Rvcl9lID0gMjsKICAgIH0KCiAgICBmcmFtZWR1cl9maXggPSBmRGl2Tm9ybShmcmFtZVNpemUsIHNhbXBsZUZyZXEpOwoKICAgIC8qIFRoZSBsb25nZXIgdGhlIGZyYW1lcywgdGhlIG1vcmUgb2Z0ZW4gc2hvdWxkIHRoZSBGSVhGSVgtCiAgICBjYXNlIHRyYW5zbWl0IDIgZW52ZWxvcGVzIGluc3RlYWQgb2YgMS4KICAgIEZyYW1lIGR1cmF0aW9ucyBiZWxvdyAxMCBtcyBwcm9kdWNlIHRoZSBoaWdoZXN0IHRocmVzaG9sZAogICAgc28gdGhhdCBwcmFjdGljYWxseSBhbHdheXMgb25seSAxIGVudiBpcyB0cmFuc21pdHRlZC4gKi8KICAgIEZJWFBfREJMIHRtcCA9IGZyYW1lZHVyX2ZpeCAtIEZMMkZYQ09OU1RfREJMKDAuMDEwKTsKCiAgICB0bXAgPSBmaXhNYXgodG1wLCBGTDJGWENPTlNUX0RCTCgwLjAwMDEpKTsKICAgIHRtcCA9IGZEaXZOb3JtKEZMMkZYQ09OU1RfREJMKDAuMDAwMDc1KSwgZlBvdzIodG1wKSwgJnRtcF9lKTsKCiAgICBiaXRyYXRlRmFjdG9yX2UgPSAodG1wX2UgKyBiaXRyYXRlRmFjdG9yX2UpOwoKICBpZihzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSB7CiAgICBiaXRyYXRlRmFjdG9yX2UtLTsgLyogZGl2aWRlIGJ5IDIgKi8KICB9CgogICAgRkRLX0FTU0VSVChub19jb2xzIDw9IFFNRl9NQVhfVElNRV9TTE9UUyk7CiAgICBGREtfQVNTRVJUKG5vX3Jvd3MgPD0gUU1GX0NIQU5ORUxTKTsKCiAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5ub19jb2xzID0gbm9fY29sczsKICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5fdGhyID0gKEZJWFBfREJMKSgocGFyYW1zLT50cmFuX3RociA8PCAoMzItMjQtMSkpIC8gbm9fcm93cyk7CiAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT50cmFuX2ZjID0gdHJhbl9mYzsKICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnNwbGl0X3Rocl9tID0gZk11bHQodG1wLCBiaXRyYXRlRmFjdG9yX20pOwogICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+c3BsaXRfdGhyX2UgPSBiaXRyYXRlRmFjdG9yX2U7CiAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5ub19yb3dzID0gbm9fcm93czsKICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPm1vZGUgPSBwYXJhbXMtPnRyYW5fZGV0X21vZGU7CiAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5wcmV2TG93QmFuZEVuZXJneSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwoKICAgIHJldHVybiAoMCk7Cn0KCgojZGVmaW5lIEVORVJHWV9TQ0FMSU5HX1NJWkUgMzIKCklOVCBGREtzYnJFbmNfSW5pdFNickZhc3RUcmFuc2llbnREZXRlY3RvcigKICAgICAgICBIQU5ETEVfRkFTVF9UUkFOX0RFVCBoX3NickZhc3RUcmFuc2llbnREZXRlY3RvciwKICAgICAgICBjb25zdCBJTlQgdGltZV9zbG90c19wZXJfZnJhbWUsCiAgICAgICAgY29uc3QgSU5UIGJhbmR3aWR0aF9xbWZfc2xvdCwKICAgICAgICBjb25zdCBJTlQgbm9fcW1mX2NoYW5uZWxzLAogICAgICAgIGNvbnN0IElOVCBzYnJfcW1mXzFzdF9iYW5kCiAgICAgICAgKQp7CgogIGludCBpLCBlOwogIGludCBidWZmX3NpemU7CiAgRklYUF9EQkwgbXlFeHA7CiAgRklYUF9EQkwgbXlFeHBTbG90OwoKICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+bG9va2FoZWFkID0gVFJBTl9ERVRfTE9PS0FIRUFEOwogIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5uVGltZVNsb3RzID0gdGltZV9zbG90c19wZXJfZnJhbWU7CgogIGJ1ZmZfc2l6ZSA9IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5uVGltZVNsb3RzICsgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmxvb2thaGVhZDsKCiAgZm9yKGk9MDsgaTwgYnVmZl9zaXplOyBpKyspIHsKICAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5kZWx0YV9lbmVyZ3lbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5lbmVyZ3lfdGltZVNsb3RzW2ldID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+bG93cGFzc19lbmVyZ3lbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT50cmFuc2llbnRDYW5kaWRhdGVzW2ldID0gMDsKICB9CgogIEZES19BU1NFUlQoYmFuZHdpZHRoX3FtZl9zbG90ID4gMC5mKTsKICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RvcEJhbmQgID0gZk1pbihUUkFOX0RFVF9TVE9QX0ZSRVEvYmFuZHdpZHRoX3FtZl9zbG90LCBub19xbWZfY2hhbm5lbHMpOwogIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdGFydEJhbmQgPSBmTWluKHNicl9xbWZfMXN0X2JhbmQsIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdG9wQmFuZCAtIFRSQU5fREVUX01JTl9RTUZCQU5EUyk7CgogIEZES19BU1NFUlQoaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0YXJ0QmFuZCA8IG5vX3FtZl9jaGFubmVscyk7CiAgRkRLX0FTU0VSVChoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RhcnRCYW5kIDwgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0b3BCYW5kKTsKICBGREtfQVNTRVJUKGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdGFydEJhbmQgPiAxKTsKICBGREtfQVNTRVJUKGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdG9wQmFuZCA+IDEpOwoKICAvKiB0aGUgZW5lcmd5IHdlaWdodGluZyBhbmQgYWRkaW5nIHVwIGhhcyBhIGhlYWRyb29tIG9mIDYgQml0cywKICAgICBzbyB1cCB0byA2NCBiYW5kcyBjYW4gYmUgYWRkZWQgd2l0aG91dCBwb3RlbnRpYWwgb3ZlcmZsb3cuICovCiAgRkRLX0FTU0VSVChoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RvcEJhbmQgLSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RhcnRCYW5kIDw9IDY0KTsKCiAgLyogUU1GX0hQX2RCX1NMT1BFX0ZJWCBzYXlzIHRoYXQgd2Ugd2FudCBhIDIwIGRCIHBlciAxNiBrSHogSFAgZmlsdGVyLgogICAgIFRoZSBmb2xsb3dpbmcgbGluZXMgbWFwIHRoaXMgdG8gdGhlIFFNRiBiYW5kd2lkdGguICovCiAgI2RlZmluZSBFWFBfRSA3IC8qIFFNRl9DSEFOTkVMUyAoPTY0KSBtdWx0aXBsaWNhdGlvbnMgbWF4LCBtYXguIGFsbG93ZWQgc3VtIGlzIDAuNSAqLwogIG15RXhwID0gZk11bHROb3JtKFFNRl9IUF9kQmRfU0xPUEVfRklYLCAoRklYUF9EQkwpYmFuZHdpZHRoX3FtZl9zbG90LCAmZSk7CiAgbXlFeHAgPSBzY2FsZVZhbHVlU2F0dXJhdGUobXlFeHAsIGUrMCtERlJBQ1RfQklUUy0xLUVYUF9FKTsKICBteUV4cFNsb3QgPSBteUV4cDsKCiAgZm9yKGk9MDsgaTxRTUZfQ0hBTk5FTFM7IGkrKyl7CiAgICAvKiBDYWxjdWxhdGUgZEJmIG92ZXIgYWxsIHFtZiBiYW5kczoKICAgICAgIGRCZiA9ICgxMF4oMC4wMDIyNjZmLzEwKmJ3KHNsb3QpKSleKGJhbmQpID0KICAgICAgICAgICA9IDJeKGxvZzIoMTApKjAuMDAyMjY2Zi8xMCpidyhzbG90KSpiYW5kKSA9CiAgICAgICAgICAgPSAyXigwLjAwMDc1Mjc1ZipidyhzbG90KSpiYW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICBGSVhQX0RCTCBkQmZfbTsgICAgICAgIC8qIGRCZiBtYW50aXNzYSAgICAgICAgKi8KICAgIElOVCBkQmZfZTsgICAgICAgICAgICAgLyogZEJmIGV4cG9uZW50ICAgICAgICAqLwogICAgSU5UIHRtcDsKCiAgICBJTlQgZEJmX2ludDsgICAgICAgICAgIC8qIGRCZiBpbnRlZ2VyIHBhcnQgICAgKi8KICAgIEZJWFBfREJMIGRCZl9mcmFjdDsgICAgLyogZEJmIGZyYWN0aW9uYWwgcGFydCAqLwoKICAgIC8qIG15RXhwKihpKzEpID0gbXlFeHBfaW50IC0gbXlFeHBfZnJhY3QKICAgICAgIG15RXhwKihpKzEpIGlzIHNwbGl0IHVwIGhlcmUgZm9yIGJldHRlciBhY2N1cmFjeSBvZiBDYWxjSW52TGREYXRhKCksCiAgICAgICBmb3IgaXRzIHJlc3VsdCBjYW4gYmUgc3BsaXQgdXAgaW50byBhbiBpbnRlZ2VyIGFuZCBhIGZyYWN0aW9uYWwgcGFydCAqLwoKICAgIC8qIFJvdW5kIHVwIHRvIG5leHQgaW50ZWdlciAqLwogICAgRklYUF9EQkwgbXlFeHBfaW50ICAgPSAobXlFeHBTbG90ICYgKEZJWFBfREJMKTB4ZmUwMDAwMDApICsgKEZJWFBfREJMKTB4MDIwMDAwMDA7CgogICAgLyogVGhpcyBpcyB0aGUgZnJhY3Rpb25hbCBwYXJ0IHRoYXQgbmVlZHMgdG8gYmUgc3Vic3RyYWN0ZWQgKi8KICAgIEZJWFBfREJMIG15RXhwX2ZyYWN0ID0gbXlFeHBfaW50IC0gbXlFeHBTbG90OwoKICAgIC8qIENhbGMgaW50ZWdlciBwYXJ0ICovCiAgICBkQmZfaW50ICAgPSBDYWxjSW52TGREYXRhKG15RXhwX2ludCk7CiAgICAvKiBUaGUgcmVzdWx0IG5lZWRzIHRvIGJlIHJlLXNjYWxlZC4gVGhlIGxkKG15RXhwX2ludCkgaGFkIGJlZW4gc2NhbGVkIGJ5IEVYUF9FLAogICAgICAgdGhlIENhbGNJbnZMZERhdGEgZXhwZWN0cyB0aGUgb3BlcmFuZCB0byBiZSBzY2FsZWQgYnkgTERfREFUQV9TSElGVC4KICAgICAgIFRoZXJlZm9yZSwgdGhlIGNvcnJlY3RseSBzY2FsZWQgcmVzdWx0IGlzIGRCZl9pbnReKDJeKEVYUF9FLUxEX0RBVEFfU0hJRlQpKSwKICAgICAgIHdoaWNoIGlzIGRCZl9pbnReMiAqLwogICAgZEJmX2ludCAgKj0gZEJmX2ludDsKCiAgICAvKiBDYWxjIGZyYWN0aW9uYWwgcGFydCAqLwogICAgZEJmX2ZyYWN0ID0gQ2FsY0ludkxkRGF0YSgtbXlFeHBfZnJhY3QpOwogICAgLyogVGhlIHJlc3VsdCBuZWVkcyB0byBiZSByZS1zY2FsZWQuIFRoZSBsZChteUV4cF9mcmFjdCkgaGFkIGJlZW4gc2NhbGVkIGJ5IEVYUF9FLAogICAgICAgdGhlIENhbGNJbnZMZERhdGEgZXhwZWN0cyB0aGUgb3BlcmFuZCB0byBiZSBzY2FsZWQgYnkgTERfREFUQV9TSElGVC4KICAgICAgIFRoZXJlZm9yZSwgdGhlIGNvcnJlY3RseSBzY2FsZWQgcmVzdWx0IGlzIGRCZl9mcmFjdF4oMl4oRVhQX0UtTERfREFUQV9TSElGVCkpLAogICAgICAgd2hpY2ggaXMgZEJmX2ZyYWN0XjIgKi8KICAgIGRCZl9mcmFjdCA9IGZNdWx0Tm9ybShkQmZfZnJhY3QsIGRCZl9mcmFjdCwgJnRtcCk7CgogICAgLyogR2V0IHdvcnN0IGNhc2Ugc2NhbGluZyBvZiBtdWx0aXBsaWNhdGlvbiByZXN1bHQgKi8KICAgIGRCZl9lID0gKERGUkFDVF9CSVRTLTEgLSB0bXApIC0gQ291bnRMZWFkaW5nQml0cyhkQmZfaW50KTsKCiAgICAvKiBOb3cgbXVsdGlwbHkgaW50ZWdlciB3aXRoIGZyYWN0aW9uYWwgcGFydCBvZiB0aGUgcmVzdWx0LCB0aHVzIHJlc3VsdGluZwogICAgICAgaW4gdGhlIG92ZXJhbGwgYWNjdXJhdGUgZnJhY3Rpb25hbCByZXN1bHQgKi8KICAgIGRCZl9tID0gZk11bHROb3JtKGRCZl9pbnQsIGRCZl9mcmFjdCwgJmUpOwogICAgZEJmX20gPSBzY2FsZVZhbHVlU2F0dXJhdGUoZEJmX20sIGUrREZSQUNUX0JJVFMtMSt0bXAtZEJmX2UpOwogICAgbXlFeHBTbG90ICs9IG15RXhwOwoKICAgIC8qIEtlZXAgdGhlIHJlc3VsdHMgKi8KICAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5kQmZfbVtpXSA9IGRCZl9tOwogICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRCZl9lW2ldID0gZEJmX2U7CgogIH0KCiAgLyogTWFrZSBzdXJlIHRoYXQgZEJmIGlzIGdyZWF0ZXIgdGhhbiAxLjAgKGJlY2F1c2UgaXQgc2hvdWxkIGJlIGEgaGlnaHBhc3MpICovCiAgLyogLi4uICovCgogIHJldHVybiAwOwp9Cgp2b2lkIEZES3NickVuY19mYXN0VHJhbnNpZW50RGV0ZWN0KAogICAgICAgIGNvbnN0IEhBTkRMRV9GQVNUX1RSQU5fREVUICAgICAgICAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLAogICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgICAqY29uc3QgKkVuZXJnaWVzLAogICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgICAqY29uc3QgIHNjYWxlRW5lcmdpZXMsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAogICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAqY29uc3QgIHRyYW5fdmVjdG9yCiAgICAgICAgKQp7CiAgaW50IHRpbWVTbG90LCBiYW5kOwoKICBGSVhQX0RCTCBtYXhfZGVsdGFfZW5lcmd5OyAgIC8qIGhlbHBlciB0byBzdG9yZSBtYXhpbXVtIGVuZXJneSByYXRpbyAgICAgICAgICAqLwogIGludCBtYXhfZGVsdGFfZW5lcmd5X3NjYWxlOyAgLyogaGVscGVyIHRvIHN0b3JlIHNjYWxlIG9mIG1heGltdW0gZW5lcmd5IHJhdGlvICovCiAgaW50IGluZF9tYXggICAgICAgICAgICAgPSAwOyAvKiBoZWxwZXIgdG8gc3RvcmUgaW5kZXggb2YgbWF4aW11bSBlbmVyZ3kgcmF0aW8gKi8KICBpbnQgaXNUcmFuc2llbnRJbkZyYW1lICA9IDA7CgogIGNvbnN0IGludCBuVGltZVNsb3RzICAgICAgICAgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+blRpbWVTbG90czsKICBjb25zdCBpbnQgbG9va2FoZWFkICAgICAgICAgID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmxvb2thaGVhZDsKICBjb25zdCBpbnQgc3RhcnRCYW5kICAgICAgICAgID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0YXJ0QmFuZDsKICBjb25zdCBpbnQgc3RvcEJhbmQgICAgICAgICAgID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0b3BCYW5kOwoKICBpbnQgKiB0cmFuc2llbnRDYW5kaWRhdGVzICAgID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5zaWVudENhbmRpZGF0ZXM7CgogIEZJWFBfREJMICogZW5lcmd5X3RpbWVTbG90cyAgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZW5lcmd5X3RpbWVTbG90czsKICBpbnQgKiBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmVuZXJneV90aW1lU2xvdHNfc2NhbGU7CgogIEZJWFBfREJMICogZGVsdGFfZW5lcmd5ICAgICAgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZGVsdGFfZW5lcmd5OwogIGludCAqIGRlbHRhX2VuZXJneV9zY2FsZSAgICAgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZGVsdGFfZW5lcmd5X3NjYWxlOwoKICBjb25zdCBGSVhQX0RCTCB0aHIgICAgICAgICAgID0gVFJBTl9ERVRfVEhSU0hMRDsKICBjb25zdCBJTlQgICAgICB0aHJfc2NhbGUgICAgID0gVFJBTl9ERVRfVEhSU0hMRF9TQ0FMRTsKCiAgLypyZXNldCB0cmFuc2llbnQgaW5mbyovCiAgdHJhbl92ZWN0b3JbMl0gPSAwOwoKICAvKiByZXNldCB0cmFuc2llbnQgY2FuZGlkYXRlcyAqLwogIEZES21lbWNsZWFyKHRyYW5zaWVudENhbmRpZGF0ZXMrbG9va2FoZWFkLCBuVGltZVNsb3RzKnNpemVvZihpbnQpKTsKCiAgZm9yKHRpbWVTbG90ID0gbG9va2FoZWFkOyB0aW1lU2xvdCA8IG5UaW1lU2xvdHMgKyBsb29rYWhlYWQ7IHRpbWVTbG90KyspIHsKICAgIGludCBpLCBub3JtOwogICAgRklYUF9EQkwgdG1wRSAgICAgICAgICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgIGludCBoZWFkcm9vbUVuU2xvdCAgICAgID0gREZSQUNUX0JJVFMtMTsKCiAgICBGSVhQX0RCTCBzbWFsbE5SRyA9IEZMMkZYQ09OU1RfREJMKDFlLTJmKTsKICAgIEZJWFBfREJMIGRlbm9taW5hdG9yOwogICAgSU5UIGRlbm9taW5hdG9yX3NjYWxlOwoKICAgIC8qIGRldGVybWluZSBtaW5pbXVtIGhlYWRyb29tIG9mIGVuZXJneSB2YWx1ZXMgZm9yIHRoaXMgdGltZXNsb3QgKi8KICAgIGZvcihiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQrKykgewogICAgICBpbnQgdG1wX2hlYWRyb29tID0gZk5vcm16KEVuZXJnaWVzW3RpbWVTbG90XVtiYW5kXSktMTsKICAgICAgaWYodG1wX2hlYWRyb29tIDwgaGVhZHJvb21FblNsb3QpewogICAgICAgIGhlYWRyb29tRW5TbG90ID0gdG1wX2hlYWRyb29tOwogICAgICB9CiAgICB9CgogICAgZm9yKGkgPSAwLCBiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQrKywgaSsrKSB7CiAgICAgIC8qIGVuZXJneSBpcyB3ZWlnaHRlZCBieSB3ZWlnaHRpbmdmYWN0b3Igc3RvcmVkIGluIGRCZl9tIGFycmF5ICovCiAgICAgIC8qIGRCZl9tIGluZGV4IHJ1bnMgZnJvbSAwIHRvIHN0b3BCYW5kLXN0YXJ0YmFuZCAgICAgICAgICAgICAgICovCiAgICAgIC8qIGVuZXJneSBzaGlmdGVkIGJ5IGNhbGN1bGF0ZWQgaGVhZHJvb20gZm9yIG1heGltdW0gcHJlY2lzaW9uICovCiAgICAgIEZJWFBfREJMIHdlaWdodGVkRW5lcmd5ID0gZk11bHQoRW5lcmdpZXNbdGltZVNsb3RdW2JhbmRdPDxoZWFkcm9vbUVuU2xvdCwgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRCZl9tW2ldKTsKCiAgICAgIC8qIGVuZXJneSBpcyBhZGRlZCB1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgIC8qIHNoaWZ0IGJ5IDYgdG8gaGF2ZSBhIGhlYWRyb29tIGZvciBtYXhpbXVtIDY0IGFkZGl0aW9ucyAgICAgICAgICAgICovCiAgICAgIC8qIHNoaWZ0IGJ5IGRCZl9lIHRvIGhhbmRsZSB3ZWlnaHRpbmcgZmFjdG9yIGRlcGVuZGVudCBzY2FsZSBmYWN0b3JzICovCiAgICAgIHRtcEUgKz0gd2VpZ2h0ZWRFbmVyZ3kgPj4gKDYgKyAoMTAgLSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZEJmX2VbaV0pKTsKICAgIH0KCiAgICAvKiBzdG9yZSBjYWxjdWxhdGVkIGVuZXJneSBmb3IgdGltZXNsb3QgKi8KICAgIGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3RdID0gdG1wRTsKCiAgICAvKiBjYWxjdWxhdGUgb3ZlcmFsbCBzY2FsZSBmYWN0b3IgZm9yIGVuZXJneSBvZiB0aGlzIHRpbWVzbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAvKiA9ICAgb3JpZ2luYWwgc2NhbGUgZmFjdG9yIG9mIGVuZXJnaWVzICgtc2NhbGVFbmVyZ2llc1swXSsyKlFNRl9TQ0FMRV9PRkZTRVQgb3IgLXNjYWxlRW5lcmdpZXNbMV0rMipRTUZfU0NBTEVfT0ZGU0VUICAgICovCiAgICAvKiAgICAgZGVwZW5kaW5nIG9uIFlCdWZmZXJXcml0ZU9mZnNldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAvKiAgICsgd2VpZ2h0aW5nIGZhY3RvciBzY2FsZSAgICAgICAgICAgICgxMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAvKiAgICsgYWRkaW5nIHVwIHNjYWxlIGZhY3RvciAgICAgICAgICAgICggNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAvKiAgIC0gaGVhZHJvb20gb2YgZW5lcmd5IHZhbHVlICAgICAgICAgIChoZWFkcm9vbUVuU2xvdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBpZih0aW1lU2xvdCA8IFlCdWZmZXJXcml0ZU9mZnNldCl7CiAgICAgIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3RdID0gKC1zY2FsZUVuZXJnaWVzWzBdKzIqUU1GX1NDQUxFX09GRlNFVCkgKyAoMTArNikgLSBoZWFkcm9vbUVuU2xvdDsKICAgIH0gZWxzZSB7CiAgICAgIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3RdID0gKC1zY2FsZUVuZXJnaWVzWzFdKzIqUU1GX1NDQUxFX09GRlNFVCkgKyAoMTArNikgLSBoZWFkcm9vbUVuU2xvdDsKICAgIH0KCiAgICAvKiBBZGQgYSBzbWFsbCBlbmVyZ3kgdG8gdGhlIGRlbm9taW5hdG9yLCB0aHVzIG1ha2luZyB0aGUgdHJhbnNpZW50CiAgICAgICBkZXRlY3Rpb24gZW5lcmd5LWRlcGVuZGVudC4gTG91ZCB0cmFuc2llbnRzIGFyZSBiZWluZyBkZXRlY3RlZCwKICAgICAgIHNpbGVudCBvbmVzIG5vdC4gKi8KCiAgICAvKiBtYWtlIHN1cmUgdGhhdCBzbWFsbE5SRyBkb2VzIG5vdCBvdmVyZmxvdyAqLwogICAgaWYgKCAtZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdC0xXSArIDEgPiA1ICkKICAgIHsKICAgICAgZGVub21pbmF0b3IgPSBzbWFsbE5SRzsKICAgICAgZGVub21pbmF0b3Jfc2NhbGUgPSAwOwogICAgfSBlbHNlIHsKICAgICAgLyogTGVhdmUgYW4gYWRkaXRpb25hbCBoZWFkcm9vbSBvZiAxIGJpdCBmb3IgdGhpcyBhZGRpdGlvbi4gKi8KICAgICAgc21hbGxOUkcgPSBzY2FsZVZhbHVlKHNtYWxsTlJHLCAtKGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3QtMV0gKyAxKSk7CiAgICAgIGRlbm9taW5hdG9yID0gKGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3QtMV0+PjEpICsgc21hbGxOUkc7CiAgICAgIGRlbm9taW5hdG9yX3NjYWxlID0gZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdC0xXSsxOwogICAgfQoKICAgIGRlbHRhX2VuZXJneVt0aW1lU2xvdF0gPSBmRGl2Tm9ybShlbmVyZ3lfdGltZVNsb3RzW3RpbWVTbG90XSwgZGVub21pbmF0b3IsICZub3JtKTsKICAgIGRlbHRhX2VuZXJneV9zY2FsZVt0aW1lU2xvdF0gPSBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90XSAtIGRlbm9taW5hdG9yX3NjYWxlICsgbm9ybTsKICB9CgogIC8qZ2V0IHRyYW5zaWVudCBjYW5kaWRhdGVzKi8KICAvKiBGb3IgZXZlcnkgdGltZXNsb3QsIGNoZWNrIGlmIGRlbHRhKEUpIGV4Y2VlZHMgdGhlIHRocmVzaG9sZC4gSWYgaXQgZGlkLAogICAgIGl0IGNvdWxkIHBvdGVudGlhbGx5IGJlIG1hcmtlZCBhcyBhIHRyYW5zaWVudCBjYW5kaWRhdGUuIEhvd2V2ZXIsIHRoZSAyCiAgICAgc2xvdHMgYmVmb3JlIHRoZSBjdXJyZW50IG9uZSBtdXN0IG5vdCBiZSB0cmFuc2llbnRzIHdpdGggYW4gZW5lcmd5IGhpZ2hlcgogICAgIHRoYW4gMS40KkUoY3VycmVudCkuIElmIGJvdGggYXJlbid0IHRyYW5zaWVudHMgb3IgaWYgdGhlIGVuZXJneSBvZiB0aGUKICAgICBjdXJyZW50IHRpbWVzb2xvdCBpcyBtb3JlIHRoYW4gMS40IHRpbWVzIGhpZ2hlciB0aGFuIHRoZSBlbmVyZ3kgaW4gdGhlCiAgICAgbGFzdCBvciB0aGUgb25lIGJlZm9yZSB0aGUgbGFzdCBzbG90LCBpdCBpcyBtYXJrZWQgYXMgYSB0cmFuc2llbnQuKi8KCiAgRkRLX0FTU0VSVChsb29rYWhlYWQgPj0gMik7CiAgZm9yKHRpbWVTbG90ID0gbG9va2FoZWFkOyB0aW1lU2xvdCA8IG5UaW1lU2xvdHMgKyBsb29rYWhlYWQ7IHRpbWVTbG90KyspIHsKICAgIEZJWFBfREJMIGVuZXJneV9jdXJfc2xvdF93ZWlnaHRlZCA9IGZNdWx0KGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3RdLEZMMkZYQ09OU1RfREJMKDEuMGYvMS40ZikpOwogICAgaWYoICFmSXNMZXNzVGhhbihkZWx0YV9lbmVyZ3lbdGltZVNsb3RdLCBkZWx0YV9lbmVyZ3lfc2NhbGVbdGltZVNsb3RdLCB0aHIsIHRocl9zY2FsZSkgJiYKICAgICAgICAoICgodHJhbnNpZW50Q2FuZGlkYXRlc1t0aW1lU2xvdC0yXT09MCkgJiYgKHRyYW5zaWVudENhbmRpZGF0ZXNbdGltZVNsb3QtMV09PTApKSB8fAogICAgICAgICAgIWZJc0xlc3NUaGFuKGVuZXJneV9jdXJfc2xvdF93ZWlnaHRlZCwgZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdF0sIGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3QtMV0sIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3QtMV0gKSB8fAogICAgICAgICAgIWZJc0xlc3NUaGFuKGVuZXJneV9jdXJfc2xvdF93ZWlnaHRlZCwgZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdF0sIGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3QtMl0sIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3QtMl0gKQogICAgICAgICkKICAgICAgKQp7CiAgICAgIC8qIGluIGNhc2Ugb2Ygc3Ryb25nIHRyYW5zaWVudHMsIHN1YnNlcXVlbnQKICAgICAgICogcW1mIHNsb3RzIG1pZ2h0IGJlIHJlY29nbml6ZWQgYXMgdHJhbnNpZW50cy4gKi8KICAgICAgdHJhbnNpZW50Q2FuZGlkYXRlc1t0aW1lU2xvdF0gPSAxOwogICAgfQogIH0KCiAgLypnZXQgdHJhbnNpZW50IHdpdGggbWF4IGVuZXJneSovCiAgbWF4X2RlbHRhX2VuZXJneSAgID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgbWF4X2RlbHRhX2VuZXJneV9zY2FsZSA9IDA7CiAgaW5kX21heCA9IDA7CiAgaXNUcmFuc2llbnRJbkZyYW1lID0gMDsKICBmb3IodGltZVNsb3QgPSAwOyB0aW1lU2xvdCA8IG5UaW1lU2xvdHM7IHRpbWVTbG90KyspIHsKICAgIGludCBzY2FsZSA9IGZNYXgoZGVsdGFfZW5lcmd5X3NjYWxlW3RpbWVTbG90XSwgbWF4X2RlbHRhX2VuZXJneV9zY2FsZSk7CiAgICBpZih0cmFuc2llbnRDYW5kaWRhdGVzW3RpbWVTbG90XSAmJiAoIChkZWx0YV9lbmVyZ3lbdGltZVNsb3RdID4+IChzY2FsZSAtIGRlbHRhX2VuZXJneV9zY2FsZVt0aW1lU2xvdF0pKSA+IChtYXhfZGVsdGFfZW5lcmd5ID4+IChzY2FsZSAtIG1heF9kZWx0YV9lbmVyZ3lfc2NhbGUpKSApICkgewogICAgICBtYXhfZGVsdGFfZW5lcmd5ICAgPSBkZWx0YV9lbmVyZ3lbdGltZVNsb3RdOwogICAgICBtYXhfZGVsdGFfZW5lcmd5X3NjYWxlID0gc2NhbGU7CiAgICAgIGluZF9tYXggICAgICAgICAgICA9IHRpbWVTbG90OwogICAgICBpc1RyYW5zaWVudEluRnJhbWUgPSAxOwogICAgfQogIH0KCiAgLypmcm9tIGFsbCB0cmFuc2llbnQgY2FuZGlkYXRlcyB0YWtlIHRoZSBvbmUgd2l0aCB0aGUgYmlnZ2VzdCBlbmVyZ3kqLwogIGlmKGlzVHJhbnNpZW50SW5GcmFtZSkgewogICAgdHJhbl92ZWN0b3JbMF0gPSBpbmRfbWF4OwogICAgdHJhbl92ZWN0b3JbMV0gPSAxOwogIH0gZWxzZSB7CiAgICAvKnJlc2V0IHRyYW5zaWVudCBpbmZvKi8KICAgIHRyYW5fdmVjdG9yWzBdID0gdHJhbl92ZWN0b3JbMV0gPSAwOwogIH0KCiAgLypjaGVjayBmb3IgdHJhbnNpZW50cyBpbiBsb29rYWhlYWQqLwogIGZvcih0aW1lU2xvdCA9IG5UaW1lU2xvdHM7IHRpbWVTbG90IDwgblRpbWVTbG90cyArIGxvb2thaGVhZDsgdGltZVNsb3QrKykgewogICAgaWYodHJhbnNpZW50Q2FuZGlkYXRlc1t0aW1lU2xvdF0pIHsKICAgICAgdHJhbl92ZWN0b3JbMl0gPSAxOwogICAgfQogIH0KCiAgLyp1cGRhdGUgYnVmZmVycyovCiAgZm9yKHRpbWVTbG90ID0gMDsgdGltZVNsb3QgPCBsb29rYWhlYWQ7IHRpbWVTbG90KyspIHsKICAgIHRyYW5zaWVudENhbmRpZGF0ZXNbdGltZVNsb3RdID0gdHJhbnNpZW50Q2FuZGlkYXRlc1tuVGltZVNsb3RzICsgdGltZVNsb3RdOwoKICAgIC8qIGZpeHBvaW50IHN0dWZmICovCiAgICBlbmVyZ3lfdGltZVNsb3RzW3RpbWVTbG90XSAgICA9IGVuZXJneV90aW1lU2xvdHNbblRpbWVTbG90cyArIHRpbWVTbG90XTsKICAgIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3RdICA9IGVuZXJneV90aW1lU2xvdHNfc2NhbGVbblRpbWVTbG90cyArIHRpbWVTbG90XTsKCiAgICBkZWx0YV9lbmVyZ3lbdGltZVNsb3RdICAgICA9IGRlbHRhX2VuZXJneVtuVGltZVNsb3RzICsgdGltZVNsb3RdOwogICAgZGVsdGFfZW5lcmd5X3NjYWxlW3RpbWVTbG90XSAgID0gZGVsdGFfZW5lcmd5X3NjYWxlW25UaW1lU2xvdHMgKyB0aW1lU2xvdF07CiAgfQp9Cgo=