Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEyIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKICAgY29udGVudHMvZGVzY3JpcHRpb246IFBzeWNob2FjY291c3RpYyBtYWpvciBmdW5jdGlvbiBibG9jawoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgInBzeV9jb25zdC5oIgoKI2luY2x1ZGUgImJsb2NrX3N3aXRjaC5oIgojaW5jbHVkZSAidHJhbnNmb3JtLmgiCiNpbmNsdWRlICJzcHJlYWRpbmcuaCIKI2luY2x1ZGUgInByZV9lY2hvX2NvbnRyb2wuaCIKI2luY2x1ZGUgImJhbmRfbnJnLmgiCiNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgojaW5jbHVkZSAicHN5X2RhdGEuaCIKI2luY2x1ZGUgIm1zX3N0ZXJlby5oIgojaW5jbHVkZSAiaW50ZXJmYWNlLmgiCiNpbmNsdWRlICJwc3lfbWFpbi5oIgojaW5jbHVkZSAiZ3JwX2RhdGEuaCIKI2luY2x1ZGUgInRuc19mdW5jLmgiCiNpbmNsdWRlICJwbnNfZnVuYy5oIgojaW5jbHVkZSAidG9uYWxpdHkuaCIKI2luY2x1ZGUgImFhY0VuY19yYW0uaCIKI2luY2x1ZGUgImludGVuc2l0eS5oIgoKCgovKiBibGVuZGluZyB0byByZWR1Y2UgZ2liYnMgYXJ0aWZhY3RzICovCiNkZWZpbmUgRkFERV9PVVRfTEVOIDYKc3RhdGljIGNvbnN0IEZJWFBfREJMIGZhZGVPdXRGYWN0b3JbRkFERV9PVVRfTEVOXSA9IHsxODQwNjQ0MDk2LCAxNTMzODcwMDgwLCAxMjI3MDk2MDY0LCA5MjAzMjIwNDgsIDYxMzU0ODAzMiwgMzA2Nzc0MDE2fTsKCi8qIGZvcndhcmQgZGVmaW5pdGlvbnMgKi8KCgpzdGF0aWMgaW5saW5lIGludCBpc0xvd0RlbGF5KCBBVURJT19PQkpFQ1RfVFlQRSBhb3QgKQp7CiAgcmV0dXJuIChhb3Q9PUFPVF9FUl9BQUNfTEQgfHwgYW90PT1BT1RfRVJfQUFDX0VMRCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX1BzeU5ldwogICAgZGVzY3JpcHRpb246ICBhbGxvY2F0ZXMgbWVtb3J5IGZvciBwc3ljaG9hY291c3RpYwogICAgcmV0dXJuczogICAgICBhbiBlcnJvciBjb2RlCiAgICBpbnB1dDogICAgICAgIHBvaW50ZXIgdG8gYSBwc3ljaCBoYW5kbGUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUHN5TmV3KFBTWV9JTlRFUk5BTCAgKipwaHBzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbkVsZW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuQ2hhbm5lbHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiAgICAgICAgICAqZHluYW1pY19SQU0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogICAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CiAgICBQU1lfSU5URVJOQUwgKmhQc3k7CiAgICBJTlQgaTsKCiAgICBoUHN5ID0gR2V0UmFtX2FhY0VuY19Qc3lJbnRlcm5hbCgpOwogICAgKnBocHN5ID0gaFBzeTsKICAgIGlmIChoUHN5ID09IE5VTEwpIHsKICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKICAgICAgZ290byBiYWlsOwogICAgfQoKICAgIGZvciAoaT0wOyBpPG5FbGVtZW50czsgaSsrKSB7CiAgICAgICAgLyogUFNZX0VMRU1FTlQgKi8KICAgICAgICBoUHN5LT5wc3lFbGVtZW50W2ldID0gR2V0UmFtX2FhY0VuY19Qc3lFbGVtZW50KGkpOwogICAgICAgIGlmIChoUHN5LT5wc3lFbGVtZW50W2ldID09IE5VTEwpIHsKICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CiAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaT0wOyBpPG5DaGFubmVsczsgaSsrKSB7CiAgICAgICAgLyogUFNZX1NUQVRJQyAqLwogICAgICAgIGhQc3ktPnBTdGF0aWNDaGFubmVsc1tpXSA9IEdldFJhbV9hYWNFbmNfUHN5U3RhdGljKGkpOwogICAgICAgIGlmIChoUHN5LT5wU3RhdGljQ2hhbm5lbHNbaV09PU5VTEwpIHsKICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CiAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgfQogICAgICAgIC8qIEFVRElPIElOUFVUIEJVRkZFUiAqLwogICAgICAgIGhQc3ktPnBTdGF0aWNDaGFubmVsc1tpXS0+cHN5SW5wdXRCdWZmZXIgPSBHZXRSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyKGkpOwogICAgICAgIGlmIChoUHN5LT5wU3RhdGljQ2hhbm5lbHNbaV0tPnBzeUlucHV0QnVmZmVyPT1OVUxMKSB7CiAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOwogICAgICAgICAgZ290byBiYWlsOwogICAgICAgIH0KICAgIH0KCiAgICAvKiByZXVzYWJsZSBwc3ljaCBtZW1vcnkgKi8KICAgIGhQc3ktPnBzeUR5bmFtaWMgPSBHZXRSYW1fYWFjRW5jX1BzeUR5bmFtaWMoMCwgZHluYW1pY19SQU0pOwoKICAgIHJldHVybiBBQUNfRU5DX09LOwoKYmFpbDoKICAgRkRLYWFjRW5jX1BzeUNsb3NlKHBocHN5LCBOVUxMKTsKCiAgIHJldHVybiBFcnJvclN0YXR1czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfUHN5T3V0TmV3CiAgICBkZXNjcmlwdGlvbjogIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHBzeU91dCBzdHJ1YwogICAgcmV0dXJuczogICAgICBhbiBlcnJvciBjb2RlCiAgICBpbnB1dDogICAgICAgIHBvaW50ZXIgdG8gYSBwc3ljaCBoYW5kbGUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUHN5T3V0TmV3KFBTWV9PVVQgICAqKnBocHN5T3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5FbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgblN1YkZyYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVDSEFSICAgICAgKmR5bmFtaWNfUkFNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKICBpbnQgbiwgaTsKICBpbnQgZWxJbmMgPSAwLCBjaEluYyA9IDA7CgogIGZvciAobj0wOyBuPG5TdWJGcmFtZXM7IG4rKykgewogICAgcGhwc3lPdXRbbl0gPSBHZXRSYW1fYWFjRW5jX1BzeU91dChuKTsKCiAgICBpZiAocGhwc3lPdXRbbl0gPT0gTlVMTCkgewogICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOwogICAgICBnb3RvIGJhaWw7CiAgICB9CgogICAgZm9yIChpPTA7IGk8bkNoYW5uZWxzOyBpKyspIHsKICAgICAgcGhwc3lPdXRbbl0tPnBQc3lPdXRDaGFubmVsc1tpXSA9IEdldFJhbV9hYWNFbmNfUHN5T3V0Q2hhbm5lbChjaEluYysrKTsKICAgIH0KCiAgICBmb3IgKGk9MDsgaTxuRWxlbWVudHM7IGkrKykgewogICAgICBwaHBzeU91dFtuXS0+cHN5T3V0RWxlbWVudFtpXSA9IEdldFJhbV9hYWNFbmNfUHN5T3V0RWxlbWVudHMoZWxJbmMrKyk7CiAgICAgIGlmIChwaHBzeU91dFtuXS0+cHN5T3V0RWxlbWVudFtpXSA9PSBOVUxMKSB7CiAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKICAgICAgICBnb3RvIGJhaWw7CiAgICAgIH0KICAgIH0KICB9IC8qIG5TdWJGcmFtZXMgKi8KCiAgcmV0dXJuIEFBQ19FTkNfT0s7CgpiYWlsOgogIEZES2FhY0VuY19Qc3lDbG9zZShOVUxMLCBwaHBzeU91dCk7CiAgcmV0dXJuIEVycm9yU3RhdHVzOwp9CgoKQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeUluaXRTdGF0ZXMoUFNZX0lOVEVSTkFMICAgICpoUHN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfU1RBVElDKiBwc3lTdGF0aWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZSkKewogIC8qIGluaXQgaW5wdXQgYnVmZmVyICovCiAgRkRLbWVtY2xlYXIocHN5U3RhdGljLT5wc3lJbnB1dEJ1ZmZlciwgTUFYX0lOUFVUX0JVRkZFUl9TSVpFKnNpemVvZihJTlRfUENNKSk7CgogIEZES2FhY0VuY19Jbml0QmxvY2tTd2l0Y2hpbmcoJnBzeVN0YXRpYy0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTG93RGVsYXkoYXVkaW9PYmplY3RUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0KCgpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHN5SW5pdChQU1lfSU5URVJOQUwgICAgKmhQc3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQgICAgICAgICoqcGhwc3lPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgblN1YkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuTWF4Q2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpjbSkKewogIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0VOQ19PSzsKICBpbnQgaSwgY2gsIG4sIGNoSW5jID0gMCwgcmVzZXRDaGFubmVscyA9IDM7CgogIGlmICggKG5NYXhDaGFubmVscz4yKSAmJiAoY20tPm5DaGFubmVscz09MikgKSB7CiAgICBjaEluYyA9IDE7CiAgICBGREthYWNFbmNfcHN5SW5pdFN0YXRlcyhoUHN5LCBoUHN5LT5wU3RhdGljQ2hhbm5lbHNbMF0sIGF1ZGlvT2JqZWN0VHlwZSk7CiAgfQoKICBpZiAoIChuTWF4Q2hhbm5lbHM9PTIpICkgewogICAgcmVzZXRDaGFubmVscyA9IDA7CiAgfQoKICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspIHsKICAgIGZvciAoY2g9MDsgY2g8Y20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CiAgICAgIGlmIChjbS0+ZWxJbmZvW2ldLmVsVHlwZSE9SURfTEZFKSB7CiAgICAgICAgaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXSA9IGhQc3ktPnBTdGF0aWNDaGFubmVsc1tjaEluY107CiAgICAgICAgaWYgKGNoSW5jPj1yZXNldENoYW5uZWxzKSB7CiAgICAgICAgICAgIEZES2FhY0VuY19wc3lJbml0U3RhdGVzKGhQc3ksIGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0sIGF1ZGlvT2JqZWN0VHlwZSk7CiAgICAgICAgfQogICAgICAgIGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0tPmlzTEZFID0gMDsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdID0gaFBzeS0+cFN0YXRpY0NoYW5uZWxzW25NYXhDaGFubmVscy0xXTsKICAgICAgICBoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdLT5pc0xGRSA9IDE7CiAgICAgIH0KICAgICAgY2hJbmMrKzsKICAgIH0KICB9CgogIGZvciAobj0wOyBuPG5TdWJGcmFtZXM7IG4rKykgewogICAgY2hJbmMgPSAwOwogICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKSB7CiAgICAgIGZvciAoY2g9MDsgY2g8Y20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CiAgICAgICAgcGhwc3lPdXRbbl0tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdID0gcGhwc3lPdXRbbl0tPnBQc3lPdXRDaGFubmVsc1tjaEluYysrXTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIEVycm9yU3RhdHVzOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfcHN5TWFpbkluaXQKICAgIGRlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZXMgcHN5Y2hvYWNvdXN0aWMKICAgIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHN5TWFpbkluaXQoUFNZX0lOVEVSTkFMICpoUHN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdyYW51bGVMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYml0UmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0bnNNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJhbmR3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB1c2VQbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdXNlSVMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgaW5pdEZsYWdzKQp7CiAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CiAgaW50IGksIGNoOwogIGludCBjaGFubmVsc0VmZiA9IGNtLT5uQ2hhbm5lbHNFZmY7CiAgaW50IHRuc0NoYW5uZWxzID0gMDsKICBGQl9UWVBFIGZpbHRlckJhbms7CgoKICBzd2l0Y2goRkRLYWFjRW5jX0dldE1vbm9TdGVyZW9Nb2RlKGNtLT5lbmNNb2RlKSkgewogICAgLyogLi4uIGFuZCBtYXAgdG8gdG5zQ2hhbm5lbHMgKi8KICAgIGNhc2UgRUxfTU9ERV9NT05POiAgIHRuc0NoYW5uZWxzID0gMTsgYnJlYWs7CiAgICBjYXNlIEVMX01PREVfU1RFUkVPOiB0bnNDaGFubmVscyA9IDI7IGJyZWFrOwogICAgZGVmYXVsdDogICAgICAgICAgICAgdG5zQ2hhbm5lbHMgPSAwOwogIH0KCiAgc3dpdGNoIChhdWRpb09iamVjdFR5cGUpCiAgewogICAgZGVmYXVsdDogZmlsdGVyQmFuayA9IEZCX0xDOyAgYnJlYWs7CiAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6ICBmaWx0ZXJCYW5rID0gRkJfTEQ7ICBicmVhazsKICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6IGZpbHRlckJhbmsgPSBGQl9FTEQ7IGJyZWFrOwogIH0KCiAgaFBzeS0+Z3JhbnVsZUxlbmd0aCA9IGdyYW51bGVMZW5ndGg7CgogIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRQc3lDb25maWd1cmF0aW9uKGJpdFJhdGUvY2hhbm5lbHNFZmYsIHNhbXBsZVJhdGUsIGJhbmR3aWR0aCwgTE9OR19XSU5ET1csIGhQc3ktPmdyYW51bGVMZW5ndGgsIHVzZUlTLCAmKGhQc3ktPnBzeUNvbmZbMF0pLCBmaWx0ZXJCYW5rKTsKICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKICAgIHJldHVybiBFcnJvclN0YXR1czsKCiAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfSW5pdFRuc0NvbmZpZ3VyYXRpb24oCiAgICAgICAgKGJpdFJhdGUqdG5zQ2hhbm5lbHMpL2NoYW5uZWxzRWZmLAogICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgdG5zQ2hhbm5lbHMsCiAgICAgICAgTE9OR19XSU5ET1csCiAgICAgICAgaFBzeS0+Z3JhbnVsZUxlbmd0aCwKICAgICAgICAoc3ludGF4RmxhZ3MmQUNfU0JSX1BSRVNFTlQpPzE6MCwKICAgICAgICYoaFBzeS0+cHN5Q29uZlswXS50bnNDb25mKSwKICAgICAgICZoUHN5LT5wc3lDb25mWzBdLAogICAgICAgIChJTlQpKHRuc01hc2smMiksCiAgICAgICAgKElOVCkodG5zTWFzayY4KSApOwoKICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKICAgIHJldHVybiBFcnJvclN0YXR1czsKCiAgaWYgKGdyYW51bGVMZW5ndGggPiA1MTIpIHsKICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRQc3lDb25maWd1cmF0aW9uKGJpdFJhdGUvY2hhbm5lbHNFZmYsIHNhbXBsZVJhdGUsIGJhbmR3aWR0aCwgU0hPUlRfV0lORE9XLCBoUHN5LT5ncmFudWxlTGVuZ3RoLCB1c2VJUywgJmhQc3ktPnBzeUNvbmZbMV0sIGZpbHRlckJhbmspOwogICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCiAgICAgIHJldHVybiBFcnJvclN0YXR1czsKCiAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0VG5zQ29uZmlndXJhdGlvbigKICAgICAgICAgICAgKGJpdFJhdGUqdG5zQ2hhbm5lbHMpL2NoYW5uZWxzRWZmLAogICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICB0bnNDaGFubmVscywKICAgICAgICAgICAgU0hPUlRfV0lORE9XLAogICAgICAgICAgICBoUHN5LT5ncmFudWxlTGVuZ3RoLAogICAgICAgICAgICAoc3ludGF4RmxhZ3MmQUNfU0JSX1BSRVNFTlQpPzE6MCwKICAgICAgICAgICAmaFBzeS0+cHN5Q29uZlsxXS50bnNDb25mLAogICAgICAgICAgICZoUHN5LT5wc3lDb25mWzFdLAogICAgICAgICAgICAoSU5UKSh0bnNNYXNrJjEpLAogICAgICAgICAgICAoSU5UKSh0bnNNYXNrJjQpICk7CgogICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCiAgICByZXR1cm4gRXJyb3JTdGF0dXM7CgogIH0KCgogIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykgewogICAgZm9yIChjaD0wOyBjaDxjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWw7IGNoKyspIHsKICAgICAgaWYgKGluaXRGbGFncykgewogICAgICAgIC8qIHJlc2V0IHN0YXRlcyAqLwogICAgICAgIEZES2FhY0VuY19wc3lJbml0U3RhdGVzKGhQc3ksIGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0sIGF1ZGlvT2JqZWN0VHlwZSk7CiAgICAgIH0KCiAgICAgIEZES2FhY0VuY19Jbml0UHJlRWNob0NvbnRyb2woaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXS0+c2ZiVGhyZXNob2xkbm0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0tPmNhbGNQcmVFY2hvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZbMF0uc2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZbMF0uc2ZiUGNtUXVhbnRUaHJlc2hvbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXS0+bWRjdFNjYWxlbm0xKTsKICAgIH0KICB9CgogIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRQbnNDb25maWd1cmF0aW9uKCZoUHN5LT5wc3lDb25mWzBdLnBuc0NvbmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZS9jaGFubmVsc0VmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5LT5wc3lDb25mWzBdLnNmYkNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5LT5wc3lDb25mWzBdLnNmYk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+ZWxJbmZvWzBdLm5DaGFubmVsc0luRWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhQc3ktPnBzeUNvbmZbMF0uZmlsdGVyYmFuayA9PSBGQl9MQykpOwogIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgcmV0dXJuIEVycm9yU3RhdHVzOwoKICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0UG5zQ29uZmlndXJhdGlvbigmaFBzeS0+cHN5Q29uZlsxXS5wbnNDb25mLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUvY2hhbm5lbHNFZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeS0+cHN5Q29uZlsxXS5zZmJDbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeS0+cHN5Q29uZlsxXS5zZmJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmVsSW5mb1sxXS5uQ2hhbm5lbHNJbkVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoUHN5LT5wc3lDb25mWzFdLmZpbHRlcmJhbmsgPT0gRkJfTEMpKTsKICByZXR1cm4gRXJyb3JTdGF0dXM7Cn0KCgpzdGF0aWMKdm9pZCBGREthYWNFbmNfZGVpbnRlcmxlYXZlSW5wdXRCdWZmZXIoSU5UX1BDTSAqcE91dHB1dFNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKnBJbnB1dFNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5DaGFubmVscykKewogICAgSU5UIGs7CiAgICAvKiBkZWludGVybGF2ZSBpbnB1dCBzYW1wbGVzIGFuZCB3cml0ZSB0byBvdXRwdXQgYnVmZmVyICovCiAgICBmb3IgKGs9MDsgazxuU2FtcGxlczsgaysrKSB7CiAgICAgICAgcE91dHB1dFNhbXBsZXNba10gPSBwSW5wdXRTYW1wbGVzW2sqbkNoYW5uZWxzXTsKICAgIH0KfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19wc3lNYWluCiAgICBkZXNjcmlwdGlvbjogIHBzeWNob2Fjb3VzdGljCiAgICByZXR1cm5zOiAgICAgIGFuIGVycm9yIGNvZGUKCiAgICAgICAgVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgZW5vdWdoIGlucHV0IGRhdGEgaXMgaW4gdGhlIG1vZHVsbyBidWZmZXIuCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCkFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wc3lNYWluKElOVCAgICAgICAgICAgICAgICAgY2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9FTEVNRU5UICAgICAgICAqcHN5RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0RZTkFNSUMgICAgICAgICpwc3lEeW5hbWljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTiAgKnBzeUNvbmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAgICAqUkVTVFJJQ1QgcHN5T3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAqcElucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpjaElkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgdG90YWxDaGFubmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogICAgSU5UIGNvbW1vbldpbmRvdyA9IDE7CiAgICBJTlQgbWF4U2ZiUGVyR3JvdXBbKDIpXTsKICAgIElOVCBtZGN0U3BlY3RydW1fZTsKICAgIElOVCBjaDsgICAvKiBjb3VudHMgdGhyb3VnaCBjaGFubmVscyAgICAgICAgICAqLwogICAgSU5UIHc7ICAgIC8qIGNvdW50cyB0aHJvdWdoIHdpbmRvd3MgICAgICAgICAgICovCiAgICBJTlQgc2ZiOyAgLyogY291bnRzIHRocm91Z2ggc2NhbGVmYWN0b3IgYmFuZHMgKi8KICAgIElOVCBsaW5lOyAvKiBjb3VudHMgdGhyb3VnaCBsaW5lcyAgICAgICAgICAgICAqLwoKICAgIFBTWV9DT05GSUdVUkFUSU9OICpSRVNUUklDVCBoUHN5Q29uZkxvbmcgID0gJnBzeUNvbmZbMF07CiAgICBQU1lfQ09ORklHVVJBVElPTiAqUkVTVFJJQ1QgaFBzeUNvbmZTaG9ydCA9ICZwc3lDb25mWzFdOwogICAgUFNZX09VVF9DSEFOTkVMICAqKlJFU1RSSUNUIHBzeU91dENoYW5uZWwgPSBwc3lPdXRFbGVtZW50LT5wc3lPdXRDaGFubmVsOwogICAgRklYUF9TR0wgc2ZiVG9uYWxpdHlbKDIpXVtNQVhfU0ZCX0xPTkddOwoKICAgIFBTWV9TVEFUSUMgICAgICAgICoqUkVTVFJJQ1QgcHN5U3RhdGljID0gcHN5RWxlbWVudC0+cHN5U3RhdGljOwoKICAgIFBTWV9EQVRBICAgICAgICAgICAqUkVTVFJJQ1QgcHN5RGF0YVsoMildOwogICAgVE5TX0RBVEEgICAgICAgICAgICpSRVNUUklDVCB0bnNEYXRhWygyKV07CiAgICBQTlNfREFUQSAgICAgICAgICAgKlJFU1RSSUNUIHBuc0RhdGFbKDIpXTsKCiAgICBJTlQgemVyb1NwZWMgPSBUUlVFOyAvKiBtZWFucyBhbGwgc3BlY3RyYWwgbGluZXMgYXJlIHplcm8gKi8KCiAgICBJTlQgYmxvY2tTd2l0Y2hpbmdPZmZzZXQ7CgogICAgUFNZX0NPTkZJR1VSQVRJT04gKlJFU1RSSUNUIGhUaGlzUHN5Q29uZlsoMildOwogICAgSU5UIHdpbmRvd0xlbmd0aFsoMildOwogICAgSU5UIG5XaW5kb3dzWygyKV07CiAgICBJTlQgd09mZnNldDsKCiAgICBJTlQgICAgICAgbWF4U2ZiWygyKV07CiAgICBJTlQgICAgICAqcFNmYk1heFNjYWxlU3BlY1soMildOwogICAgRklYUF9EQkwgKnBTZmJFbmVyZ3lbKDIpXTsKICAgIEZJWFBfREJMICpwU2ZiU3ByZWFkRW5lcmd5WygyKV07CiAgICBGSVhQX0RCTCAqcFNmYkVuZXJneUxkRGF0YVsoMildOwogICAgRklYUF9EQkwgKnBTZmJFbmVyZ3lNU1soMildOwogICAgRklYUF9EQkwgKnBTZmJUaHJlc2hvbGRbKDIpXTsKCiAgICBJTlQgaXNTaG9ydFdpbmRvd1soMildOwoKCiAgICBpZiAoaFBzeUNvbmZMb25nLT5maWx0ZXJiYW5rID09IEZCX0xDKSB7CiAgICAgIGJsb2NrU3dpdGNoaW5nT2Zmc2V0ID0gcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCArICg5KnBzeUNvbmYtPmdyYW51bGVMZW5ndGgvKDIqVFJBTlNfRkFDKSk7CiAgICB9IGVsc2UgewogICAgICBibG9ja1N3aXRjaGluZ09mZnNldCA9IHBzeUNvbmYtPmdyYW51bGVMZW5ndGg7CiAgICB9CgogICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKICAgIHsKICAgICAgICBwc3lEYXRhW2NoXSA9ICZwc3lEeW5hbWljLT5wc3lEYXRhW2NoXTsKICAgICAgICB0bnNEYXRhW2NoXSA9ICZwc3lEeW5hbWljLT50bnNEYXRhW2NoXTsKICAgICAgICBwbnNEYXRhW2NoXSA9ICZwc3lEeW5hbWljLT5wbnNEYXRhW2NoXTsKCiAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSA9IHBzeU91dENoYW5uZWxbY2hdLT5tZGN0U3BlY3RydW07CiAgICB9CgogICAgLyogYmxvY2sgc3dpdGNoaW5nICovCiAgICBpZiAoaFBzeUNvbmZMb25nLT5maWx0ZXJiYW5rICE9IEZCX0VMRCkKICAgIHsKICAgICAgaW50IGVycjsKCiAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCiAgICAgIHsKICAgICAgICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVCh0aW1lU2lnbmFsLCBJTlRfUENNLCAoMTAyNCkpOwogICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLnRpbWVTaWduYWwgPSB0aW1lU2lnbmFsOwoKICAgICAgICAgIC8qIGRlaW50ZXJsZWF2ZSBpbnB1dCBkYXRhIGFuZCB1c2UgZm9yIGJsb2NrIHN3aXRjaGluZyAqLwogICAgICAgICAgRkRLYWFjRW5jX2RlaW50ZXJsZWF2ZUlucHV0QnVmZmVyKCBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wudGltZVNpZ25hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcElucHV0W2NoSWR4W2NoXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPmdyYW51bGVMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ2hhbm5lbHMpOwoKCiAgICAgICAgICBGREthYWNFbmNfQmxvY2tTd2l0Y2hpbmcgKCZwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mLT5ncmFudWxlTGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxwc3lTdGF0aWNbY2hdLT5pc0xGRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgoKICAgICAgICAgICAgLyogZmlsbCB1cCBpbnRlcm5hbCBpbnB1dCBidWZmZXIsIHRvIDJ4ZnJhbWVsZW5ndGggc2FtcGxlcyAqLwogICAgICAgICAgICBGREttZW1jcHkocHN5U3RhdGljW2NoXS0+cHN5SW5wdXRCdWZmZXIrYmxvY2tTd2l0Y2hpbmdPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wudGltZVNpZ25hbCwKICAgICAgICAgICAgICAgICAgICAgICgyKnBzeUNvbmYtPmdyYW51bGVMZW5ndGgtYmxvY2tTd2l0Y2hpbmdPZmZzZXQpKnNpemVvZihJTlRfUENNKSk7CgogICAgICAgICAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHRpbWVTaWduYWwsIElOVF9QQ00sICgxMDI0KSk7CiAgICAgIH0KCiAgICAgIC8qIHN5bmNoIGxlZnQgYW5kIHJpZ2h0IGJsb2NrIHR5cGUgKi8KICAgICAgZXJyID0gRkRLYWFjRW5jX1N5bmNCbG9ja1N3aXRjaGluZygmcHN5U3RhdGljWzBdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeVN0YXRpY1sxXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uV2luZG93KTsKCiAgICAgIGlmIChlcnIpIHsKICAgICAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0FPVDsgLyogbWl4ZWQgdXAgTEMgYW5kIExEICovCiAgICAgIH0KCiAgICB9CiAgICBlbHNlIHsKICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKICAgICAgewogICAgICAgIC8qIGRlaW50ZXJsZWF2ZSBpbnB1dCBkYXRhIGFuZCB1c2UgZm9yIGJsb2NrIHN3aXRjaGluZyAqLwogICAgICAgIEZES2FhY0VuY19kZWludGVybGVhdmVJbnB1dEJ1ZmZlciggcHN5U3RhdGljW2NoXS0+cHN5SW5wdXRCdWZmZXIgKyBibG9ja1N3aXRjaGluZ09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnB1dFtjaElkeFtjaF1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ2hhbm5lbHMpOwogICAgICB9CiAgICB9CgogICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKICAgICAgaXNTaG9ydFdpbmRvd1tjaF09KHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKTsKCiAgICAvKiBzZXQgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gd2luZG93IGxlbmd0aCAqLwogICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKICAgIHsKICAgICAgICBpZihpc1Nob3J0V2luZG93W2NoXSkgewogICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdICAgICAgID0gaFBzeUNvbmZTaG9ydDsKICAgICAgICAgICAgd2luZG93TGVuZ3RoW2NoXSAgICAgICA9IHBzeUNvbmYtPmdyYW51bGVMZW5ndGgvVFJBTlNfRkFDOwogICAgICAgICAgICBuV2luZG93c1tjaF0gICAgICAgICAgID0gVFJBTlNfRkFDOwogICAgICAgICAgICBtYXhTZmJbY2hdICAgICAgICAgICAgID0gTUFYX1NGQl9TSE9SVDsKCiAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdICAgPSBwc3lEYXRhW2NoXS0+c2ZiTWF4U2NhbGVTcGVjLlNob3J0WzBdOwogICAgICAgICAgICBwU2ZiRW5lcmd5W2NoXSAgICAgICAgID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneS5TaG9ydFswXTsKICAgICAgICAgICAgcFNmYlNwcmVhZEVuZXJneVtjaF0gICA9IHBzeURhdGFbY2hdLT5zZmJTcHJlYWRFbmVyZ3kuU2hvcnRbMF07CiAgICAgICAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdICAgPSBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TGREYXRhLlNob3J0WzBdOwogICAgICAgICAgICBwU2ZiRW5lcmd5TVNbY2hdICAgICAgID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TLlNob3J0WzBdOwogICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXSAgICAgID0gcHN5RGF0YVtjaF0tPnNmYlRocmVzaG9sZC5TaG9ydFswXTsKCiAgICAgICAgfSBlbHNlCiAgICAgICAgewogICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdICAgICAgID0gaFBzeUNvbmZMb25nOwogICAgICAgICAgICB3aW5kb3dMZW5ndGhbY2hdICAgICAgID0gcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aDsKICAgICAgICAgICAgbldpbmRvd3NbY2hdICAgICAgICAgICA9IDE7CiAgICAgICAgICAgIG1heFNmYltjaF0gICAgICAgICAgICAgPSBNQVhfR1JPVVBFRF9TRkI7CgogICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSAgID0gcHN5RGF0YVtjaF0tPnNmYk1heFNjYWxlU3BlYy5Mb25nOwogICAgICAgICAgICBwU2ZiRW5lcmd5W2NoXSAgICAgICAgID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneS5Mb25nOwogICAgICAgICAgICBwU2ZiU3ByZWFkRW5lcmd5W2NoXSAgID0gcHN5RGF0YVtjaF0tPnNmYlNwcmVhZEVuZXJneS5Mb25nOwogICAgICAgICAgICBwU2ZiRW5lcmd5TGREYXRhW2NoXSAgID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneUxkRGF0YS5Mb25nOwogICAgICAgICAgICBwU2ZiRW5lcmd5TVNbY2hdICAgICAgID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TLkxvbmc7CiAgICAgICAgICAgIHBTZmJUaHJlc2hvbGRbY2hdICAgICAgPSBwc3lEYXRhW2NoXS0+c2ZiVGhyZXNob2xkLkxvbmc7CiAgICAgICAgfQogICAgfQoKICAgIC8qIFRyYW5zZm9ybSBhbmQgZ2V0IG1kY3RTY2FsaW5nIGZvciBhbGwgY2hhbm5lbHMgYW5kIHdpbmRvd3MuICovCiAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQogICAgewogICAgICAgIC8qIHVwZGF0ZSBudW1iZXIgb2YgYWN0aXZlIGJhbmRzICovCiAgICAgICAgaWYgKHBzeVN0YXRpY1tjaF0tPmlzTEZFKSB7CiAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUgPSBoVGhpc1BzeUNvbmZbY2hdLT5zZmJBY3RpdmVMRkU7CiAgICAgICAgICAgIHBzeURhdGFbY2hdLT5sb3dwYXNzTGluZSA9IGhUaGlzUHN5Q29uZltjaF0tPmxvd3Bhc3NMaW5lTEZFOwogICAgICAgIH0gZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSA9IGhUaGlzUHN5Q29uZltjaF0tPnNmYkFjdGl2ZTsKICAgICAgICAgICAgcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lID0gaFRoaXNQc3lDb25mW2NoXS0+bG93cGFzc0xpbmU7CiAgICAgICAgfQoKICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgewoKICAgICAgICAgIHdPZmZzZXQgPSB3KndpbmRvd0xlbmd0aFtjaF07CgogICAgICAgICAgRkRLYWFjRW5jX1RyYW5zZm9ybV9SZWFsKCBwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlciArIHdPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NoYXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NoYXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mLT5ncmFudWxlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZGN0U3BlY3RydW1fZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+ZmlsdGVyYmFuawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxwc3lTdGF0aWNbY2hdLT5vdmVybGFwQWRkQnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAvKiBMb3cgcGFzcyAvIGhpZ2hlc3Qgc2ZiICovCiAgICAgICAgICBGREttZW1jbGVhcigmcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUrd09mZnNldF0sCiAgICAgICAgICAgICAgICAgICAgICAod2luZG93TGVuZ3RoW2NoXS1wc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUpKnNpemVvZihGSVhQX0RCTCkpOwoKICAgICAgICAgIGlmIChoUHN5Q29uZkxvbmctPmZpbHRlcmJhbmsgIT0gRkJfTEMpIHsKICAgICAgICAgICAgLyogRG8gYmxlbmRpbmcgdG8gcmVkdWNlIGdpYmJzIGFydGlmYWN0cyAqLwogICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8RkFERV9PVVRfTEVOOyBpKyspIHsKICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3BzeURhdGFbY2hdLT5sb3dwYXNzTGluZSt3T2Zmc2V0IC0gRkFERV9PVVRfTEVOICsgaV0gPSBmTXVsdChwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3BzeURhdGFbY2hdLT5sb3dwYXNzTGluZSt3T2Zmc2V0IC0gRkFERV9PVVRfTEVOICsgaV0sIGZhZGVPdXRGYWN0b3JbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgoKICAgICAgICAgIC8qIENoZWNrIGZvciB6ZXJvIHNwZWN0cnVtLiBUaGVzZSBsb29wcyB3aWxsIHVzdWFsbHkgdGVybWluYXRlIHZlcnksIHZlcnkgZWFybHkuICovCiAgICAgICAgICBmb3IobGluZT0wOyAobGluZTxwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUpICYmICh6ZXJvU3BlYz09VFJVRSk7IGxpbmUrKykgewogICAgICAgICAgICAgIGlmIChwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW2xpbmUrd09mZnNldF0gIT0gKEZJWFBfREJMKTApIHsKICAgICAgICAgICAgICAgICAgemVyb1NwZWMgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICB9IC8qIHcgbG9vcCAqLwoKICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlID0gbWRjdFNwZWN0cnVtX2U7CgogICAgICAgIC8qIHJvdGF0ZSBpbnRlcm5hbCB0aW1lIHNhbXBsZXMgKi8KICAgICAgICBGREttZW1tb3ZlKHBzeVN0YXRpY1tjaF0tPnBzeUlucHV0QnVmZmVyLAogICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+cHN5SW5wdXRCdWZmZXIrcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPmdyYW51bGVMZW5ndGgqc2l6ZW9mKElOVF9QQ00pKTsKCgogICAgICAgIC8qIC4uLiBhbmQgZ2V0IHJlbWFpbmluZyBzYW1wbGVzIGZyb20gaW5wdXQgYnVmZmVyICovCiAgICAgICAgRkRLYWFjRW5jX2RlaW50ZXJsZWF2ZUlucHV0QnVmZmVyKCBwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlcitwc3lDb25mLT5ncmFudWxlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcElucHV0WyAoMipwc3lDb25mLT5ncmFudWxlTGVuZ3RoLWJsb2NrU3dpdGNoaW5nT2Zmc2V0KSp0b3RhbENoYW5uZWxzICsgY2hJZHhbY2hdIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ09mZnNldC1wc3lDb25mLT5ncmFudWxlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxDaGFubmVscyk7CgogICAgfSAvKiBjaCAqLwoKICAgIC8qIERvIHNvbWUgcmVzY2FsaW5nIHRvIGdldCBtYXhpbXVtIHBvc3NpYmxlIGFjY3VyYWN5IGZvciBlbmVyZ2llcyAqLwogICAgaWYgKCB6ZXJvU3BlYyA9PSBGQUxTRSkgewoKICAgICAgICAvKiBDYWxjIHBvc3NpYmxlIHNwZWN0cnVtIGxlZnRzaGlmdCBmb3IgZWFjaCBzZmIgKDEgbWVhbnM6IDEgYml0IGxlZnQgc2hpZnQgaXMgcG9zc2libGUgd2l0aG91dCBvdmVyZmxvdykgKi8KICAgICAgICBJTlQgbWluU3BlY1NoaWZ0ID0gTUFYX1NISUZUX0RCTDsKICAgICAgICBJTlQgbnJnU2hpZnQgICAgID0gTUFYX1NISUZUX0RCTDsKICAgICAgICBJTlQgZmluYWxTaGlmdCAgID0gTUFYX1NISUZUX0RCTDsKICAgICAgICBGSVhQX0RCTCBjdXJyTnJnID0gMDsKICAgICAgICBGSVhQX0RCTCBtYXhOcmcgID0gMDsKCiAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewogICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgewogICAgICAgICAgICAgICAgd09mZnNldCA9IHcqd2luZG93TGVuZ3RoW2NoXTsKICAgICAgICAgICAgICAgIEZES2FhY0VuY19DYWxjU2ZiTWF4U2NhbGVTcGVjKHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdK3cqbWF4U2ZiW2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOwoKICAgICAgICAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKQogICAgICAgICAgICAgICAgICAgIG1pblNwZWNTaGlmdCA9IGZpeE1pbihtaW5TcGVjU2hpZnQsIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0pW3NmYl0pOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgLyogQ2FsYyBwb3NzaWJsZSBlbmVyZ3kgbGVmdHNoaWZ0IGZvciBlYWNoIHNmYiAoMSBtZWFuczogMSBiaXQgbGVmdCBzaGlmdCBpcyBwb3NzaWJsZSB3aXRob3V0IG92ZXJmbG93KSAqLwogICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKICAgICAgICAgICAgICAgIHdPZmZzZXQgPSB3KndpbmRvd0xlbmd0aFtjaF07CiAgICAgICAgICAgICAgICBjdXJyTnJnID0gRkRLYWFjRW5jX0NoZWNrQmFuZEVuZXJneU9wdGltKHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdK3cqbWF4U2ZiW2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5TcGVjU2hpZnQtNCk7CgogICAgICAgICAgICAgICAgbWF4TnJnID0gZml4TWF4KG1heE5yZywgY3Vyck5yZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggbWF4TnJnICE9IChGSVhQX0RCTCkwICkgewogICAgICAgICAgICBucmdTaGlmdCA9IChDb3VudExlYWRpbmdCaXRzKG1heE5yZyk+PjEpICsgKG1pblNwZWNTaGlmdC00KTsKICAgICAgICB9CgogICAgICAgIC8qIDJjaGVjazogSGFzbid0IHRoaXMgZGVjaXNpb24gdG8gYmUgbWFkZSBmb3IgYm90aCBjaGFubmVscz8gKi8KICAgICAgICAvKiBGb3Igc2hvcnQgd2luZG93cyAxIGFkZGl0aW9uYWwgYml0IGhlYWRyb29tIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IG92ZXJmbG93cyB3aGVuIHN1bW1pbmcgdXAgZW5lcmdpZXMgaW4gRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKCkgKi8KICAgICAgICBpZihpc1Nob3J0V2luZG93WzBdKSBucmdTaGlmdC0tOwoKICAgICAgICAvKiBib3RoIHNwZWN0cnVtIGFuZCBlbmVyZ2llcyBtdXN0bid0IG92ZXJmbG93ICovCiAgICAgICAgZmluYWxTaGlmdCA9IGZpeE1pbihtaW5TcGVjU2hpZnQsIG5yZ1NoaWZ0KTsKCiAgICAgICAgLyogZG8gbm90IHNoaWZ0IG1vcmUgdGhhbiAzIGJpdHMgbW9yZSB0byB0aGUgbGVmdCB0aGFuIHNpZ25hbCB3aXRob3V0IGJsb2NrZmxvYXRpbmcgcG9pbnQKICAgICAgICAgKiB3b3VsZCBiZSB0byBhdm9pZCBvdmVyZmxvdyBvZiBzY2FsZWQgUENNIHF1YW50aXphdGlvbiB0aHJlc2hvbGRzICovCiAgICAgICAgaWYgKGZpbmFsU2hpZnQgPiBwc3lEYXRhWzBdLT5tZGN0U2NhbGUgKyAzICkKICAgICAgICAgICAgZmluYWxTaGlmdCA9IHBzeURhdGFbMF0tPm1kY3RTY2FsZSArIDM7CgogICAgICAgIEZES19BU1NFUlQoZmluYWxTaGlmdCA+PSAwKTsgICAgLyogcmlnaHQgc2hpZnQgaXMgbm90IGFsbG93ZWQgKi8KCiAgICAgICAgLyogY29ycmVjdCBzZmJFbmVyZ3kgYW5kIHNmYkVuZXJneUxkRGF0YSB3aXRoIG5ldyBmaW5hbFNoaWZ0ICovCiAgICAgICAgRklYUF9EQkwgbGRTaGlmdCA9IGZpbmFsU2hpZnQgKiBGTDJGWENPTlNUX0RCTCgyLjAvNjQpOwogICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKICAgICAgICAgICAgICAgIGZvcihzZmI9MDsgc2ZiPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7CiAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlID0gZml4TWF4KDAsIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0pW3NmYl0tNCk7CiAgICAgICAgICAgICAgICAgICAgc2NhbGUgICAgID0gZml4TWluKChzY2FsZS1maW5hbFNoaWZ0KTw8MSwgREZSQUNUX0JJVFMtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxlID49IDApIChwU2ZiRW5lcmd5W2NoXSt3Km1heFNmYltjaF0pW3NmYl0gPj49IChzY2FsZSk7CiAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIChwU2ZiRW5lcmd5W2NoXSt3Km1heFNmYltjaF0pW3NmYl0gPDw9ICgtc2NhbGUpOwogICAgICAgICAgICAgICAgICAgIChwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0pW3NmYl0gPSBmTXVsdCgocFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdKVtzZmJdLCBDX1JBVElPKTsKICAgICAgICAgICAgICAgICAgICAocFNmYkVuZXJneUxkRGF0YVtjaF0rdyptYXhTZmJbY2hdKVtzZmJdICs9IGxkU2hpZnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggZmluYWxTaGlmdCAhPSAwICkgewogICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewogICAgICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0ID0gdyp3aW5kb3dMZW5ndGhbY2hdOwogICAgICAgICAgICAgICAgICAgIGZvcihsaW5lPTA7IGxpbmU8cHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lOyBsaW5lKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtsaW5lK3dPZmZzZXRdIDw8PSBmaW5hbFNoaWZ0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgc2ZiTWF4U2NhbGVTcGVjICovCiAgICAgICAgICAgICAgICAgICAgZm9yIChzZmIgPSAwOyBzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspCiAgICAgICAgICAgICAgICAgICAgICAgIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0pW3NmYl0gLT0gZmluYWxTaGlmdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBtZGN0U2NhbGUgKi8KICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUgLT0gZmluYWxTaGlmdDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9IGVsc2UgewogICAgICAgIC8qIGFsbCBzcGVjdHJhbCBsaW5lcyBhcmUgemVybyAqLwogICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUgPSAwOyAgICAgLyogb3RoZXJ3aXNlIG1kY3RTY2FsZSB3b3VsZCBiZSBmb3IgZXhhbXBsZSA3IGFuZCBQQ00gcXVhbnRpemF0aW9uIHRocmVzaG9sZHMgd291bGQgYmUgc2hpZnRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDE0IGJpdHMgdG8gdGhlIHJpZ2h0IGNhdXNpbmcgc29tZSBvZiB0aGVtIHRvIGJlY29tZSAwICh3aGljaCBjYXVzZXMgcHJvYmxlbXMgbGF0ZXIpICovCiAgICAgICAgICAgIC8qIGNsZWFyIHNmYk1heFNjYWxlU3BlYyAqLwogICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgewogICAgICAgICAgICAgICAgZm9yIChzZmIgPSAwOyBzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspIHsKICAgICAgICAgICAgICAgICAgICAocFNmYk1heFNjYWxlU3BlY1tjaF0rdyptYXhTZmJbY2hdKVtzZmJdID0gMDsKICAgICAgICAgICAgICAgICAgICAocFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdKVtzZmJdICAgICAgID0gKEZJWFBfREJMKTA7CiAgICAgICAgICAgICAgICAgICAgKHBTZmJFbmVyZ3lMZERhdGFbY2hdK3cqbWF4U2ZiW2NoXSlbc2ZiXSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICAgICAgICAgICAgICAgICAgICAocFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdKVtzZmJdICAgID0gKEZJWFBfREJMKTA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyogQWR2YW5jZSBwc3ljaG9hY291c3RpY3M6IFRvbmFsaXR5IGFuZCBUTlMgKi8KICAgIGlmIChwc3lTdGF0aWNbMF0tPmlzTEZFKSB7CiAgICAgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmUgPSAwOwogICAgfQogICAgZWxzZQogICAgewoKICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgICAgIGlmICghaXNTaG9ydFdpbmRvd1tjaF0pIHsKICAgICAgICAgICAgICAgIC8qIHRvbmFsaXR5ICovCiAgICAgICAgICAgICAgICBGREthYWNFbmNfQ2FsY3VsYXRlRnVsbFRvbmFsaXR5KCBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneUxkRGF0YVtjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYlRvbmFsaXR5W2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5wbnNDb25mLnVzZVBucyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChoUHN5Q29uZkxvbmctPnRuc0NvbmYudG5zQWN0aXZlIHx8IGhQc3lDb25mU2hvcnQtPnRuc0NvbmYudG5zQWN0aXZlKSB7CiAgICAgICAgICAgIElOVCB0bnNBY3RpdmVbVFJBTlNfRkFDXTsKICAgICAgICAgICAgSU5UIG5yZ1NjYWxpbmdbMl0gPSB7MCwwfTsKICAgICAgICAgICAgSU5UIHRuc1NwZWNTaGlmdCA9IDA7CgogICAgICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgewoKICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0ID0gdyp3aW5kb3dMZW5ndGhbY2hdOwogICAgICAgICAgICAgICAgICAgIC8qIFROUyAqLwogICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19UbnNEZXRlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVtjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhUaGlzUHN5Q29uZltjaF0tPnRuc0NvbmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdLT50bnNJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYkNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGNoYW5uZWxzID09IDIpIHsKICAgICAgICAgICAgICBGREthYWNFbmNfVG5zU3luYygKICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbMV0sCiAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhWzBdLAogICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbMV0tPnRuc0luZm8sCiAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0Q2hhbm5lbFswXS0+dG5zSW5mbywKCiAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbMV0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UsCiAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbMF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAmaFRoaXNQc3lDb25mWzFdLT50bnNDb25mKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgRkRLX0FTU0VSVChjb21tb25XaW5kb3c9MSk7IC8qIGFsbCBjaGVja3MgZm9yIFROUyBkbyBvbmx5IHdvcmsgZm9yIGNvbW1vbiB3aW5kb3dzICh3aGljaCBpcyBhbHdheXMgc2V0KSovCiAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzWzBdOyB3KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChpc1Nob3J0V2luZG93WzBdKQogICAgICAgICAgICAgICAgICAgIHRuc0FjdGl2ZVt3XSA9IHRuc0RhdGFbMF0tPmRhdGFSYXcuU2hvcnQuc3ViQmxvY2tJbmZvW3ddLnRuc0FjdGl2ZSB8fAogICAgICAgICAgICAgICAgICAgICgoY2hhbm5lbHMgPT0gMikgPyB0bnNEYXRhWzFdLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1t3XS50bnNBY3RpdmUgOiAwKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB0bnNBY3RpdmVbd10gPSB0bnNEYXRhWzBdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSB8fAogICAgICAgICAgICAgICAgICAgICgoY2hhbm5lbHMgPT0gMikgPyB0bnNEYXRhWzFdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSA6IDApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgICAgICAgICBpZiAodG5zQWN0aXZlWzBdICYmICFpc1Nob3J0V2luZG93W2NoXSkgewogICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIGRvd24gc3BlY3RydW0gaWYgdG5zIGlzIGFjdGl2ZSBpbiBvbmUgb2YgdGhlIHR3byBjaGFubmVscyB3aXRoIHNhbWUgbGFzdFdpbmRvd1NlcXVlbmNlICovCiAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgcGFydCBvZiB0aHJlc2hvbGQgY2FsY3VsYXRpb247IGl0J3Mgbm90IG5lY2Vzc2FyeSB0byB1cGRhdGUgc2ZiTWF4U2NhbGVTcGVjICovCiAgICAgICAgICAgICAgICAgICAgSU5UIHNoaWZ0ID0gMTsKICAgICAgICAgICAgICAgICAgICBmb3Ioc2ZiPTA7IHNmYjxoVGhpc1BzeUNvbmZbY2hdLT5sb3dwYXNzTGluZTsgc2ZiKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtzZmJdID0gcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtzZmJdID4+IHNoaWZ0OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHRocmVzaG9sZHMgKi8KICAgICAgICAgICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgcFNmYlRocmVzaG9sZFtjaF1bc2ZiXSA+Pj0gKDIqc2hpZnQpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTY2FsZSArPSBzaGlmdDsgLyogdXBkYXRlIG1kY3RTY2FsZSAqLwoKICAgICAgICAgICAgICAgICAgICAvKiBjYWxjIHNmYkVuZXJnaWVzIGFmdGVyIHRuc0VuY29kZSBhZ2FpbiAhICovCgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgd09mZnNldCA9IHcqd2luZG93TGVuZ3RoW2NoXTsKICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfVG5zRW5jb2RlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsW2NoXS0+dG5zSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhW2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJDbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhUaGlzUHN5Q29uZltjaF0tPnRuc0NvbmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0W3BzeURhdGFbY2hdLT5zZmJBY3RpdmVdLC8qaFRoaXNQc3lDb25mW2NoXS0+bG93cGFzc0xpbmUqLyAvKiBmaWx0ZXIgc3RvcHMgYmVmb3JlIHRoYXQgbGluZSAhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSk7CgogICAgICAgICAgICAgICAgICAgIGlmKHRuc0FjdGl2ZVt3XSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsYyBzZmItYmFuZHdpc2UgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBhZ2FpbiwgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRucyBhY3RpdmUgaW4gY3VycmVudCBjaGFubmVsIG9yIGluIG9uZSBjaGFubmVsIHdpdGggc2FtZSBsYXN0V2luZG93U2VxdWVuY2UgbGVmdCBhbmQgcmlnaHQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19DYWxjU2ZiTWF4U2NhbGVTcGVjKHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewogICAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7CgogICAgICAgICAgICAgICAgaWYgKHRuc0FjdGl2ZVt3XSkgewoKICAgICAgICAgICAgICAgICAgaWYgKGlzU2hvcnRXaW5kb3dbY2hdKSB7CiAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX0NhbGNCYW5kRW5lcmd5T3B0aW1TaG9ydChwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtK3cqd2luZG93TGVuZ3RoW2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1tjaF0rdyptYXhTZmJbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lbY2hdK3cqbWF4U2ZiW2NoXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbnJnU2NhbGluZ1tjaF0gPSAgICAgICAgLyogd2l0aCB0bnMsIGVuZXJneSBjYWxjdWxhdGlvbiBjYW4gb3ZlcmZsb3c7IC0+IHNjYWxpbmcgKi8KICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfQ2FsY0JhbmRFbmVyZ3lPcHRpbUxvbmcocHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneUxkRGF0YVtjaF0pOwogICAgICAgICAgICAgICAgICAgIHRuc1NwZWNTaGlmdCA9IGZpeE1heCh0bnNTcGVjU2hpZnQsIG5yZ1NjYWxpbmdbY2hdKTsgICAgICAgLyogbnJnU2NhbGluZyBpcyBzZXQgb25seSBpZiBucmcgd291bGQgaGF2ZSBhbiBvdmVyZmxvdyAqLwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IC8qIGlmIHRuc0FjdGl2ZSAqLwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAvKiBlbmQgY2hhbm5lbCBsb29wICovCgogICAgICAgICAgICAvKiBhZGFwdCBzY2FsaW5nIHRvIHByZXZlbnQgbnJnIG92ZXJmbG93LCBvbmx5IGZvciBsb25nIGJsb2NrcyAqLwogICAgICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgICAgICAgaWYgKCAodG5zU3BlY1NoaWZ0IT0wKSAmJiAhaXNTaG9ydFdpbmRvd1tjaF0gKSB7CiAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIHNwZWN0cnVtLCBucmcncyBhbmQgdGhyZXNob2xkcywgaWYgdGhlcmUgd2FzIGFuIG92ZXJmbG93IGluIHNmYk5yZyBjYWxjdWxhdGlvbiBhZnRlciB0bnMgKi8KICAgICAgICAgICAgICAgIGZvcihsaW5lPTA7IGxpbmU8aFRoaXNQc3lDb25mW2NoXS0+bG93cGFzc0xpbmU7IGxpbmUrKykgewogICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW2xpbmVdID4+PSB0bnNTcGVjU2hpZnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBJTlQgc2NhbGUgPSAodG5zU3BlY1NoaWZ0LW5yZ1NjYWxpbmdbY2hdKTw8MTsKICAgICAgICAgICAgICAgIGZvcihzZmI9MDsgc2ZiPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7CiAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdW3NmYl0gICAtPSBzY2FsZSpGTDJGWENPTlNUX0RCTCgxLjAvTERfREFUQV9TQ0FMSU5HKTsKICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneVtjaF1bc2ZiXSAgICAgICAgPj49IHNjYWxlOwogICAgICAgICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXVtzZmJdICAgICA+Pj0gKHRuc1NwZWNTaGlmdDw8MSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlICs9IHRuc1NwZWNTaGlmdDsgIC8qIHVwZGF0ZSBtZGN0U2NhbGU7IG5vdCBuZWNlc3NhcnkgdG8gdXBkYXRlIHNmYk1heFNjYWxlU3BlYyAqLwoKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gLyogZW5kIGNoYW5uZWwgbG9vcCAqLwoKICAgICAgICB9IC8qIFROUyBhY3RpdmUgKi8KICAgIH0gIC8qICFpc0xGRSAqLwoKCgoKCgogICAgLyogQWR2YW5jZSB0aHJlc2hvbGRzICovCiAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgSU5UIGhlYWRyb29tOwoKICAgICAgICBGSVhQX0RCTCBjbGlwRW5lcmd5OwogICAgICAgIElOVCBlbmVyZ3lTaGlmdCAgPSBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlKjIgOwogICAgICAgIElOVCBjbGlwTnJnU2hpZnQgPSBlbmVyZ3lTaGlmdCAtIFRIUl9TSElGVEJJVFMgOwoKICAgICAgICBpZihpc1Nob3J0V2luZG93W2NoXSkKICAgICAgICAgICAgaGVhZHJvb20gPSA2OwogICAgICAgIGVsc2UKICAgICAgICAgICAgaGVhZHJvb20gPSAwOwoKICAgICAgICBpZiAoY2xpcE5yZ1NoaWZ0ID49IDApCiAgICAgICAgICAgIGNsaXBFbmVyZ3kgPSBoVGhpc1BzeUNvbmZbY2hdLT5jbGlwRW5lcmd5ID4+ICBjbGlwTnJnU2hpZnQgOwogICAgICAgIGVsc2UgaWYgKGNsaXBOcmdTaGlmdD49LWhlYWRyb29tKQogICAgICAgICAgICBjbGlwRW5lcmd5ID0gaFRoaXNQc3lDb25mW2NoXS0+Y2xpcEVuZXJneSA8PCAtY2xpcE5yZ1NoaWZ0IDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGNsaXBFbmVyZ3kgPSAoRklYUF9EQkwpTUFYVkFMX0RCTCA7CgogICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKQogICAgICAgIHsKICAgICAgICAgICAgSU5UIGk7CiAgICAgICAgICAgIC8qIGxpbWl0IHRocmVzaG9sZCB0byBhdm9pZCBjbGlwcGluZyAqLwogICAgICAgICAgICBmb3IgKGk9MDsgaTxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBpKyspIHsKICAgICAgICAgICAgICAgICoocFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdK2kpID0gZml4TWluKCoocFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdK2kpLCBjbGlwRW5lcmd5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogc3ByZWFkaW5nICovCiAgICAgICAgICAgIEZES2FhY0VuY19TcHJlYWRpbmdNYXgocHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk1hc2tMb3dGYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJNYXNrSGlnaEZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJUaHJlc2hvbGRbY2hdK3cqbWF4U2ZiW2NoXSk7CgoKICAgICAgICAgICAgLyogUENNIHF1YW50aXphdGlvbiB0aHJlc2hvbGQgKi8KICAgICAgICAgICAgZW5lcmd5U2hpZnQgKz0gUENNX1FVQU5UX1RIUl9TQ0FMRTsKICAgICAgICAgICAgaWYgKGVuZXJneVNoaWZ0Pj0wKSB7CiAgICAgICAgICAgICAgIGVuZXJneVNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsZW5lcmd5U2hpZnQpOwogICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlO2krKykgewogICAgICAgICAgICAgICAgICAgKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSkgPSBmaXhNYXgoKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSkgPj4gVEhSX1NISUZUQklUUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoVGhpc1BzeUNvbmZbY2hdLT5zZmJQY21RdWFudFRocmVzaG9sZFtpXSA+PiBlbmVyZ3lTaGlmdCkpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGVuZXJneVNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsLWVuZXJneVNoaWZ0KTsKICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTtpKyspIHsKICAgICAgICAgICAgICAgICAgICoocFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdK2kpID0gZml4TWF4KCoocFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdK2kpID4+IFRIUl9TSElGVEJJVFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaFRoaXNQc3lDb25mW2NoXS0+c2ZiUGNtUXVhbnRUaHJlc2hvbGRbaV0gPDwgZW5lcmd5U2hpZnQpKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXBzeVN0YXRpY1tjaF0tPmlzTEZFKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBwcmVlY2hvIGNvbnRyb2wgKi8KICAgICAgICAgICAgICAgIGlmKHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UgPT0gU1RPUF9XSU5ET1cpIHsKICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IEZES2FhY0VuY19QcmVFY2hvQ29udHJvbCBmcm9tIGNvbXBhcmluZyBzdG9wCiAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkcyB3aXRoIHNob3J0IHRocmVzaG9sZHMgKi8KICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlO2krKykgewogICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5zZmJUaHJlc2hvbGRubTFbaV0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPm1kY3RTY2FsZW5tMSA9IDA7CiAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+Y2FsY1ByZUVjaG8gID0gMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBGREthYWNFbmNfUHJlRWNob0NvbnRyb2woIHBzeVN0YXRpY1tjaF0tPnNmYlRocmVzaG9sZG5tMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5jYWxjUHJlRWNobywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPm1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeVN0YXRpY1tjaF0tPm1kY3RTY2FsZW5tMSk7CgogICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+Y2FsY1ByZUVjaG8gPSAxOwoKICAgICAgICAgICAgICAgIGlmKHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UgPT0gU1RBUlRfV0lORE9XKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sIGluIG5leHQgZnJhbWUgdG8gY29tcGFyZSBzdGFydAogICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZHMgd2l0aCBzaG9ydCB0aHJlc2hvbGRzICovCiAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTtpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+c2ZiVGhyZXNob2xkbm0xW2ldID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5tZGN0U2NhbGVubTEgPSAwOwogICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmNhbGNQcmVFY2hvICA9IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBzcHJlYWQgZW5lcmd5IHRvIGF2b2lkIGhvbGUgZGV0ZWN0aW9uICovCiAgICAgICAgICAgIEZES21lbWNweShwU2ZiU3ByZWFkRW5lcmd5W2NoXSt3Km1heFNmYltjaF0sIHBTZmJFbmVyZ3lbY2hdK3cqbWF4U2ZiW2NoXSwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSpzaXplb2YoRklYUF9EQkwpKTsKCiAgICAgICAgICAgIEZES2FhY0VuY19TcHJlYWRpbmdNYXgocHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk1hc2tMb3dGYWN0b3JTcHJFbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiU3ByZWFkRW5lcmd5W2NoXSt3Km1heFNmYltjaF0pOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBDYWxjIGJhbmR3aXNlIGVuZXJnaWVzIGZvciBtaWQgYW5kIHNpZGUgY2hhbm5lbC4gRG8gaXQgb25seSBpZiAyIGNoYW5uZWxzIGV4aXN0ICovCiAgICBpZiAoY2hhbm5lbHM9PTIpIHsKICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1sxXTsgdysrKSB7CiAgICAgICAgICAgIHdPZmZzZXQgPSB3KndpbmRvd0xlbmd0aFsxXTsKICAgICAgICAgICAgRkRLYWFjRW5jX0NhbGNCYW5kTnJnTVNPcHQocHN5RGF0YVswXS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1swXSt3Km1heFNmYlswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjWzFdK3cqbWF4U2ZiWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZlsxXS0+c2ZiT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkFjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5TVNbMF0rdyptYXhTZmJbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneU1TWzFdK3cqbWF4U2ZiWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwc3lTdGF0aWNbMV0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJFbmVyZ3lNU0xkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5zZmJFbmVyZ3lNU0xkRGF0YSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIGdyb3VwIHNob3J0IGRhdGEgKG1heFNmYltjaF0gZm9yIHNob3J0IGJsb2NrcyBpcyBkZXRlcm1pbmVkIGhlcmUpICovCiAgICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKQogICAgewogICAgICAgIElOVCBub1NmYiwgaTsKICAgICAgICBpZihpc1Nob3J0V2luZG93W2NoXSkKICAgICAgICB7CiAgICAgICAgICAgIGludCBzZmJHcnA7CiAgICAgICAgICAgIG5vU2ZiID0gcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMgKiBoUHN5Q29uZlNob3J0LT5zZmJDbnQ7CiAgICAgICAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzIGFyZSBjb3BpZWQvcmVncm91cGVkIGZyb20gdGhlICIuU2hvcnQiIHRvIHRoZSAiLkxvbmciIGFycmF5cyAqLwogICAgICAgICAgICBGREthYWNFbmNfZ3JvdXBTaG9ydERhdGEoIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0tPnNmYlRocmVzaG9sZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLT5zZmJFbmVyZ3lNUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS0+c2ZiU3ByZWFkRW5lcmd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk1pblNuckxkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5ncm91cGVkU2ZiT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNmYlBlckdyb3VwW2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMV0uZ3JhbnVsZUxlbmd0aCk7CgoKICAgICAgICAgICAgLyogY2FsY3VsYXRlIGxkRGF0YSBhcnJheXMgKHNob3J0IHZhbHVlcyBhcmUgaW4gLkxvbmctYXJyYXlzIGFmdGVyIEZES2FhY0VuY19ncm91cFNob3J0RGF0YSkgKi8KICAgICAgICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBub1NmYjsgc2ZiR3JwICs9IGhQc3lDb25mU2hvcnQtPnNmYkNudCkgewogICAgICAgICAgICAgIExkRGF0YVZlY3RvcigmcHN5RGF0YVtjaF0tPnNmYkVuZXJneS5Mb25nW3NmYkdycF0sICZwc3lPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycF0sIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBjYWxjIHNmYlRocmxkIGFuZCBzZXQgVmFsdWVzIHNtYWxsZXIgMl4tMzEgdG8gMl4tMzMqLwogICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IG5vU2ZiOyBzZmJHcnAgKz0gaFBzeUNvbmZTaG9ydC0+c2ZiQ250KSB7CiAgICAgICAgICAgICAgTGREYXRhVmVjdG9yKCZwc3lEYXRhW2NoXS0+c2ZiVGhyZXNob2xkLkxvbmdbc2ZiR3JwXSwgJnBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwXSwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSk7CiAgICAgICAgICAgICAgZm9yIChzZmI9MDtzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTtzZmIrKykgewogICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeE1heChwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdLCBGTDJGWENPTlNUX0RCTCgtMC41MTU2MjVmKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGNoYW5uZWxzPT0yICkgewogICAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgbm9TZmI7IHNmYkdycCArPSBoUHN5Q29uZlNob3J0LT5zZmJDbnQpIHsKICAgICAgICAgICAgICAgIExkRGF0YVZlY3RvcigmcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TLkxvbmdbc2ZiR3JwXSwgJnBzeURhdGFbY2hdLT5zZmJFbmVyZ3lNU0xkRGF0YVtzZmJHcnBdLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+c2ZiT2Zmc2V0cywgcHN5RGF0YVtjaF0tPmdyb3VwZWRTZmJPZmZzZXQsIChNQVhfR1JPVVBFRF9TRkIrMSkqc2l6ZW9mKElOVCkpOwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBtYXhTZmJbY2hdIGZvciBsb25nIGJsb2NrcyAqLwogICAgICAgICAgICBmb3IgKHNmYiA9IHBzeURhdGFbY2hdLT5zZmJBY3RpdmUtMTsgc2ZiID49IDA7IHNmYi0tKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxpbmUgPSBoUHN5Q29uZkxvbmctPnNmYk9mZnNldFtzZmIrMV0tMTsgbGluZSA+PSBoUHN5Q29uZkxvbmctPnNmYk9mZnNldFtzZmJdOyBsaW5lLS0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAocHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtsaW5lXSAhPSBGTDJGWENPTlNUX1NHTCgwLjBmKSkgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobGluZSA+IGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0W3NmYl0pIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1heFNmYlBlckdyb3VwW2NoXSA9IHNmYiArIDE7CiAgICAgICAgICAgIC8qIGVuc3VyZSBhdCBsZWFzdCBvbmUgc2VjdGlvbiBpbiBJQ1M7IHdvcmthcm91bmQgZm9yIGV4aXN0aW5nIGRlY29kZXIgY3JjIGltcGxlbWVudGF0aW9uICovCiAgICAgICAgICAgIG1heFNmYlBlckdyb3VwW2NoXSA9IGZpeE1heChmaXhNaW4oNSxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKSxtYXhTZmJQZXJHcm91cFtjaF0pOwoKICAgICAgICAgICAgLyogc2ZiTnJnTGREYXRhIGlzIGNhbGN1bGF0ZWQgaW4gRkRLYWFjRW5jX2FkdmFuY2VQc3ljaExvbmcsIGNvcHkgaW4gcHN5T3V0IHN0cnVjdHVyZSAqLwogICAgICAgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YSwgcHN5RGF0YVtjaF0tPnNmYkVuZXJneUxkRGF0YS5Mb25nLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKnNpemVvZihGSVhQX0RCTCkpOwoKICAgICAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJPZmZzZXRzLCBoUHN5Q29uZkxvbmctPnNmYk9mZnNldCwgKE1BWF9HUk9VUEVEX1NGQisxKSpzaXplb2YoSU5UKSk7CgogICAgICAgICAgICAvKiBzZmJNaW5TbnJMZERhdGEgbW9kaWZpZWQgaW4gYWRqdXN0IHRocmVzaG9sZCwgY29weSBuZWNlc3NhcnkgKi8KICAgICAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGEsIGhQc3lDb25mTG9uZy0+c2ZiTWluU25yTGREYXRhLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKnNpemVvZihGSVhQX0RCTCkpOwoKICAgICAgICAgICAgLyogc2ZiRW5lcmd5TVNMZERhdGEgaXN0IGFscmVhZHkgY2FsY3VsYXRlZCBpbiBGREthYWNFbmNfQ2FsY0JhbmROcmdNU09wdDsgb25seSBpbiBsb25nIGNhc2UgKi8KCiAgICAgICAgICAgIC8qIGNhbGMgc2ZiVGhybGQgYW5kIHNldCBWYWx1ZXMgc21hbGxlciAyXi0zMSB0byAyXi0zMyovCiAgICAgICAgICAgIExkRGF0YVZlY3Rvcihwc3lEYXRhW2NoXS0+c2ZiVGhyZXNob2xkLkxvbmcsIHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGEsIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOwogICAgICAgICAgICBmb3IgKGk9MDtpPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7aSsrKSB7CiAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtpXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeE1heChwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhW2ldLCBGTDJGWENPTlNUX0RCTCgtMC41MTU2MjVmKSk7CiAgICAgICAgICAgIH0KCgogICAgICAgIH0KCgogICAgfQoKCiAgICAvKgogICAgICAgIEludGVuc2l0eSBwYXJhbWV0ZXIgaW50aWFsaXphdGlvbi4KICAgICAqLwogICAgZm9yKGNoPTA7Y2g8Y2hhbm5lbHM7Y2grKykgewogICAgICAgIEZES21lbWNsZWFyKHBzeU91dENoYW5uZWxbY2hdLT5pc0Jvb2ssICBNQVhfR1JPVVBFRF9TRkIqc2l6ZW9mKElOVCkpOwogICAgICAgIEZES21lbWNsZWFyKHBzeU91dENoYW5uZWxbY2hdLT5pc1NjYWxlLCBNQVhfR1JPVVBFRF9TRkIqc2l6ZW9mKElOVCkpOwogICAgfQoKICAgIGZvcihjaD0wO2NoPGNoYW5uZWxzO2NoKyspIHsKICAgICAgICBJTlQgd2luID0gKGlzU2hvcnRXaW5kb3dbY2hdPzE6MCk7CiAgICAgICAgaWYgKCFwc3lTdGF0aWNbY2hdLT5pc0xGRSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIFBOUyBEZWNpc2lvbiAqLwogICAgICAgICAgICBGREthYWNFbmNfUG5zRGV0ZWN0KCAmKHBzeUNvbmZbMF0ucG5zQ29uZiksCiAgICAgICAgICAgICAgICAgICAgICAgcG5zRGF0YVtjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwW2NoXSwgLyogY291bnQgb2YgU2ZiIHdoaWNoIGFyZSBub3QgemVyby4gKi8KICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhLAogICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbd2luXS5zZmJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSwKICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiTWF4U2NhbGVTcGVjLkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgc2ZiVG9uYWxpdHlbY2hdLAogICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT50bnNJbmZvLm9yZGVyWzBdWzBdLAogICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnByZWRpY3Rpb25HYWluLAogICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhLAogICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5ub2lzZU5yZyApOwogICAgICAgIH0gLyogIWlzTEZFICovCiAgICB9CgogICAgLyoKICAgICAgICBzdGVyZW8gUHJvY2Vzc2luZwogICAgKi8KICAgIGlmKGNoYW5uZWxzID09IDIpCiAgICB7CiAgICAgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0ID0gTVNfTk9ORTsKICAgICAgICBwc3lPdXRFbGVtZW50LT5jb21tb25XaW5kb3cgICAgICAgPSBjb21tb25XaW5kb3c7CiAgICAgICAgaWYgKHBzeU91dEVsZW1lbnQtPmNvbW1vbldpbmRvdykKICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbMF0gPSBtYXhTZmJQZXJHcm91cFsxXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeE1heChtYXhTZmJQZXJHcm91cFswXSwgbWF4U2ZiUGVyR3JvdXBbMV0pOwoKICAgICAgICBpZihwc3lTdGF0aWNbMF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQogICAgICAgIHsKICAgICAgICAgICAgLyogUE5TIHByZXByb2Nlc3NpbmcgZGVwZW5kaW5nIG9uIG1zIHByb2Nlc3Npbmc6IFBOUyBub3QgaW4gU2hvcnQgV2luZG93ISAqLwogICAgICAgICAgICBGREthYWNFbmNfUHJlUHJvY2Vzc1Buc0NoYW5uZWxQYWlyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkFjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJnBzeURhdGFbMF0tPnNmYkVuZXJneSktPkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCZwc3lEYXRhWzFdLT5zZmJFbmVyZ3kpLT5Mb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMF0tPnNmYkVuZXJneUxkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5zZmJFbmVyZ3lMZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiRW5lcmd5TVMuTG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBzeUNvbmZbMF0ucG5zQ29uZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5zRGF0YVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbnNEYXRhWzFdKTsKCiAgICAgICAgICAgIEZES2FhY0VuY19JbnRlbnNpdHlTdGVyZW9Qcm9jZXNzaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkVuZXJneS5Mb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPnNmYkVuZXJneS5Mb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPm1kY3RTcGVjdHJ1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5tZGN0U3BlY3RydW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiVGhyZXNob2xkLkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+c2ZiVGhyZXNob2xkLkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+c2ZiVGhyZXNob2xkTGREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYlNwcmVhZEVuZXJneS5Mb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPnNmYlNwcmVhZEVuZXJneS5Mb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMF0tPnNmYkVuZXJneUxkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5zZmJFbmVyZ3lMZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMF0uc2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMF0uc2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMF0uc2ZiT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMF0uYWxsb3dJUyAmJiBjb21tb25XaW5kb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+aXNCb29rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPmlzU2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5zRGF0YSk7CgogICAgICAgICAgICBGREthYWNFbmNfTXNTdGVyZW9Qcm9jZXNzaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5pc0Jvb2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkFjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJBY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiT2Zmc2V0cyk7CgogICAgICAgICAgICAvKiBQTlMgcG9zdHByb2Nlc3NpbmcgKi8KICAgICAgICAgICAgRkRLYWFjRW5jX1Bvc3RQcm9jZXNzUG5zQ2hhbm5lbFBhaXIocHN5RGF0YVswXS0+c2ZiQWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocHN5Q29uZlswXS5wbnNDb25mKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbnNEYXRhWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuc0RhdGFbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0KTsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgRkRLYWFjRW5jX0ludGVuc2l0eVN0ZXJlb1Byb2Nlc3NpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiRW5lcmd5LkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+c2ZiRW5lcmd5LkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+bWRjdFNwZWN0cnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPm1kY3RTcGVjdHJ1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJUaHJlc2hvbGQuTG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5zZmJUaHJlc2hvbGQuTG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5zZmJUaHJlc2hvbGRMZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiU3ByZWFkRW5lcmd5LkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+c2ZiU3ByZWFkRW5lcmd5LkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiRW5lcmd5TGREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPnNmYkVuZXJneUxkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljWzBdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcypoUHN5Q29uZlNob3J0LT5zZmJDbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZlsxXS5zZmJDbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+Z3JvdXBlZFNmYk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mWzBdLmFsbG93SVMgJiYgY29tbW9uV2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPmlzQm9vaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5pc1NjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuc0RhdGEpOwoKICAgICAgICAgICAgLyogaXQncyBPSyB0byBwYXNzIHRoZSAiLkxvbmciIGFycmF5cyBoZXJlLiBUaGV5IGNvbnRhaW4gZ3JvdXBlZCBzaG9ydCBkYXRhIHNpbmNlIEZES2FhY0VuY19ncm91cFNob3J0RGF0YSgpICovCiAgICAgICAgICAgIEZES2FhY0VuY19Nc1N0ZXJlb1Byb2Nlc3NpbmcoIHBzeURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5pc0Jvb2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1swXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMqaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzBdLT5zZmJPZmZzZXRzKTsKICAgICAgICB9CiAgICB9CgogIC8qCiAgICBQTlMgQ29kaW5nCiAgKi8KICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKSB7CiAgICAgIGlmIChwc3lTdGF0aWNbY2hdLT5pc0xGRSkgewogICAgICAgICAgLyogbm8gUE5TIGNvZGluZyAqLwogICAgICAgICAgZm9yKHNmYiA9IDA7IHNmYiA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7CiAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5ub2lzZU5yZ1tzZmJdID0gTk9fTk9JU0VfUE5TOwogICAgICAgICAgfQogICAgICB9IGVsc2UKICAgICAgewogICAgICAgICAgRkRLYWFjRW5jX0NvZGVQbnNDaGFubmVsKHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAmKHBzeUNvbmZbY2hdLnBuc0NvbmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgcG5zRGF0YVtjaF0tPnBuc0ZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TGREYXRhLkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bm9pc2VOcmcsIC8qIHRoaXMgaXMgdGhlIGVuZXJneSB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgYml0c3RyZWFtICovCiAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhKTsKICAgICAgfQogIH0KCiAgICAvKgogICAgICAgIGJ1aWxkIG91dHB1dAogICAgKi8KICAgIGZvcihjaD0wO2NoPGNoYW5uZWxzO2NoKyspCiAgICB7CiAgICAgICAgSU5UIGosIGdycCwgbWFzazsKCiAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwICAgID0gbWF4U2ZiUGVyR3JvdXBbY2hdOwogICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5tZGN0U2NhbGUgICAgICAgICA9IHBzeURhdGFbY2hdLT5tZGN0U2NhbGU7CgogICAgICAgIGlmKGlzU2hvcnRXaW5kb3dbY2hdPT0wKSB7CgogICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250ICAgICAgICAgPSBoUHN5Q29uZkxvbmctPnNmYkFjdGl2ZTsKICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwICAgID0gaFBzeUNvbmZMb25nLT5zZmJBY3RpdmU7CiAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgPSBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlOwogICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+d2luZG93U2hhcGUgICAgPSBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2hhcGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBJTlQgc2ZiQ250ID0gcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMqaFBzeUNvbmZTaG9ydC0+c2ZiQ250OwoKICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudCAgICAgICAgID0gc2ZiQ250OwogICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXAgICAgPSBoUHN5Q29uZlNob3J0LT5zZmJDbnQ7CiAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7CiAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT53aW5kb3dTaGFwZSAgICA9IFNJTkVfV0lORE9XOwogICAgICAgIH0KCiAgICAgICAgLyogZ2VuZXJhdGUgZ3JvdXBpbmcgbWFzayAqLwogICAgICAgIG1hc2sgPSAwOwogICAgICAgIGZvciAoZ3JwID0gMDsgZ3JwIDwgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHM7IGdycCsrKQogICAgICAgIHsKICAgICAgICAgIG1hc2sgPDw9IDE7CiAgICAgICAgICBmb3IgKGo9MTsgajxwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wuZ3JvdXBMZW5bZ3JwXTsgaisrKSB7CiAgICAgICAgICAgICAgbWFzayA9IChtYXNrPDwxKSB8IDEgOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+Z3JvdXBpbmdNYXNrID0gbWFzazsKCiAgICAgICAgLyogYnVpbGQgaW50ZXJmYWNlICovCiAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5ncm91cExlbixwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wuZ3JvdXBMZW4sTUFYX05PX09GX0dST1VQUypzaXplb2YoSU5UKSk7CiAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3ksKCZwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5KS0+TG9uZywgTUFYX0dST1VQRURfU0ZCKnNpemVvZihGSVhQX0RCTCkpOwogICAgICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+c2ZiU3ByZWFkRW5lcmd5LCgmcHN5RGF0YVtjaF0tPnNmYlNwcmVhZEVuZXJneSktPkxvbmcsIE1BWF9HUk9VUEVEX1NGQipzaXplb2YoRklYUF9EQkwpKTsKLy8gICAgICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+bWRjdFNwZWN0cnVtLCBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtLCAoMTAyNCkqc2l6ZW9mKEZJWFBfREJMKSk7CiAgICB9CgogICAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0KCgp2b2lkIEZES2FhY0VuY19Qc3lDbG9zZShQU1lfSU5URVJOQUwgICAqKnBoUHN5SW50ZXJuYWwsCiAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQgICAgICAgICoqcGhQc3lPdXQpCnsKICAgIGludCBuLCBpOwoKCiAgICBpZihwaFBzeUludGVybmFsIT1OVUxMKSB7CiAgICAgIFBTWV9JTlRFUk5BTCAqaFBzeUludGVybmFsID0gKnBoUHN5SW50ZXJuYWw7CgogICAgICBpZiAoaFBzeUludGVybmFsKQogICAgICB7CiAgICAgICAgZm9yIChpPTA7IGk8KDYpOyBpKyspIHsKICAgICAgICAgIGlmIChoUHN5SW50ZXJuYWwtPnBTdGF0aWNDaGFubmVsc1tpXSkgewogICAgICAgICAgICBpZiAoaFBzeUludGVybmFsLT5wU3RhdGljQ2hhbm5lbHNbaV0tPnBzeUlucHV0QnVmZmVyKQogICAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyKCZoUHN5SW50ZXJuYWwtPnBTdGF0aWNDaGFubmVsc1tpXS0+cHN5SW5wdXRCdWZmZXIpOyAgLyogQVVESU8gSU5QVVQgQlVGRkVSICovCgogICAgICAgICAgICBGcmVlUmFtX2FhY0VuY19Qc3lTdGF0aWMoJmhQc3lJbnRlcm5hbC0+cFN0YXRpY0NoYW5uZWxzW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFNZX1NUQVRJQyAqLwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIChpPTA7IGk8KDYpOyBpKyspIHsKICAgICAgICAgIGlmIChoUHN5SW50ZXJuYWwtPnBzeUVsZW1lbnRbaV0pCiAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeUVsZW1lbnQoJmhQc3lJbnRlcm5hbC0+cHN5RWxlbWVudFtpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQU1lfRUxFTUVOVCAqLwogICAgICAgIH0KCgogICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeUludGVybmFsKHBoUHN5SW50ZXJuYWwpOwogICAgICB9CiAgICB9CgogICAgaWYgKHBoUHN5T3V0IT1OVUxMKSB7CiAgICAgIGZvciAobj0wOyBuPCgxKTsgbisrKSB7CiAgICAgICAgaWYgKHBoUHN5T3V0W25dKQogICAgICAgIHsKICAgICAgICAgIGZvciAoaT0wOyBpPCg2KTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwaFBzeU91dFtuXS0+cFBzeU91dENoYW5uZWxzW2ldKQogICAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeU91dENoYW5uZWwoJnBoUHN5T3V0W25dLT5wUHN5T3V0Q2hhbm5lbHNbaV0pOyAgICAgICAgICAgICAgICAgIC8qIFBTWV9PVVRfQ0hBTk5FTCAqLwogICAgICAgICAgfQoKICAgICAgICAgIGZvciAoaT0wOyBpPCg2KTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwaFBzeU91dFtuXS0+cHN5T3V0RWxlbWVudFtpXSkKICAgICAgICAgICAgICBGcmVlUmFtX2FhY0VuY19Qc3lPdXRFbGVtZW50cygmcGhQc3lPdXRbbl0tPnBzeU91dEVsZW1lbnRbaV0pOyAgICAgICAgICAgICAgICAgICAvKiBQU1lfT1VUX0VMRU1FTlRTICovCiAgICAgICAgICB9CgogICAgICAgICAgRnJlZVJhbV9hYWNFbmNfUHN5T3V0KCZwaFBzeU91dFtuXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9Cn0K