Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgogICAgY29udGVudHMvZGVzY3JpcHRpb246IFRocmVzaG9sZCBjb21wZW5zYXRpb24KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJjb21tb25fZml4LmgiCgojaW5jbHVkZSAiYWRqX3Rocl9kYXRhLmgiCiNpbmNsdWRlICJhZGpfdGhyLmgiCiNpbmNsdWRlICJxY19kYXRhLmgiCiNpbmNsdWRlICJzZl9lc3RpbS5oIgojaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgoKCgoKI2RlZmluZSBJTlZfSU5UX1RBQl9TSVpFICAoOCkKc3RhdGljIGNvbnN0IEZJWFBfREJMIGludkludFtJTlZfSU5UX1RBQl9TSVpFXSA9CnsKICAweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDQwMDAwMDAwLCAweDJhYWFhYWFhLCAweDIwMDAwMDAwLCAweDE5OTk5OTk5LCAweDE1NTU1NTU1LCAweDEyNDkyNDkyCn07CgoKI2RlZmluZSBJTlZfU1FSVDRfVEFCX1NJWkUgICg4KQpzdGF0aWMgY29uc3QgRklYUF9EQkwgaW52U3FydDRbSU5WX1NRUlQ0X1RBQl9TSVpFXSA9CnsKICAweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDZiYTI3ZTY1LCAweDYxNDI0YmI1LCAweDVhODI3OTk5LCAweDU1OTk0ODQ1LCAweDUxYzhlMzNjLCAweDRlYjE2MGQxCn07CgoKLypzdGF0aWMgY29uc3QgSU5UICAgICAgaW52UmVkRXhwID0gNDsqLwpzdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkTWluMSA9IChGSVhQX0RCTCkweGZjYWQwZGRmOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygwLjMxNikvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLwpzdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkTWluMiA9IChGSVhQX0RCTCkweDAzNTFlMWEyOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygzLjE2KSAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLwpzdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkRmFjICA9IChGSVhQX0RCTCkweGZmNWIyYzNlOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygwLjgpICAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLwoKc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjMgPSAoRklYUF9EQkwpMHhmZTAwMDAwMDsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMC41KSAgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8Kc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjQgPSAoRklYUF9EQkwpMHgwMjAwMDAwMDsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMi4wKSAgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8Kc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjUgPSAoRklYUF9EQkwpMHhmYzAwMDAwMDsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMC4yNSkgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8KCgovKgpUaGUgYml0czJQZSBmYWN0b3JzIGFyZSBjaG9vc2VuIGZvciB0aGUgY2FzZSB0aGF0IHNvbWUgdGltZXMKdGhlIGNyYXNoIHJlY292ZXJ5IHN0cmF0ZWd5IHdpbGwgYmUgYWN0aXZhdGVkIG9uY2UuCiovCgp0eXBlZGVmIHN0cnVjdCB7CiAgSU5UICAgICAgICAgICAgICAgICBiaXRyYXRlOwogIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tb25vOwogIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tb25vX3Nsb3BlOwogIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9zdGVyZW87CiAgVUxPTkcgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX3N0ZXJlb19zbG9wZTsKICBVTE9ORyAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfbW9ub19zY2ZPcHQ7CiAgVUxPTkcgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0X3Nsb3BlOwogIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9zdGVyZW9fc2NmT3B0OwogIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9zdGVyZW9fc2NmT3B0X3Nsb3BlOwoKfSBCSVRfUEVfU0ZBQzsKCnR5cGVkZWYgc3RydWN0IHsKICBjb25zdCBJTlQgICAgICAgICAgIHNhbXBsZVJhdGU7CiAgY29uc3QgQklUX1BFX1NGQUMgKiBwUGVUYWI7CiAgY29uc3QgSU5UICAgICAgICAgICBuRW50cmllczsKCn0gQklUUzJQRV9DRkdfVEFCOwoKc3RhdGljIGNvbnN0IEJJVF9QRV9TRkFDIFNfQml0czJQZVRhYjE2MDAwW10gPSB7CiAgeyAxMDAwMCwgMHgyMjhGNUMyOSwgMHgwMkZFRjU1RCwgMHgxRDcwQTNENywgMHgwOUJDOUQ2RCwgMHgyMjhGNUMyOSwgMHgwMkZFRjU1RCwgMHgxQzI4RjVDMywgMHgwQ0JCOTJDQX0sCiAgeyAyNDAwMCwgMHgyM0Q3MEEzRCwgMHgwMjlGMTZCMSwgMHgyMTk5OTk5QSwgMHgwN0RENDQxMywgMHgyM0Q3MEEzRCwgMHgwMjlGMTZCMSwgMHgyMTk5OTk5QSwgMHgwN0RENDQxM30sCiAgeyAzMjAwMCwgMHgyNDdBRTE0OCwgMHgxMUIxRDkyQiwgMHgyMzg1MUVCOCwgMHgwMUY3NTEwNSwgMHgyNDdBRTE0OCwgMHgxMTBBMTM3RiwgMHgyMzg1MUVCOCwgMHgwMUY3NTEwNX0sCiAgeyA0ODAwMCwgMHgyRDFFQjg1MiwgMHg2ODMzQzYwMCwgMHgyNDdBRTE0OCwgMHgwMTRGOEI1OSwgMHgyQ0NDQ0NDRCwgMHg2OERCOEJBQywgMHgyNDdBRTE0OCwgMHgwMUY3NTEwNX0sCiAgeyA2NDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNTFFQjg1MiwgMHgwMTQ4MDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNTcwQTNENywgMHgwMTQ4MDAwMH0sCiAgeyA5NjAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNjAwMDAwMCwgMHgwMTAwMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNjAwMDAwMCwgMHgwMTAwMDAwMH0sCiAgezEyODAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNzBhM2Q4MCwgMHgwMTAwMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNzBhM2Q4MCwgMHgwMTAwMDAwMH0sCiAgezE0ODAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyODAwMDAwMCwgMHgwMDAwMDAwMH0KfTsKCnN0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWIyMjA1MFtdID0gewogIHsgMTYwMDAsIDB4MWE4ZjVjMjksIDB4MTc5N2NjM2EsIDB4MTI4ZjVjMjksIDB4MThlNzU3OTMsIDB4MTc1YzI4ZjYsIDB4MjIxNDI2ZmUsIDB4MDAwMDAwMDAsIDB4NWE3MDhlZGV9LAogIHsgMjQwMDAsIDB4MjA1MWViODUsIDB4MDkyY2NmNmMsIDB4MThhM2Q3MGEsIDB4MTNhOTJhMzAsIDB4MWZhZTE0N2IsIDB4YmNiZTYxZCwgIDB4MTYxNDdhZTEsIDB4MThlNzU3OTN9LAogIHsgMzIwMDAsIDB4MjI4ZjVjMjksIDB4MDI5ZjE2YjEsIDB4MWQ3MGEzZDcsIDB4MDg4NTA5YzAsIDB4MjI4ZjVjMjksIDB4MjlmMTZiMSwgIDB4MWMyOGY1YzMsIDB4MGIyNDIwNzF9LAogIHsgNDgwMDAsIDB4MjNkNzBhM2QsIDB4MDE0ZjhiNTksIDB4MjE5OTk5OWEsIDB4MDNlZWEyMGEsIDB4MjNkNzBhM2QsIDB4MTRmOGI1OSwgIDB4MjE5OTk5OWEsIDB4MDNlZWEyMGF9LAogIHsgNjQwMDAsIDB4MjQ3YWUxNDgsIDB4MDhkOGVjOTYsIDB4MjM4NTFlYjgsIDB4MDBmYmE4ODIsIDB4MjQ3YWUxNDgsIDB4ODg1MDljMCwgIDB4MjM4NTFlYjgsIDB4MDBmYmE4ODJ9LAogIHsgOTYwMDAsIDB4MmQxZWI4NTIsIDB4MzQxOWUzMDAsIDB4MjQ3YWUxNDgsIDB4MDBhN2M1YWMsIDB4MmNjY2NjY2QsIDB4MzQ2ZGM1ZDYsIDB4MjQ3YWUxNDgsIDB4MDBmYmE4ODJ9LAogIHsxMjgwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjUxZWI4NTIsIDB4MDI5ZjE2YjEsIDB4NjAwMDAwMDAsIDB4MjVjMjhmNDAsIDB4MjU3MGEzZDcsIDB4MDA5ZjE2YjF9LAogIHsxNDgwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjZiODUxZWMsIDB4MDAwMDAwMDAsIDB4NjAwMDAwMDAsIDB4MjVjMjhmNDAsIDB4MjcwYTNkNzEsIDB4MDAwMDAwMDB9Cn07CgpzdGF0aWMgY29uc3QgQklUX1BFX1NGQUMgU19CaXRzMlBlVGFiMjQwMDBbXSA9IHsKICB7IDE2MDAwLCAweDE5ZWI4NTFmLCAweDEzYTkyYTMwLCAweDExNDdhZTE0LCAweDE2NDg0MGUxLCAweDE5OTk5OTlhLCAweDEyNTk5ZWQ4LCAweDAwMDAwMDAwLCAweDQ2Yzc2NGFlfSwKICB7IDI0MDAwLCAweDFlYjg1MWVjLCAweDBkMWI3MTc2LCAweDE2Yjg1MWVjLCAweDE4ZTc1NzkzLCAweDFlMTQ3YWUxLCAweDBmYmE4ODI3LCAweDExNDdhZTE0LCAweDJjOTA4MWMzfSwKICB7IDMyMDAwLCAweDIxZWI4NTFmLCAweDA0OTY2N2I2LCAweDFjY2NjY2NkLCAweDA3MzU3ZTY3LCAweDIxZWI4NTFmLCAweDAzZWVhMjBhLCAweDFjMjhmNWMzLCAweDA3MzU3ZTY3fSwKICB7IDQ4MDAwLCAweDI0MjhmNWMzLCAweDAxNGY4YjU5LCAweDIwNTFlYjg1LCAweDA1M2UyZDYyLCAweDIzZDcwYTNkLCAweDAxZjc1MTA1LCAweDFmYWUxNDdiLCAweDA3MzU3ZTY3fSwKICB7IDY0MDAwLCAweDI0Y2NjY2NkLCAweDA1ZTVmMzBlLCAweDIyZTE0N2FlLCAweDAxYTM2ZTJmLCAweDI0Y2NjY2NkLCAweDA1ZTVmMzBlLCAweDIzMzMzMzMzLCAweDAxNGY4YjU5fSwKICB7IDk2MDAwLCAweDJhOGY1YzI5LCAweDI0YjMzZGIwLCAweDI0N2FlMTQ4LCAweDAwZmJhODgyLCAweDJhOGY1YzI5LCAweDI2ZmU3MThiLCAweDI0N2FlMTQ4LCAweDAwZmJhODgyfSwKICB7MTI4MDAwLCAweDRlNjY2NjY2LCAweDFjZDVmOTljLCAweDI1NzBhM2Q3LCAweDAxMGM2ZjdhLCAweDUwYTNkNzBhLCAweDE5MmE3MzcxLCAweDI1NzBhM2Q3LCAweDAxMGM2ZjdhfSwKICB7MTQ4MDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI2MTQ3YWUxLCAweDAwMDAwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI2MTQ3YWUxLCAweDAwMDAwMDAwfQp9OwoKc3RhdGljIGNvbnN0IEJJVF9QRV9TRkFDIFNfQml0czJQZVRhYjMyMDAwW10gPSB7CiAgeyAxNjAwMCwgMHgyNDdhZTE0MCwgMHhGRkZGQUMxRSwgMHgyNzBhM2Q4MCwgMHhGRkZFOUI3QywgMHgxNGNjY2NjMCwgMHgwMDAxMTBBMSwgMHgxNWMyOGY2MCwgMHhGRkZFRUY1Rn0sCiAgeyAyNDAwMCwgMHgyMzMzMzM0MCwgMHgwZmJhODgyNywgMHgyMTk5OTk4MCwgMHgxYjg2NmU0NCwgMHgxOGY1YzI4MCwgMHgwZmJhODgyNywgMHgxMTk5OTlhMCwgMHg0ZDU1MWQ2OX0sCiAgeyAzMjAwMCwgMHgxZDcwYTNkNywgMHgwNzM1N2U2NywgMHgxN2FlMTQ3YiwgMHgwOWQ0OTUxOCwgMHgxYjg1MWViOCwgMHgwYTdjNWFjNCwgMHgxMmUxNDdhZSwgMHgxMTBhMTM3Zn0sCiAgeyA0ODAwMCwgMHgyMGY1YzI4ZiwgMHgwNDk2NjdiNiwgMHgxYzdhZTE0OCwgMHgwNTNlMmQ2MiwgMHgyMGEzZDcwYSwgMHgwNTNlMmQ2MiwgMHgxYjMzMzMzMywgMHgwNWU1ZjMwZX0sCiAgeyA2NDAwMCwgMHgyMzMzMzMzMywgMHgwMjlmMTZiMSwgMHgxZjBhM2Q3MSwgMHgwMmYyZjk4NywgMHgyMzMzMzMzMywgMHgwMjlmMTZiMSwgMHgxZTE0N2FlMSwgMHgwM2VlYTIwYX0sCiAgeyA5NjAwMCwgMHgyNWMyOGY1YywgMHgyYzNjOWVlZCwgMHgyMWViODUxZiwgMHgwMWY3NTEwNSwgMHgyNWMyOGY1YywgMHgwYTdjNWFjNCwgMHgyMWViODUxZiwgMHgwMWEzNmUyZn0sCiAgezEyODAwMCwgMHg1MGY1YzI4ZiwgMHgxOGE0M2JiNCwgMHgyM2Q3MGEzZCwgMHgwMTBjNmY3YSwgMHgzMDAwMDAwMCwgMHgxNjhiNWNjMCwgMHgyMzg1MWViOCwgMHgwMTkyYTczN30sCiAgezE0ODAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNDdhZTE0OCwgMHgwMGRmYjIzYiwgMHgzZGMyOGY1YywgMHgzMDBmNGFhZiwgMHgyNDdhZTE0OCwgMHgwMWJmNjQ3Nn0sCiAgezE2MDAwMCwgMHgyNWMyOGY0MCwgMHhiMTViNTc0MCwgMHgyNGNjY2NjZCwgMHgwNTNlMmQ2MiwgMHg0ZjVjMjhmNiwgMHhiZWZkMDA3MiwgMHgyNTFlYjg1MiwgMHgwNGZiMTE4NH0sCiAgezIwMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyYjMzMzMzMywgMHgwODM2YmU5MSwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyYjMzMzMzMywgMHgwODkwMzkwZn0sCiAgezMyMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHg0OTQ3YWUxNCwgMHgwMDAwMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHg0YThmNWMyOSwgMHgwMDAwMDAwMH0KfTsKCnN0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWI0NDEwMFtdID0gewogIHsgMTYwMDAsIDB4MTBhM2Q3MGEsIDB4MTc5N2NjM2EsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NTkyMTAzODYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAogIHsgMjQwMDAsIDB4MTY2NjY2NjYsIDB4MTc5N2NjM2EsIDB4MDAwMDAwMDAsIDB4NjM5ZDVlNGEsIDB4MTVjMjhmNWMsIDB4MTI1OTllZDgsIDB4MDAwMDAwMDAsIDB4NWJjMDFhMzd9LAogIHsgMzIwMDAsIDB4MWMyOGY1YzMsIDB4MDQ5NjY3YjYsIDB4MTg1MWViODUsIDB4MDQ5NjY3YjYsIDB4MWEzZDcwYTQsIDB4MDg4NTA5YzAsIDB4MTY2NjY2NjYsIDB4MDUzZTJkNjJ9LAogIHsgNDgwMDAsIDB4MWU2NjY2NjYsIDB4MDVlNWYzMGUsIDB4MWE4ZjVjMjksIDB4MDQ5NjY3YjYsIDB4MWU2NjY2NjYsIDB4MDVlNWYzMGUsIDB4MThmNWMyOGYsIDB4MDVlNWYzMGV9LAogIHsgNjQwMDAsIDB4MjE0N2FlMTQsIDB4MDM0NmRjNWQsIDB4MWNjY2NjY2QsIDB4MDJmMmY5ODcsIDB4MjE0N2FlMTQsIDB4MDJmMmY5ODcsIDB4MWJkNzBhM2QsIDB4MDM5YWJmMzR9LAogIHsgOTYwMDAsIDB4MjQ3YWUxNDgsIDB4MDY4ZGI4YmIsIDB4MWZhZTE0N2IsIDB4MDI5ZjE2YjEsIDB4MjQyOGY1YzMsIDB4MDYzOWQ1ZTUsIDB4MWY1YzI4ZjYsIDB4MDI5ZjE2YjF9LAogIHsxMjgwMDAsIDB4MmFlMTQ3YWUsIDB4MWI0MzUyNjUsIDB4MjIzZDcwYTQsIDB4MDE5MmE3MzcsIDB4MmEzZDcwYTQsIDB4MTA0MGJmZTQsIDB4MjFlYjg1MWYsIDB4MDE5MmE3Mzd9LAogIHsxNDgwMDAsIDB4M2I4NTFlYjgsIDB4MjgzMjA2OWMsIDB4MjMzMzMzMzMsIDB4MDBkZmIyM2IsIDB4MzQyOGY1YzMsIDB4MjA1NGMyODgsIDB4MjJlMTQ3YWUsIDB4MDBkZmIyM2J9LAogIHsxNjAwMDAsIDB4NGEzZDcwYTQsIDB4YzMyZWJlNWEsIDB4MjM4NTFlYjgsIDB4MDFkNWMzMTYsIDB4NDAwMDAwMDAsIDB4Y2I5MjNhMmIsIDB4MjMzMzMzMzMsIDB4MDFkNWMzMTZ9LAogIHsyMDAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjVjMjhmNWMsIDB4MDcxM2YwNzgsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjU3MGEzZDcsIDB4MDcyYTRmMTd9LAogIHszMjAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4M2ZhZTE0N2IsIDB4MDAwMDAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4M2ZhZTE0N2IsIDB4MDAwMDAwMDB9Cn07CgpzdGF0aWMgY29uc3QgQklUX1BFX1NGQUMgU19CaXRzMlBlVGFiNDgwMDBbXSA9IHsKICB7IDE2MDAwLCAweDBmNWMyOGY2LCAweDMxY2VhZjI1LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDc0YTc3MWM5LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKICB7IDI0MDAwLCAweDFiODUxZWI4LCAweDAyOWYxNmIxLCAweDAwMDAwMDAwLCAweDY2M2M3NGZiLCAweDFjN2FlMTQ4LCAweGU0Nzk5MWJkLCAweDAwMDAwMDAwLCAweDQ5NjY3YjVmfSwKICB7IDMyMDAwLCAweDFjMjhmNWMzLCAweDAyOWYxNmIxLCAweDE4ZjVjMjhmLCAweDA3MzU3ZTY3LCAweDE1YzI4ZjVjLCAweDBmMTJjMjdhLCAweDExZWI4NTFmLCAweDEzMDE2NDg0fSwKICB7IDQ4MDAwLCAweDFkNzBhM2Q3LCAweDA1M2UyZDYyLCAweDFjN2FlMTQ4LCAweGZlMDhhZWZjLCAweDFkMWViODUyLCAweDA2OGRiOGJiLCAweDFiMzMzMzMzLCAweGZlYjA3NGE4fSwKICB7IDY0MDAwLCAweDIwMDAwMDAwLCAweDAzZWVhMjBhLCAweDFiODUxZWI4LCAweDAzNDZkYzVkLCAweDIwNTFlYjg1LCAweDAzNDZkYzVkLCAweDFhOGY1YzI5LCAweDAzOWFiZjM0fSwKICB7IDk2MDAwLCAweDIzZDcwYTNkLCAweDA1M2UyZDYyLCAweDFlYjg1MWVjLCAweDAyOWYxNmIxLCAweDIzODUxZWI4LCAweDA0ZWE0YThjLCAweDFlMTQ3YWUxLCAweDAyZjJmOTg3fSwKICB7MTI4MDAwLCAweDI4ZjVjMjhmLCAweDE0NzI3ZGNjLCAweDIxNDdhZTE0LCAweDAyMThkZWY0LCAweDI4NTFlYjg1LCAweDBlMjdlMGYwLCAweDIwZjVjMjhmLCAweDAyMThkZWY0fSwKICB7MTQ4MDAwLCAweDM1NzBhM2Q3LCAweDFjZDVmOTljLCAweDIyOGY1YzI5LCAweDAxYmY2NDc2LCAweDMwZjVjMjhmLCAweDE4Nzc3ZTc1LCAweDIyM2Q3MGE0LCAweDAxYmY2NDc2fSwKICB7MTYwMDAwLCAweDQwMDAwMDAwLCAweGNiOTIzYTJiLCAweDIzMzMzMzMzLCAweDAxOTJhNzM3LCAweDM5ZWI4NTFmLCAweGQwOGQ0YmFlLCAweDIyZTE0N2FlLCAweDAxOTJhNzM3fSwKICB7MjAwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI1MWViODUyLCAweDA2Nzc1YTFiLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI0Y2NjY2NkLCAweDA2YTQxNzVhfSwKICB7MzIwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDNjY2NjY2NkLCAweDAwMDAwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDNkMWViODUyLCAweDAwMDAwMDAwfQp9OwoKc3RhdGljIGNvbnN0IEJJVFMyUEVfQ0ZHX1RBQiBiaXRzMlBlQ29uZmlnVGFiW10gPSB7CiAgeyAxNjAwMCwgU19CaXRzMlBlVGFiMTYwMDAsIHNpemVvZihTX0JpdHMyUGVUYWIxNjAwMCkvc2l6ZW9mKEJJVF9QRV9TRkFDKSB9LAogIHsgMjIwNTAsIFNfQml0czJQZVRhYjIyMDUwLCBzaXplb2YoU19CaXRzMlBlVGFiMjIwNTApL3NpemVvZihCSVRfUEVfU0ZBQykgfSwKICB7IDI0MDAwLCBTX0JpdHMyUGVUYWIyNDAwMCwgc2l6ZW9mKFNfQml0czJQZVRhYjI0MDAwKS9zaXplb2YoQklUX1BFX1NGQUMpIH0sCiAgeyAzMjAwMCwgU19CaXRzMlBlVGFiMzIwMDAsIHNpemVvZihTX0JpdHMyUGVUYWIzMjAwMCkvc2l6ZW9mKEJJVF9QRV9TRkFDKSB9LAogIHsgNDQxMDAsIFNfQml0czJQZVRhYjQ0MTAwLCBzaXplb2YoU19CaXRzMlBlVGFiNDQxMDApL3NpemVvZihCSVRfUEVfU0ZBQykgfSwKICB7IDQ4MDAwLCBTX0JpdHMyUGVUYWI0ODAwMCwgc2l6ZW9mKFNfQml0czJQZVRhYjQ4MDAwKS9zaXplb2YoQklUX1BFX1NGQUMpIH0KfTsKCgoKLyogdmFsdWVzIGZvciBhdm9pZCBob2xlIGZsYWcgKi8KZW51bSBfYXZvaWRfaG9sZV9zdGF0ZSB7CiAgICBOT19BSCAgICAgICAgICAgICAgPTAsCiAgICBBSF9JTkFDVElWRSAgICAgICAgPTEsCiAgICBBSF9BQ1RJVkUgICAgICAgICAgPTIKfTsKCgovKiAgUSBmb3JtYXQgZGVmaW5pdGlvbnMgKi8KI2RlZmluZSBRX0JJVEZBQyAgICAoMjQpICAgLyogUSBzY2FsaW5nIHVzZWQgaW4gRkRLYWFjRW5jX2JpdHJlc0NhbGNCaXRGYWMoKSBjYWxjdWxhdGlvbiAqLwojZGVmaW5lIFFfQVZHQklUUyAgICgxNykgICAvKiBzY2FsZSBiaXQgdmFsdWVzICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19Jbml0Qml0czJQZUZhY3RvcgogICAgZGVzY3JpcHRpb246ICByZXRyaWV2ZSBiaXRzMlBlRmFjdG9yIGZyb20gdGFibGUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIEZES2FhY0VuY19Jbml0Qml0czJQZUZhY3RvcigKICAgICAgICBGSVhQX0RCTCAqYml0czJQZUZhY3Rvcl9tLAogICAgICAgIElOVCAqYml0czJQZUZhY3Rvcl9lLAogICAgICAgIGNvbnN0IElOVCBiaXRSYXRlLAogICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsCiAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGUsCiAgICAgICAgY29uc3QgSU5UIGFkdmFuY2VkQml0c1RvUGUsCiAgICAgICAgY29uc3QgSU5UIGRab25lUXVhbnRFbmFibGUsCiAgICAgICAgY29uc3QgSU5UIGludlF1YW50CiAgICAgICAgKQp7CiAgLyogZGVmYXVsdCBiaXRzMnBlIGZhY3RvciAqLwogIEZJWFBfREJMIGJpdDJQRV9tID0gRkwyRlhDT05TVF9EQkwoMS4xOGYvKDE8PCgxKSkpOwogIElOVCAgICAgIGJpdDJQRV9lID0gMTsKCiAgLyogbWFrZSB1c2Ugb2YgYWR2YW5jZWQgYml0cyB0byBwZSBmYWN0b3IgdGFibGUgKi8KICBpZiAoYWR2YW5jZWRCaXRzVG9QZSkgewoKICAgIGludCBpOwogICAgY29uc3QgQklUX1BFX1NGQUMgKnBlVGFiID0gTlVMTDsKICAgIElOVCBzaXplID0gMDsKCgogICAgLyogR2V0IGNvcnJlY3QgdGFibGUgZW50cnkgKi8KICAgIGZvciAoaT0wOyBpPChJTlQpKHNpemVvZihiaXRzMlBlQ29uZmlnVGFiKS9zaXplb2YoQklUUzJQRV9DRkdfVEFCKSk7IGkrKykgewogICAgICBpZiAoc2FtcGxlUmF0ZSA+PSBiaXRzMlBlQ29uZmlnVGFiW2ldLnNhbXBsZVJhdGUpIHsKICAgICAgICBwZVRhYiA9IGJpdHMyUGVDb25maWdUYWJbaV0ucFBlVGFiOwogICAgICAgIHNpemUgID0gYml0czJQZUNvbmZpZ1RhYltpXS5uRW50cmllczsKICAgICAgfQogICAgfQoKICAgIGlmICggKHBlVGFiIT1OVUxMKSAmJiAoc2l6ZSE9MCkgKSB7CgogICAgICBJTlQgc3RhcnRCICAgICAgPSAtMTsKICAgICAgTE9ORyBzdGFydFBGICAgID0gMDsKICAgICAgTE9ORyBwZVNsb3BlICAgID0gMDsKCiAgICAgIC8qIHN0ZXJlbyBvciBtb25vIG1vZGUgYW5kIGludlF1YW50IHVzZWQgb3Igbm90ICovCiAgICAgIGZvciAoaT0wOyBpPHNpemUtMTsgaSsrKQogICAgICB7CiAgICAgICAgaWYgKChwZVRhYltpXS5iaXRyYXRlPD1iaXRSYXRlKSAmJiAoKHBlVGFiW2krMV0uYml0cmF0ZT5iaXRSYXRlKSB8fCAoKGk9PXNpemUtMikpICkpCiAgICAgICAgewogICAgICAgICAgaWYgKG5DaGFubmVscz09MSkKICAgICAgICAgIHsKICAgICAgICAgICAgc3RhcnRQRiA9ICghaW52UXVhbnQpID8gcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9tb25vICAgOiBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0OwogICAgICAgICAgICBwZVNsb3BlID0gKCFpbnZRdWFudCkgPyBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX21vbm9fc2xvcGUgOiBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0X3Nsb3BlOwogICAgICAgICAgICAvKmVuZFBGICAgPSAoIWludlF1YW50KSA/IHBlVGFiW2krMV0uYml0czJQZUZhY3Rvcl9tb25vIDogcGVUYWJbaSsxXS5iaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0OwogICAgICAgICAgICBlbmRCPXBlVGFiW2krMV0uYml0cmF0ZTsqLwogICAgICAgICAgICBzdGFydEI9cGVUYWJbaV0uYml0cmF0ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIHN0YXJ0UEYgPSAoIWludlF1YW50KSA/IHBlVGFiW2ldLmJpdHMyUGVGYWN0b3Jfc3RlcmVvICAgOiBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX3N0ZXJlb19zY2ZPcHQ7CiAgICAgICAgICAgIHBlU2xvcGUgPSAoIWludlF1YW50KSA/IHBlVGFiW2ldLmJpdHMyUGVGYWN0b3Jfc3RlcmVvX3Nsb3BlIDogcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9zdGVyZW9fc2NmT3B0X3Nsb3BlOwogICAgICAgICAgICAvKmVuZFBGICAgPSAoIWludlF1YW50KSA/IHBlVGFiW2krMV0uYml0czJQZUZhY3Rvcl9zdGVyZW8gOiBwZVRhYltpKzFdLmJpdHMyUGVGYWN0b3Jfc3RlcmVvX3NjZk9wdDsKICAgICAgICAgICAgZW5kQj1wZVRhYltpKzFdLmJpdHJhdGU7Ki8KICAgICAgICAgICAgc3RhcnRCPXBlVGFiW2ldLmJpdHJhdGU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSAvKiBmb3IgaSAqLwoKICAgICAgLyogaWYgYSBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZSAqLwogICAgICBpZiAoc3RhcnRCIT0tMSkgewogICAgICAgIC8qIGxpbmVhciBpbnRlcnBvbGF0ZSB0byBhY3R1YWwgUEVmYWN0b3IgKi8KICAgICAgICBGSVhQX0RCTCBwZUZhYyA9IGZNdWx0KChGSVhQX0RCTCkoYml0UmF0ZS1zdGFydEIpPDwxNCwgKEZJWFBfREJMKXBlU2xvcGUpIDw8IDI7CiAgICAgICAgRklYUF9EQkwgYml0MlBFID0gcGVGYWMgKyAoRklYUF9EQkwpc3RhcnRQRjsgLyogc3RhcnRQRl9mbG9hdCA9IHN0YXJ0UEYgPDwgMiAqLwoKICAgICAgICAvKiBzYW5pdHkgY2hlY2sgaWYgYml0czJwZSB2YWx1ZSBpcyBoaWdoIGVub3VnaCAqLwogICAgICAgIGlmICggYml0MlBFID49IChGTDJGWENPTlNUX0RCTCgwLjM1ZikgPj4gMikgKSB7CiAgICAgICAgICBiaXQyUEVfbSA9IGJpdDJQRTsKICAgICAgICAgIGJpdDJQRV9lID0gMjsgLyogIHRhYmxlIGlzIGZpeGVkIHNjYWxlZCAqLwogICAgICAgIH0KICAgICAgfSAvKiBiciAqLwogICAgfSAvKiBzciAqLwogIH0gLyogYWR2YW5jZWRCaXRzVG9QZSAqLwoKCiAgaWYgKGRab25lUXVhbnRFbmFibGUpCiAgewogICAgaWYoYml0MlBFX20gPj0gKEZMMkZYQ09OU1RfREJMKDAuNmYpKT4+Yml0MlBFX2UpCiAgICB7CiAgICAgIC8qIEFkZGl0aW9uYWwgaGVhZHJvb20gZm9yIGFkZGl0aW9uICovCiAgICAgIGJpdDJQRV9tID4+PSAxOwogICAgICBiaXQyUEVfZSAgKz0gMTsKICAgIH0KCiAgICAvKiB0aGUgcXVhbnRUZW5kZW5jeUNvbXBlbnNhdG9yIGNvbXBlbnNhdGVzIGEgbG93ZXIgYml0IGNvbnN1bXB0aW9uIGR1ZSB0byBpbmNyZWFzaW5nIHRoZSB0ZW5kZW5jeSB0byBxdWFudGl6ZSBsb3cgc3BlY3RyYWwgdmFsdWVzIHRvIHRoZSBsb3dlciBxdWFudGl6ZXIgYm9yZGVyIGZvciBiaXRyYXRlcyBiZWxvdyBhIGNlcnRhaW4gYml0cmF0ZSB0aHJlc2hvbGQgLS0+IHNlZSBhbHNvIGZ1bmN0aW9uIGNhbGNTZmJEaXN0TEQgaW4gcXVhbnRpemUuYyAqLwogICAgaWYgKChiaXRSYXRlL25DaGFubmVscyA+IDMyMDAwKSAmJiAoYml0UmF0ZS9uQ2hhbm5lbHMgPD0gNDAwMDApKSB7CiAgICAgIGJpdDJQRV9tICs9IChGTDJGWENPTlNUX0RCTCgwLjRmKSk+PmJpdDJQRV9lOwogICAgfQogICAgZWxzZSBpZiAoYml0UmF0ZS9uQ2hhbm5lbHMgPiAyMDAwMCkgewogICAgICBiaXQyUEVfbSArPSAoRkwyRlhDT05TVF9EQkwoMC4zZikpPj5iaXQyUEVfZTsKICAgIH0KICAgIGVsc2UgaWYgKGJpdFJhdGUvbkNoYW5uZWxzID49IDE2MDAwKSB7CiAgICAgIGJpdDJQRV9tICs9IChGTDJGWENPTlNUX0RCTCgwLjNmKSk+PmJpdDJQRV9lOwogICAgfQogICAgZWxzZSB7CiAgICAgIGJpdDJQRV9tICs9IChGTDJGWENPTlNUX0RCTCgwLjBmKSk+PmJpdDJQRV9lOwogICAgfQogIH0KCgogIC8qKioqKiAzLikgUmV0dXJuIGJpdHMycGUgZmFjdG9yICoqKioqLwogICpiaXRzMlBlRmFjdG9yX20gPSBiaXQyUEVfbTsKICAqYml0czJQZUZhY3Rvcl9lID0gYml0MlBFX2U7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfYml0czJwZTIKZGVzY3JpcHRpb246ICBjb252ZXJ0IGZyb20gYml0cyB0byBwZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVCBGREthYWNFbmNfYml0czJwZTIoCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBiaXRzLAogICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgZmFjdG9yX20sCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBmYWN0b3JfZQogICAgICAgICkKewogICByZXR1cm4gKElOVCkoZk11bHQoZmFjdG9yX20sIChGSVhQX0RCTCkoYml0czw8UV9BVkdCSVRTKSkgPj4gKFFfQVZHQklUUy1mYWN0b3JfZSkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY2FsY1RocmVzaEV4cApkZXNjcmlwdGlvbjogIGxvdWRuZXNzIGNhbGN1bGF0aW9uICh0aHJlc2hvbGQgdG8gdGhlIHBvd2VyIG9mIHJlZEV4cCkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIEZES2FhY0VuY19jYWxjVGhyZXNoRXhwKEZJWFBfREJMIHRockV4cFsoMildW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqICBxY091dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqICBwc3lPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscykKewogICBJTlQgY2gsIHNmYiwgc2ZiR3JwOwogICBGSVhQX0RCTCB0aHJFeHBMZERhdGE7CgogICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CiAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgICB0aHJFeHBMZERhdGEgPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdPj4yIDsKICAgICAgICAgdGhyRXhwW2NoXVtzZmJHcnArc2ZiXSA9IENhbGNJbnZMZERhdGEodGhyRXhwTGREYXRhKTsKICAgICAgIH0KICAgICB9CiAgIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfYWRhcHRNaW5TbnIKICAgIGRlc2NyaXB0aW9uOiAgcmVkdWNlIG1pblNuciByZXF1aXJlbWVudHMgZm9yIGJhbmRzIHdpdGggcmVsYXRpdmUgbG93IGVuZXJnaWVzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBGREthYWNFbmNfYWRhcHRNaW5TbnIoUUNfT1VUX0NIQU5ORUwgICAgICpxY091dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgICAqcHN5T3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOU05SX0FEQVBUX1BBUkFNICptc2FQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgbkNoYW5uZWxzKQp7CiAgSU5UIGNoLCBzZmIsIHNmYkdycCwgblNmYjsKICBGSVhQX0RCTCBhdmdFbkxENjQsIGRiUmF0aW8sIG1pblNuclJlZDsKICBGSVhQX0RCTCBtaW5TbnJMaW1pdExENjQgPSBGTDJGWENPTlNUX0RCTCgtMC4wMDUwMzAxMjY0ODI2MmYpOyAvKiBsZDY0KDAuOGYpICovCiAgRklYUF9EQkwgblNmYkxENjQ7CiAgRklYUF9EQkwgYWNjdTsKCiAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgIC8qIGNhbGMgYXZlcmFnZSBlbmVyZ3kgcGVyIHNjYWxlZmFjdG9yIGJhbmQgKi8KICAgIG5TZmIgPSAwOwogICAgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwoKICAgIGZvciAoc2ZiR3JwPTA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CiAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgYWNjdSArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdPj42OwoJCQkJIG5TZmIrKzsKCQkJIH0KICAgIH0KCiAgICBpZiAoKGFjY3UgPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHx8IChuU2ZiID09IDApKSB7CiAgICAgIGF2Z0VuTEQ2NCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICAgIH0KICAgIGVsc2UgewogICAgICBuU2ZiTEQ2NCAgPSBDYWxjTGRJbnQoblNmYik7CiAgICAgIGF2Z0VuTEQ2NCA9IENhbGNMZERhdGEoYWNjdSk7CiAgICAgIGF2Z0VuTEQ2NCA9IGF2Z0VuTEQ2NCArIEZMMkZYQ09OU1RfREJMKDAuMDkzNzVmKSAtIG5TZmJMRDY0OyAgLyogMC4wOTM3NWY6IGNvbXBlbnNhdGUgc2hpZnQgd2l0aCA2ICovCiAgICB9CgogICAgLyogcmVkdWNlIG1pblNuciByZXF1aXJlbWVudCBieSBtaW5TbnJebWluU25yUmVkIGRlcGVuZGVudCBvbiBhdmdFbi9zZmJFbiAqLwogICAgZm9yIChzZmJHcnA9MDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICBpZiAoIChtc2FQYXJhbS0+c3RhcnRSYXRpbyArIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSkgPCBhdmdFbkxENjQgKSB7CiAgICAgICAgICBkYlJhdGlvID0gZk11bHQoKGF2Z0VuTEQ2NCAtIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSksRkwyRlhDT05TVF9EQkwoMC4zMDEwMjk5OTU2ZikpOyAvKiBzY2FsZWQgYnkgKDEuMGYvKDEwLjBmKjY0LjBmKSkgKi8KICAgICAgICAgIG1pblNuclJlZCA9IG1zYVBhcmFtLT5yZWRPZmZzICsgZk11bHQobXNhUGFyYW0tPnJlZFJhdGlvRmFjLGRiUmF0aW8pOyAvKiBzY2FsZWQgYnkgMS4wZi82NC4wZiovCiAgICAgICAgICBtaW5TbnJSZWQgPSBmaXhNYXgobWluU25yUmVkLCBtc2FQYXJhbS0+bWF4UmVkKTsgLyogc2NhbGVkIGJ5IDEuMGYvNjQuMGYqLwogICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gKGZNdWx0KHFjT3V0Q2hhbm5lbFtjaF0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSxtaW5TbnJSZWQpKSA8PCA2OwogICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gZml4TWluKG1pblNuckxpbWl0TEQ2NCwgcWNPdXRDaGFubmVsW2NoXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcKZGVzY3JpcHRpb246ICBkZXRlcm1pbmUgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBub3QgbmVjZXNzYXJ5IHJlc3AuIHBvc3NpYmxlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcoUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBUT09MU0lORk8gKnRvb2xzSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUEVfREFUQSAqcGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSF9QQVJBTSAqYWhQYXJhbSkKewogICBJTlQgY2gsIHNmYiwgc2ZiR3JwOwogICBGSVhQX0RCTCBzZmJFbiwgc2ZiRW5tMTsKICAgRklYUF9EQkwgc2ZiRW5MZERhdGE7CiAgIEZJWFBfREJMIGF2Z0VuTGREYXRhOwoKICAgLyogZGVjcmVhc2Ugc3ByZWFkIGVuZXJneSBieSAzZEIgZm9yIGxvbmcgYmxvY2tzLCByZXNwLiAyZEIgZm9yIHNob3J0cwogICAgICAoYXZvaWQgbW9yZSBob2xlcyBpbiBsb25nIGJsb2NrcykgKi8KICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgICAgSU5UIHNmYkdycCwgc2ZiOwogICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbiAgPSBxY091dENoYW5uZWxbY2hdOwoKICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7CiAgICAgICAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkKICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykKICAgICAgICAgICAgICBxY091dENoYW4tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSA+Pj0gMSA7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkKICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykKICAgICAgICAgICAgICBxY091dENoYW4tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSA9CiAgICAgICAgICAgICAgICAgICBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjYzZiksCiAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSkgOwogICAgICB9CiAgIH0KCiAgIC8qIGluY3JlYXNlIG1pblNuciBmb3IgbG9jYWwgcGVha3MsIGRlY3JlYXNlIGl0IGZvciB2YWxsZXlzICovCiAgIGlmIChhaFBhcmFtLT5tb2RpZnlNaW5TbnIpIHsKICAgICAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbiAgPSBxY091dENoYW5uZWxbY2hdOwogICAgICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCl7CiAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgICAgICAgIEZJWFBfREJMIHNmYkVucDEsIGF2Z0VuOwogICAgICAgICAgICAgICBpZiAoc2ZiID4gMCkKICAgICAgICAgICAgICAgICAgc2ZiRW5tMSA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmItMV07CiAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgc2ZiRW5tMSA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdOwoKICAgICAgICAgICAgICAgaWYgKHNmYiA8IHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cC0xKQogICAgICAgICAgICAgICAgICBzZmJFbnAxID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYisxXTsKICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICBzZmJFbnAxID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl07CgogICAgICAgICAgICAgICBhdmdFbiA9IChzZmJFbm0xPj4xKSArIChzZmJFbnAxPj4xKTsKICAgICAgICAgICAgICAgYXZnRW5MZERhdGEgPSBDYWxjTGREYXRhKGF2Z0VuKTsKICAgICAgICAgICAgICAgc2ZiRW4gPSBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXTsKICAgICAgICAgICAgICAgc2ZiRW5MZERhdGEgPSBxY091dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKICAgICAgICAgICAgICAgLyogcGVhayA/ICovCiAgICAgICAgICAgICAgIGlmIChzZmJFbiA+IGF2Z0VuKSB7CiAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRtcE1pblNuckxkRGF0YTsKICAgICAgICAgICAgICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2U9PUxPTkdfV0lORE9XKQogICAgICAgICAgICAgICAgICAgICB0bXBNaW5TbnJMZERhdGEgPSBmaXhNYXgoIFNuckxkRmFjICsgKEZJWFBfREJMKShhdmdFbkxkRGF0YSAtIHNmYkVuTGREYXRhKSwgKEZJWFBfREJMKVNuckxkTWluMSApIDsKICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICB0bXBNaW5TbnJMZERhdGEgPSBmaXhNYXgoIFNuckxkRmFjICsgKEZJWFBfREJMKShhdmdFbkxkRGF0YSAtIHNmYkVuTGREYXRhKSwgKEZJWFBfREJMKVNuckxkTWluMyApIDsKCiAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0KICAgICAgICAgICAgICAgICAgICAgZml4TWluKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdLCB0bXBNaW5TbnJMZERhdGEpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC8qIHZhbGxleSA/ICovCiAgICAgICAgICAgICAgIGlmICggKChzZmJFbkxkRGF0YSsoRklYUF9EQkwpU25yTGRNaW40KSA8IChGSVhQX0RCTClhdmdFbkxkRGF0YSkgJiYgKHNmYkVuID4gRkwyRlhDT05TVF9EQkwoMC4wKSkgKSB7CiAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRtcE1pblNuckxkRGF0YSA9IGF2Z0VuTGREYXRhIC0gc2ZiRW5MZERhdGEgLShGSVhQX0RCTClTbnJMZE1pbjQgKyBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXTsKICAgICAgICAgICAgICAgICAgdG1wTWluU25yTGREYXRhID0gZml4TWluKChGSVhQX0RCTClTbnJMZEZhYywgdG1wTWluU25yTGREYXRhKTsKICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBmaXhNaW4odG1wTWluU25yTGREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdICsgU25yTGRNaW4yICkpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgIH0KCiAgIC8qIHN0ZXJlbzogYWRhcHQgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnRzIHNmYk1pblNuciBvZiBtaWQgYW5kCiAgICAgIHNpZGUgY2hhbm5lbHMgdG8gYXZvaWQgc3BlbmRpbmcgdW5ub3RpY2FibGUgYml0cyAqLwogICBpZiAobkNoYW5uZWxzID09IDIpIHsKICAgICAgUUNfT1VUX0NIQU5ORUwqICBxY091dENoYW5NICA9IHFjT3V0Q2hhbm5lbFswXTsKICAgICAgUUNfT1VUX0NIQU5ORUwqICBxY091dENoYW5TICA9IHFjT3V0Q2hhbm5lbFsxXTsKICAgICAgUFNZX09VVF9DSEFOTkVMKiAgcHN5T3V0Q2hhbk0gID0gcHN5T3V0Q2hhbm5lbFswXTsKICAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbk0tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuTS0+c2ZiUGVyR3JvdXApewogICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuTS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgICBpZiAodG9vbHNJbmZvLT5tc01hc2tbc2ZiR3JwK3NmYl0pIHsKICAgICAgICAgICAgIEZJWFBfREJMIG1heFNmYkVuTGQgPSBmaXhNYXgocWNPdXRDaGFuTS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdLHFjT3V0Q2hhblMtPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSk7CiAgICAgICAgICAgICBGSVhQX0RCTCBtYXhUaHJMZCwgc2ZiTWluU25yVG1wTGQ7CgogICAgICAgICAgICAgaWYgKCAoKFNuckxkTWluNT4+MSkgKyAobWF4U2ZiRW5MZD4+MSkgKyAocWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdPj4xKSkgPD0gRkwyRlhDT05TVF9EQkwoLTAuNWYpKQogICAgICAgICAgICAgICBtYXhUaHJMZCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKSA7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgIG1heFRockxkID0gU25yTGRNaW41ICsgbWF4U2ZiRW5MZCArIHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXTsKCiAgICAgICAgICAgICBpZiAocWNPdXRDaGFuTS0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdID4gRkwyRlhDT05TVF9EQkwoMC4wZikpCiAgICAgICAgICAgICAgIHNmYk1pblNuclRtcExkID0gbWF4VGhyTGQgLSBxY091dENoYW5NLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgIHNmYk1pblNuclRtcExkID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CgogICAgICAgICAgICAgcWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gZml4TWF4KHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSxzZmJNaW5TbnJUbXBMZCk7CgogICAgICAgICAgICAgaWYgKHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA8PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkKICAgICAgICAgICAgICAgIHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9IGZpeE1pbihxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0sIChGSVhQX0RCTClTbnJMZEZhYyk7CgogICAgICAgICAgICAgaWYgKHFjT3V0Q2hhblMtPnNmYkVuZXJneVtzZmJHcnArc2ZiXSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKQogICAgICAgICAgICAgICBzZmJNaW5TbnJUbXBMZCA9IG1heFRockxkIC0gcWNPdXRDaGFuUy0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICBzZmJNaW5TbnJUbXBMZCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwoKICAgICAgICAgICAgIHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9IGZpeE1heChxY091dENoYW5TLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0sc2ZiTWluU25yVG1wTGQpOwoKICAgICAgICAgICAgIGlmIChxY091dENoYW5TLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPD0gRkwyRlhDT05TVF9EQkwoMC4wZikpCiAgICAgICAgICAgICAgICBxY091dENoYW5TLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBmaXhNaW4ocWNPdXRDaGFuUy0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdLChGSVhQX0RCTClTbnJMZEZhYyk7CgogICAgICAgICAgICAgaWYgKHFjT3V0Q2hhbk0tPnNmYkVuZXJneVtzZmJHcnArc2ZiXT5xY091dENoYW5NLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwK3NmYl0pCiAgICAgICAgICAgICAgICBxY091dENoYW5TLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwK3NmYl0gPQogICAgICAgICAgICAgICAgICAgZk11bHQocWNPdXRDaGFuUy0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdLCBGTDJGWENPTlNUX0RCTCgwLjlmKSk7CgogICAgICAgICAgICAgaWYgKHFjT3V0Q2hhblMtPnNmYkVuZXJneVtzZmJHcnArc2ZiXT5xY091dENoYW5TLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwK3NmYl0pCiAgICAgICAgICAgICAgICBxY091dENoYW5NLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwK3NmYl0gPQogICAgICAgICAgICAgICAgICAgZk11bHQocWNPdXRDaGFuTS0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdLCBGTDJGWENPTlNUX0RCTCgwLjlmKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgIH0KCiAgIC8qIGluaXQgYWhGbGFnICgwOiBubyBhaCBuZWNlc3NhcnksIDE6IGFoIHBvc3NpYmxlLCAyOiBhaCBhY3RpdmUgKi8KICAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgICBRQ19PVVRfQ0hBTk5FTCAgKnFjT3V0Q2hhbiAgPSBxY091dENoYW5uZWxbY2hdOwogICAgICBQU1lfT1VUX0NIQU5ORUwgICpwc3lPdXRDaGFuICA9IHBzeU91dENoYW5uZWxbY2hdOwogICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApewogICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICAgIGlmICgocWNPdXRDaGFuLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwK3NmYl0gPiBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXSkKICAgICAgICAgICAgICB8fCAocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkpIHsKICAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBOT19BSDsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA9IEFIX0lOQUNUSVZFOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICB9Cn0KCgoKLyoqCiAqIFxicmllZiAgQ2FsY3VsYXRlIGNvbnN0YW50cyB0aGF0IGRvIG5vdCBjaGFuZ2UgZHVyaW5nIHN1Y2Nlc3NpdmUgcGUgY2FsY3VsYXRpb25zLgogKgogKiBccGFyYW0gcGVEYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgUEUgZGF0YSBvZiBjdXJyZW50IGVsZW1lbnQuCiAqIFxwYXJhbSBwc3lPdXRDaGFubmVsICAgICAgICAgUG9pbnRlciB0byBQU1lfT1VUX0NIQU5ORUwgc3RydWN0IGhvbGRpbmcgbkNoYW5uZWxzIGVsZW1lbnRzLgogKiBccGFyYW0gcWNPdXRDaGFubmVsICAgICAgICAgIFBvaW50ZXIgdG8gUUNfT1VUX0NIQU5ORUwgc3RydWN0IGhvbGRpbmcgbkNoYW5uZWxzIGVsZW1lbnRzLgogKiBccGFyYW0gbkNoYW5uZWxzICAgICAgICAgICAgIE51bWJlciBvZiBjaGFubmVscyBpbiBlbGVtZW50LgogKiBccGFyYW0gcGVPZmZzZXQgICAgICAgICAgICAgIEZpeGVkIFBFIG9mZnNldCBkZWZpbmVkIHdoaWxlIEZES2FhY0VuY19BZGpUaHJJbml0KCkgZGVwZW5kaW5nIG9uIGJpdHJhdGUuCiAqCiAqIFxyZXR1cm4gIHZvaWQKICovCnN0YXRpYwp2b2lkIEZES2FhY0VuY19wcmVwYXJlUGUoUEVfREFUQSAqcGVEYXRhLAogICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAogICAgICAgICAgICAgICBjb25zdCBJTlQgcGVPZmZzZXQpCnsKICAgIElOVCBjaDsKCiAgICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gcHN5T3V0Q2hhbm5lbFtjaF07CiAgICAgICAgRkRLYWFjRW5jX3ByZXBhcmVTZmJQZSgmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXSwKICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhLAogICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGEsCiAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkZvcm1GYWN0b3JMZERhdGEsCiAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYk9mZnNldHMsCiAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYkNudCwKICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXAsCiAgICAgICAgICAgIHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwKTsKICAgIH0KICAgIHBlRGF0YS0+b2Zmc2V0ID0gcGVPZmZzZXQ7Cn0KCi8qKgogKiBcYnJpZWYgIENhbGN1bGF0ZSB3ZWlnaHRpbmcgZmFjdG9yIGZvciB0aHJlc2hvbGQgYWRqdXN0bWVudC4KICoKICogQ2FsY3VsYXRlIHdlaWdodGluZyBmYWN0b3IgdG8gYmUgYXBwbGllZCBhdCBlbmVyZ2llcyBhbmQgdGhyZXNob2xkcyBpbiBsZDY0IGZvcm1hdC4KICoKICogXHBhcmFtIHBlRGF0YSwgICAgICAgICAgICAgICBQb2ludGVyIHRvIFBFIGRhdGEgaW4gY3VycmVudCBlbGVtZW50LgogKiBccGFyYW0gcHN5T3V0Q2hhbm5lbCAgICAgICAgIFBvaW50ZXIgdG8gUFNZX09VVF9DSEFOTkVMIHN0cnVjdCBob2xkaW5nIG5DaGFubmVscyBlbGVtZW50cy4KICogXHBhcmFtIHFjT3V0Q2hhbm5lbCAgICAgICAgICBQb2ludGVyIHRvIFFDX09VVF9DSEFOTkVMIHN0cnVjdCBob2xkaW5nIG5DaGFubmVscyBlbGVtZW50cy4KICogXHBhcmFtIHRvb2xzSW5mbyAgICAgICAgICAgICBQb2ludGVyIHRvIHRvb2xzIGluZm8gc3RydWN0IG9mIGN1cnJlbnQgZWxlbWVudC4KICogXHBhcmFtIGFkalRoclN0YXRlRWxlbWVudCAgICBQb2ludGVyIHRvIEFUU19FTEVNRU5UIGhvbGRpbmcgZW5GYWNQYXRjaCBzdGF0ZXMuCiAqIFxwYXJhbSBuQ2hhbm5lbHMgICAgICAgICAgICAgTnVtYmVyIG9mIGNoYW5uZWxzIGluIGVsZW1lbnQuCiAqIFxwYXJhbSB1c2VQYXRjaFRvb2wgICAgICAgICAgQXBwbHkgdGhlIHdlaWdodGluZyB0b29sIDAgKG5vKSBlbHNlICh5ZXMpLgogKgogKiBccmV0dXJuICB2b2lkCiAqLwpzdGF0aWMKdm9pZCBGREthYWNFbmNfY2FsY1dlaWdodGluZyhQRV9EQVRBICpwZURhdGEsCiAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgIHN0cnVjdCBUT09MU0lORk8gKnRvb2xzSW5mbywKICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqIGFkalRoclN0YXRlRWxlbWVudCwKICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKICAgICAgICAgICAgICAgY29uc3QgSU5UIHVzZVBhdGNoVG9vbCkKewogICAgaW50IGNoLCBub1Nob3J0V2luZG93SW5GcmFtZSA9IFRSVUU7CiAgICBJTlQgZXhlUGF0Y2hNID0gMDsKCiAgICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgICAgIGlmIChwc3lPdXRDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgewogICAgICAgICAgICBub1Nob3J0V2luZG93SW5GcmFtZSA9IEZBTFNFOwogICAgICAgIH0KICAgICAgICBGREttZW1jbGVhcihxY091dENoYW5uZWxbY2hdLT5zZmJFbkZhY0xkLCBNQVhfR1JPVVBFRF9TRkIqc2l6ZW9mKEZJWFBfREJMKSk7CiAgICB9CgogICAgaWYgKHVzZVBhdGNoVG9vbD09MCkgewogICAgICAgIHJldHVybjsgLyogdG9vbCBpcyBkaXNhYmxlZCAqLwogICAgfQoKICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CgogICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9IHBzeU91dENoYW5uZWxbY2hdOwoKICAgICAgICBpZiAobm9TaG9ydFdpbmRvd0luRnJhbWUpIHsgLyogcmV0YWluIGVuZXJneSByYXRpbyBiZXR3ZWVuIGJsb2NrcyBvZiBkaWZmZXJlbnQgbGVuZ3RoICovCgogICAgICAgICAgICBGSVhQX0RCTCBucmdTdW0xNCwgbnJnU3VtMTIsIG5yZ1N1bTM0LCBucmdUb3RhbDsKICAgICAgICAgICAgRklYUF9EQkwgbnJnRmFjTGRfMTQsIG5yZ0ZhY0xkXzEyLCBucmdGYWNMZF8zNDsKICAgICAgICAgICAgSU5UIHVzZVBhdGNoLCBleGVQYXRjaDsKICAgICAgICAgICAgaW50IHNmYiwgc2ZiR3JwLCBuTGluZXNTdW0gPSAwOwoKICAgICAgICAgICAgbnJnU3VtMTQgPSBucmdTdW0xMiA9IG5yZ1N1bTM0ID0gbnJnVG90YWwgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwoKICAgICAgICAgICAgLyogY2FsY3VsYXRlIGZsYXRuZXNzIG9mIGF1ZGlibGUgc3BlY3RydW0sIGkuZS4gc3BlY3RydW0gYWJvdmUgbWFza2luZyB0aHJlc2hvbGQuICovCiAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewogICAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgICAgICAgICBGSVhQX0RCTCBucmdGYWMxMiA9IENhbGNJbnZMZERhdGEocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdPj4xKTsgLyogbnJnXigxLzIpICovCiAgICAgICAgICAgICAgICBGSVhQX0RCTCBucmdGYWMxNCA9IENhbGNJbnZMZERhdGEocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdPj4yKTsgLyogbnJnXigxLzQpICovCgogICAgICAgICAgICAgICAgLyogbWF4aW1hbCBudW1iZXIgb2YgYmFuZHMgaXMgNjQsIHJlc3VsdHMgc2NhbGluZyBmYWN0b3IgNiAqLwogICAgICAgICAgICAgICAgbkxpbmVzU3VtICs9IHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiTkxpbmVzW3NmYkdycCtzZmJdOyAgICAgICAgICAgICAvKiByZWxldmFudCBsaW5lcyAqLwogICAgICAgICAgICAgICAgbnJnVG90YWwgICs9ICggcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdID4+IDYgKTsgICAgICAgICAgICAgICAgICAvKiBzdW0gdXAgbnJnICovCiAgICAgICAgICAgICAgICBucmdTdW0xMiAgKz0gKCBucmdGYWMxMiA+PiA2ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSB1cCBucmdeKDIvNCkgKi8KICAgICAgICAgICAgICAgIG5yZ1N1bTE0ICArPSAoIG5yZ0ZhYzE0ID4+IDYgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VtIHVwIG5yZ14oMS80KSAqLwogICAgICAgICAgICAgICAgbnJnU3VtMzQgICs9ICggZk11bHQobnJnRmFjMTQsIG5yZ0ZhYzEyKSA+PiA2ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gdXAgbnJnXigzLzQpICovCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBucmdUb3RhbCA9IENhbGNMZERhdGEobnJnVG90YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgbGQ2NCBvZiB0b3RhbCBucmcgKi8KCiAgICAgICAgICAgIG5yZ0ZhY0xkXzE0ID0gQ2FsY0xkRGF0YShucmdTdW0xNCkgLSBucmdUb3RhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxkNjQobnJnU3VtMTQvbnJnVG90YWwpICovCiAgICAgICAgICAgIG5yZ0ZhY0xkXzEyID0gQ2FsY0xkRGF0YShucmdTdW0xMikgLSBucmdUb3RhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxkNjQobnJnU3VtMTIvbnJnVG90YWwpICovCiAgICAgICAgICAgIG5yZ0ZhY0xkXzM0ID0gQ2FsY0xkRGF0YShucmdTdW0zNCkgLSBucmdUb3RhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxkNjQobnJnU3VtMzQvbnJnVG90YWwpICovCgogICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQtPmNoYW9zTWVhc3VyZUVuRmFjW2NoXSA9IEZES21heCggRkwyRlhDT05TVF9EQkwoMC4xODc1ZiksIGZEaXZOb3JtKG5MaW5lc1N1bSxwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3BzeU91dENoYW4tPnNmYkNudF0pICk7CgogICAgICAgICAgICB1c2VQYXRjaCA9IChhZGpUaHJTdGF0ZUVsZW1lbnQtPmNoYW9zTWVhc3VyZUVuRmFjW2NoXSA+IEZMMkZYQ09OU1RfREJMKDAuNzgxMjVmKSk7CiAgICAgICAgICAgIGV4ZVBhdGNoID0gKCh1c2VQYXRjaCkgJiYgKGFkalRoclN0YXRlRWxlbWVudC0+bGFzdEVuRmFjUGF0Y2hbY2hdKSk7CgogICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKICAgICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewoKICAgICAgICAgICAgICAgIElOVCBzZmJFeGVQYXRjaDsKCiAgICAgICAgICAgICAgICAvKiBmb3IgTVMgY291cGxlZCBTRkJzLCBhbHNvIGV4ZWN1dGUgcGF0Y2ggaW4gc2lkZSBjaGFubmVsIGlmIGRvbmUgaW4gbWlkIGNoYW5uZWwgKi8KICAgICAgICAgICAgICAgIGlmICgoY2ggPT0gMSkgJiYgKHRvb2xzSW5mby0+bXNNYXNrW3NmYkdycCtzZmJdKSkgewogICAgICAgICAgICAgICAgICAgIHNmYkV4ZVBhdGNoID0gZXhlUGF0Y2hNOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2ZiRXhlUGF0Y2ggPSBleGVQYXRjaDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIChzZmJFeGVQYXRjaCkgJiYgKHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXT5GTDJGWENPTlNUX0RCTCgwLmYpKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyogZXhlY3V0ZSBwYXRjaCBiYXNlZCBvbiBzcGVjdHJhbCBmbGF0bmVzcyBjYWxjdWxhdGVkIGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID4gRkwyRlhDT05TVF9EQkwoMC44MTI1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnArc2ZiXSA9ICggKG5yZ0ZhY0xkXzE0ICsgKHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSsocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdPj4xKSkpPj4xICk7IC8qIHNmYkVuZXJneV4oMy80KSAqLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZGpUaHJTdGF0ZUVsZW1lbnQtPmNoYW9zTWVhc3VyZUVuRmFjW2NoXSA+IEZMMkZYQ09OU1RfREJMKDAuNzk2ODc1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnArc2ZiXSA9ICggKG5yZ0ZhY0xkXzEyICsgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdKT4+MSApOyAgICAgICAgICAvKiBzZmJFbmVyZ3leKDIvNCkgKi8KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGRbc2ZiR3JwK3NmYl0gPSAoIChucmdGYWNMZF8zNCArIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0+PjEpKT4+MSApOyAgICAgLyogc2ZiRW5lcmd5XigxLzQpICovCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGRbc2ZiR3JwK3NmYl0gPSBmaXhNaW4ocWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnArc2ZiXSwoRklYUF9EQkwpMCk7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAvKiBzZmIgbG9vcCAqLwoKICAgICAgICAgICAgYWRqVGhyU3RhdGVFbGVtZW50LT5sYXN0RW5GYWNQYXRjaFtjaF0gPSB1c2VQYXRjaDsKICAgICAgICAgICAgZXhlUGF0Y2hNID0gZXhlUGF0Y2g7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiAhbm9TaG9ydFdpbmRvd0luRnJhbWUgKi8KICAgICAgICAgICAgYWRqVGhyU3RhdGVFbGVtZW50LT5jaGFvc01lYXN1cmVFbkZhY1tjaF0gPSBGTDJGWENPTlNUX0RCTCgwLjc1Zik7CiAgICAgICAgICAgIGFkalRoclN0YXRlRWxlbWVudC0+bGFzdEVuRmFjUGF0Y2hbY2hdID0gVFJVRTsgLyogYWxsb3cgdXNlIG9mIHNmYkVuRmFjIHBhdGNoIGluIHVwY29taW5nIGZyYW1lICovCiAgICAgICAgfQoKICAgIH0gLyogY2ggbG9vcCAqLwoKfQoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NhbGNQZQpkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZSBwZSBmb3IgYm90aCBjaGFubmVscwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljCnZvaWQgRkRLYWFjRW5jX2NhbGNQZShQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICBQRV9EQVRBICpwZURhdGEsCiAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMpCnsKICAgSU5UIGNoOwoKICAgcGVEYXRhLT5wZSA9IHBlRGF0YS0+b2Zmc2V0OwogICBwZURhdGEtPmNvbnN0UGFydCA9IDA7CiAgIHBlRGF0YS0+bkFjdGl2ZUxpbmVzID0gMDsKICAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgICBQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGEgPSAmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKICAgICAgRkRLYWFjRW5jX2NhbGNTZmJQZSgmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXSwKICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhLAogICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhLAogICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudCwKICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCwKICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cCwKICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5pc0Jvb2ssCiAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+aXNTY2FsZSk7CgogICAgICBwZURhdGEtPnBlICs9IHBlQ2hhbkRhdGEtPnBlOwogICAgICBwZURhdGEtPmNvbnN0UGFydCArPSBwZUNoYW5EYXRhLT5jb25zdFBhcnQ7CiAgICAgIHBlRGF0YS0+bkFjdGl2ZUxpbmVzICs9IHBlQ2hhbkRhdGEtPm5BY3RpdmVMaW5lczsKICAgfQp9Cgp2b2lkIEZES2FhY0VuY19wZUNhbGN1bGF0aW9uKFBFX0RBVEEgKnBlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRPT0xTSU5GTyAqdG9vbHNJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU19FTEVNRU5UKiBhZGpUaHJTdGF0ZUVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscykKewogIC8qIGNvbnN0YW50cyB0aGF0IHdpbGwgbm90IGNoYW5nZSBkdXJpbmcgc3VjY2Vzc2l2ZSBwZSBjYWxjdWxhdGlvbnMgKi8KICBGREthYWNFbmNfcHJlcGFyZVBlKHBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCBuQ2hhbm5lbHMsIGFkalRoclN0YXRlRWxlbWVudC0+cGVPZmZzZXQpOwoKICAvKiBjYWxjdWxhdGUgd2VpZ2h0aW5nIGZhY3RvciBmb3IgdGhyZXNob2xkIGFkanVzdG1lbnQgKi8KICBGREthYWNFbmNfY2FsY1dlaWdodGluZyhwZURhdGEsIHBzeU91dENoYW5uZWwsIHFjT3V0Q2hhbm5lbCwgdG9vbHNJbmZvLCBhZGpUaHJTdGF0ZUVsZW1lbnQsIG5DaGFubmVscywgMSk7CnsKICAgIC8qIG5vIHdlaWdodGluZyBvZiB0aHJlaG9sZHMgYW5kIGVuZXJnaWVzIGZvciBtbG91dCAqLwogICAgLyogd2VpZ2h0IGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzICovCiAgICBpbnQgY2g7CiAgICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewoKICAgICAgICBpbnQgc2ZiLCBzZmJHcnA7CiAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHBRY091dENoID0gcWNPdXRDaGFubmVsW2NoXTsKCiAgICAgICAgZm9yIChzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CiAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgICAgICBwUWNPdXRDaC0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiK3NmYkdycF0gPSBwUWNPdXRDaC0+c2ZiRW5lcmd5TGREYXRhW3NmYitzZmJHcnBdIC0gcFFjT3V0Q2gtPnNmYkVuRmFjTGRbc2ZiK3NmYkdycF07CiAgICAgICAgICAgIHBRY091dENoLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiK3NmYkdycF0gICAgIC09IHBRY091dENoLT5zZmJFbkZhY0xkW3NmYitzZmJHcnBdOwogICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKICAvKiBwZSB3aXRob3V0IHJlZHVjdGlvbiAqLwogIEZES2FhY0VuY19jYWxjUGUocHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCBwZURhdGEsIG5DaGFubmVscyk7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0ZES2FhY0VuY19jYWxjUGVOb0FICmRlc2NyaXB0aW9uOiAgc3VtIHRoZSBwZSBkYXRhIG9ubHkgZm9yIGJhbmRzIHdoZXJlIGF2b2lkIGhvbGUgaXMgaW5hY3RpdmUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIEZES2FhY0VuY19GREthYWNFbmNfY2FsY1BlTm9BSChJTlQgKnBlLAogICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3RQYXJ0LAogICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAqbkFjdGl2ZUxpbmVzLAogICAgICAgICAgICAgICAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhaEZsYWdbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAogICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMpCnsKICAgIElOVCBjaCwgc2ZiLHNmYkdycDsKCiAgICBJTlQgcGVfdG1wID0gcGVEYXRhLT5vZmZzZXQ7CiAgICBJTlQgY29uc3RQYXJ0X3RtcCA9IDA7CiAgICBJTlQgbkFjdGl2ZUxpbmVzX3RtcCA9IDA7CiAgICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhID0gJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07CiAgICAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApewogICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgICAgICAgICAgaWYoYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA8IEFIX0FDVElWRSkgewogICAgICAgICAgICAgICAgICAgIHBlX3RtcCArPSBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXTsKICAgICAgICAgICAgICAgICAgICBjb25zdFBhcnRfdG1wICs9IHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFtzZmJHcnArc2ZiXTsKICAgICAgICAgICAgICAgICAgICBuQWN0aXZlTGluZXNfdG1wICs9IHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qIGNvcnJlY3Qgc2NhbGVkIHBlIGFuZCBjb25zdFBhcnQgdmFsdWVzICovCiAgICAqcGUgPSBwZV90bXAgPj4gUEVfQ09OU1RQQVJUX1NISUZUOwogICAgKmNvbnN0UGFydCA9IGNvbnN0UGFydF90bXAgPj4gUEVfQ09OU1RQQVJUX1NISUZUOwoKCSpuQWN0aXZlTGluZXMgPSBuQWN0aXZlTGluZXNfdG1wOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNDQlIKZGVzY3JpcHRpb246ICBhcHBseSByZWR1Y3Rpb24gZm9ybXVsYQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGNvbnN0IEZJWFBfREJMIGxpbWl0VGhyUmVkdWNlZExkRGF0YSA9IChGSVhQX0RCTCkweDAwMDA4MDAwOyAvKkZMMkZYQ09OU1RfREJMKEZES3BvdygyLjAsLUxEX0RBVEFfU0NBTElORy80LjApKTsqLwoKc3RhdGljIHZvaWQgRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNDQlIoUUNfT1VUX0NIQU5ORUwqICBxY091dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhaEZsYWdbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRockV4cFsoMildW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCByZWRWYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgcmVkVmFsU2NhbGluZykKewogICBJTlQgY2gsIHNmYiwgc2ZiR3JwOwogICBGSVhQX0RCTCBzZmJFbkxkRGF0YSwgc2ZiVGhyTGREYXRhLCBzZmJUaHJSZWR1Y2VkTGREYXRhOwogICBGSVhQX0RCTCBzZmJUaHJFeHA7CgogICAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgICBRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFuID0gcWNPdXRDaGFubmVsW2NoXTsKICAgICAgZm9yKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCl7CiAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICAgc2ZiRW5MZERhdGEgID0gcWNPdXRDaGFuLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXTsKICAgICAgICAgc2ZiVGhyTGREYXRhID0gcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl07CiAgICAgICAgIHNmYlRockV4cCAgICA9IHRockV4cFtjaF1bc2ZiR3JwK3NmYl07CiAgICAgICAgIGlmICgoc2ZiRW5MZERhdGEgPiBzZmJUaHJMZERhdGEpICYmIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdICE9IEFIX0FDVElWRSkpIHsKCiAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWR1Y3Rpb24gZm9ybXVsYToKICAgICAgICAgICAgIGZsb2F0IHRtcCA9IHRockV4cFtjaF1bc2ZiXStyZWRWYWw7CiAgICAgICAgICAgICB0bXAgKj0gdG1wOwogICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZCA9IHRtcCp0bXA7CiAgICAgICAgICAgICovCiAgICAgICAgICAgIGludCBtaW5TY2FsZSA9IGZpeE1pbihDb3VudExlYWRpbmdCaXRzKHNmYlRockV4cCksIENvdW50TGVhZGluZ0JpdHMocmVkVmFsKSAtIChERlJBQ1RfQklUUy0xLXJlZFZhbFNjYWxpbmcpICktMTsKCiAgICAgICAgICAgIC8qIDQqbG9nKCBzZmJUaHJFeHAgKyByZWRWYWwgKSAqLwogICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gQ2FsY0xkRGF0YShmQWJzKHNjYWxlVmFsdWUoc2ZiVGhyRXhwLCBtaW5TY2FsZSkgKyBzY2FsZVZhbHVlKHJlZFZhbCwoREZSQUNUX0JJVFMtMS1yZWRWYWxTY2FsaW5nKSttaW5TY2FsZSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChGSVhQX0RCTCkobWluU2NhbGU8PChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpKTsKICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA8PD0gMjsKCiAgICAgICAgICAgIC8qIGF2b2lkIGhvbGVzICovCiAgICAgICAgICAgIGlmICggKChzZmJUaHJSZWR1Y2VkTGREYXRhIC0gc2ZiRW5MZERhdGEpID4gcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKQogICAgICAgICAgICAgICAgICAgICYmIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdICE9IE5PX0FIKSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gID4gKEZMMkZYQ09OU1RfREJMKC0xLjBmKSAtIHNmYkVuTGREYXRhKSApewogICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heCgocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKyBzZmJFbkxkRGF0YSksIHNmYlRockxkRGF0YSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2Ugc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHNmYlRockxkRGF0YTsKICAgICAgICAgICAgICBhaEZsYWdbY2hdW3NmYkdycCtzZmJdID0gQUhfQUNUSVZFOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBtaW5pbXVtIG9mIDI5IGRCIFJhdGlvIGZvciBUaHJlc2hvbGRzICovCiAgICAgICAgICAgIGlmICgoc2ZiRW5MZERhdGErKEZJWFBfREJMKU1BWFZBTF9EQkwpID4gRkwyRlhDT05TVF9EQkwoOS42MzM2MjA2L0xEX0RBVEFfU0NBTElORykpewogICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heChzZmJUaHJSZWR1Y2VkTGREYXRhLCAoc2ZiRW5MZERhdGEgLSBGTDJGWENPTlNUX0RCTCg5LjYzMzYyMDYvTERfREFUQV9TQ0FMSU5HKSkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9IHNmYlRoclJlZHVjZWRMZERhdGE7CiAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgfQp9CgovKiBzaW1pbGFyIHRvIHByZXBhcmVTZmJQZTEoKSAqLwpzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NhbGNDaGFvc01lYXN1cmUoUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFubmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgKnNmYkZvcm1GYWN0b3JMZERhdGEpCnsKICAjZGVmaW5lIFNDQUxFX0ZPUk1fRkFDICAgICAoNCkgICAgLyogKFNDQUxFX0ZPUk1fRkFDK0ZPUk1fRkFDX1NISUZUKSA+PSBsZChGUkFNRV9MRU5HVEgpKi8KICAjZGVmaW5lIFNDQUxFX05SR1MgICAgICAgICAoOCkKICAjZGVmaW5lIFNDQUxFX05MSU5FUyAgICAgICgxNikKICAjZGVmaW5lIFNDQUxFX05SR1NfU1FSVDQgICAoMikgICAgLyogMC4yNSAqIFNDQUxFX05SR1MgKi8KICAjZGVmaW5lIFNDQUxFX05MSU5FU19QMzQgICgxMikgICAgLyogMC43NSAqIFNDQUxFX05MSU5FUyAqLwoKICBJTlQgICBzZmJHcnAsIHNmYjsKICBGSVhQX0RCTCBjaGFvc01lYXN1cmU7CiAgSU5UIGZyYW1lTkxpbmVzID0gMDsKICBGSVhQX0RCTCBmcmFtZUZvcm1GYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogIEZJWFBfREJMIGZyYW1lRW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKCiAgZm9yIChzZmJHcnA9MDsgc2ZiR3JwPHBzeU91dENoYW5uZWwtPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCkgewogICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwOyBzZmIrKyl7CiAgICAgIGlmIChwc3lPdXRDaGFubmVsLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gPiBwc3lPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0pIHsKICAgICAgICBmcmFtZUZvcm1GYWN0b3IgKz0gKENhbGNJbnZMZERhdGEoc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJHcnArc2ZiXSk+PlNDQUxFX0ZPUk1fRkFDKTsKICAgICAgICBmcmFtZU5MaW5lcyAgICAgKz0gKHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiR3JwK3NmYisxXSAtIHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiR3JwK3NmYl0pOwogICAgICAgIGZyYW1lRW5lcmd5ICAgICArPSAocHN5T3V0Q2hhbm5lbC0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdPj5TQ0FMRV9OUkdTKTsKICAgICAgfQogICAgfQogIH0KCiAgaWYoZnJhbWVOTGluZXMgPiAwKXsKCiAgICAvKiAgZnJhbWVOQWN0aXZlTGluZXMgPSBmcmFtZUZvcm1GYWN0b3IqMl5GT1JNX0ZBQ19TSElGVCAqICgoZnJhbWVFbmVyZ3kgKjJeU0NBTEVfTlJHUykvZnJhbWVOTGluZXMpXi0wLjI1CiAgICAgICAgY2hhb3NNZWFzdXJlICAgICAgPSBmcmFtZU5BY3RpdmVMaW5lcyAvIGZyYW1lTkxpbmVzICovCiAgICBjaGFvc01lYXN1cmUgPQogICAgICAgICAgIENhbGNJbnZMZERhdGEoICgoKENhbGNMZERhdGEoZnJhbWVGb3JtRmFjdG9yKT4+MSkgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKENhbGNMZERhdGEoZnJhbWVFbmVyZ3kpPj4oMisxKSkpIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjc1ZiksQ2FsY0xkRGF0YSgoRklYUF9EQkwpZnJhbWVOTGluZXM8PChERlJBQ1RfQklUUy0xLVNDQUxFX05MSU5FUykpKSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChGSVhQX0RCTCkoU0NBTEVfRk9STV9GQUMtU0NBTEVfTlJHU19TUVJUNCtGT1JNX0ZBQ19TSElGVC0oU0NBTEVfTkxJTkVTX1AzNCkpPDwoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSk+PjEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICk8PDEgKTsKICB9IGVsc2UgewoKICAgIC8qIGFzc3VtaW5nIHRvdGFsIGNoYW9zLCBpZiBubyBzZmIgaXMgYWJvdmUgdGhyZXNob2xkcyAqLwogICAgY2hhb3NNZWFzdXJlID0gRkwyRlhDT05TVF9EQkwoMS5mKTsKICB9CgogIHJldHVybiBjaGFvc01lYXN1cmU7Cn0KCi8qIGFwcGx5IHJlZHVjdGlvbiBmb3JtdWxhIGZvciBWQlItbW9kZSAqLwpzdGF0aWMgdm9pZCBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc1ZCUihRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB0aHJFeHBbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIHZiclF1YWxGYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIGNoYW9zTWVhc3VyZU9sZCkKewogIElOVCBjaCwgc2ZiR3JwLCBzZmI7CiAgRklYUF9EQkwgY2hHcm91cEVuZXJneVtUUkFOU19GQUNdWzJdOy8qZW5lcmd5IGZvciBlYWNoIGdyb3VwIGFuZCBjaGFubmVsKi8KICBGSVhQX0RCTCBjaENoYW9zTWVhc3VyZVsyXTsKICBGSVhQX0RCTCBmcmFtZUVuZXJneSA9IEZMMkZYQ09OU1RfREJMKDFlLTEwZik7CiAgRklYUF9EQkwgY2hhb3NNZWFzdXJlID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKICBGSVhQX0RCTCBzZmJFbkxkRGF0YSwgc2ZiVGhyTGREYXRhLCBzZmJUaHJFeHA7CiAgRklYUF9EQkwgc2ZiVGhyUmVkdWNlZExkRGF0YTsKICBGSVhQX0RCTCBjaGFvc01lYXN1cmVBdmc7CiAgSU5UIGdyb3VwQ250OyAvKiBsb29wIGNvdW50ZXIgKi8KICBGSVhQX0RCTCByZWRWYWxbVFJBTlNfRkFDXTsgLyogcmVkdWN0aW9uIHZhbHVlczsgaW4gc2hvcnQtYmxvY2sgY2FzZSBvbmUgcmVkVmFsIGZvciBlYWNoIGdyb3VwICovCiAgUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW4gID0gTlVMTDsKICBQU1lfT1VUX0NIQU5ORUwgICpwc3lPdXRDaGFuICA9IE5VTEw7CgojZGVmaW5lIFNDQUxFX0dST1VQX0VORVJHWSAgICg4KQoKI2RlZmluZSBDT05TVF9DSEFPU19NRUFTX0FWR19GQUNfMCAgKEZMMkZYQ09OU1RfREJMKDAuMjVmKSkKI2RlZmluZSBDT05TVF9DSEFPU19NRUFTX0FWR19GQUNfMSAgKEZMMkZYQ09OU1RfREJMKDEuZi0wLjI1ZikpCgojZGVmaW5lIE1JTl9MRFRIUkVTSCAgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoLTAuNTE1NjI1ZikpCgoKICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKXsKICAgIHFjT3V0Q2hhbiAgPSBxY091dENoYW5uZWxbY2hdOwogICAgcHN5T3V0Q2hhbiAgPSBwc3lPdXRDaGFubmVsW2NoXTsKCiAgICAvKiBhZGRpbmcgdXAgZW5lcmd5IGZvciBlYWNoIGNoYW5uZWwgYW5kIGVhY2ggZ3JvdXAgc2VwYXJhdGVseSAqLwogICAgRklYUF9EQkwgY2hFbmVyZ3kgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogICAgZ3JvdXBDbnQ9MDsKCiAgICBmb3IgKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW4tPnNmYlBlckdyb3VwLCBncm91cENudCsrKSB7CiAgICAgIGNoR3JvdXBFbmVyZ3lbZ3JvdXBDbnRdW2NoXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspewogICAgICAgIGNoR3JvdXBFbmVyZ3lbZ3JvdXBDbnRdW2NoXSArPSAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdPj5TQ0FMRV9HUk9VUF9FTkVSR1kpOwogICAgICB9CiAgICAgIGNoRW5lcmd5ICs9IGNoR3JvdXBFbmVyZ3lbZ3JvdXBDbnRdW2NoXTsKICAgIH0KICAgIGZyYW1lRW5lcmd5ICs9IGNoRW5lcmd5OwoKICAgIC8qIGNoYW9zTWVhc3VyZSAqLwogICAgaWYgKHBzeU91dENoYW5uZWxbMF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHsKICAgICAgY2hDaGFvc01lYXN1cmVbY2hdID0gRkwyRlhDT05TVF9EQkwoMC41Zik7IC8qIGFzc3VtZSBhIGNvbnN0YW50IGNoYW9zIG1lYXN1cmUgb2YgMC41ZiBmb3Igc2hvcnQgYmxvY2tzICovCiAgICB9IGVsc2UgewogICAgICBjaENoYW9zTWVhc3VyZVtjaF0gPSBGREthYWNFbmNfY2FsY0NoYW9zTWVhc3VyZShwc3lPdXRDaGFubmVsW2NoXSwgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRm9ybUZhY3RvckxkRGF0YSk7CiAgICB9CiAgICBjaGFvc01lYXN1cmUgKz0gZk11bHQoY2hDaGFvc01lYXN1cmVbY2hdLCBjaEVuZXJneSk7CiAgfQoKICBpZihmcmFtZUVuZXJneSA+IGNoYW9zTWVhc3VyZSkgewogICAgSU5UIHNjYWxlID0gQ250TGVhZGluZ1plcm9zKGZyYW1lRW5lcmd5KSAtIDE7CiAgICBGSVhQX0RCTCBudW0gICA9IGNoYW9zTWVhc3VyZTw8c2NhbGU7CiAgICBGSVhQX0RCTCBkZW51bSA9IGZyYW1lRW5lcmd5PDxzY2FsZTsKICAgIGNoYW9zTWVhc3VyZSAgID0gc2NodXJfZGl2KG51bSxkZW51bSwxNik7CiAgfQogIGVsc2UgewogICAgY2hhb3NNZWFzdXJlID0gRkwyRlhDT05TVF9EQkwoMS5mKTsKICB9CgogIGNoYW9zTWVhc3VyZUF2ZyA9IGZNdWx0KENPTlNUX0NIQU9TX01FQVNfQVZHX0ZBQ18wLCBjaGFvc01lYXN1cmUpICsKICAgICAgICAgICAgICAgICAgICBmTXVsdChDT05TVF9DSEFPU19NRUFTX0FWR19GQUNfMSwgKmNoYW9zTWVhc3VyZU9sZCk7ICAgICAgLyogYXZlcmFnaW5nIGNoYW9zIG1lYXN1cmUgKi8KICAqY2hhb3NNZWFzdXJlT2xkID0gY2hhb3NNZWFzdXJlID0gKGZpeE1pbihjaGFvc01lYXN1cmUsIGNoYW9zTWVhc3VyZUF2ZykpOyAgLyogdXNlIG1pbi12YWx1ZSwgc2FmZSBmb3IgbmV4dCBmcmFtZSAqLwoKICAvKiBjaGFyYWN0ZXJpc3RpYyBjdXJ2ZQogICAgIGNoYW9zTWVhc3VyZSA9IDAuMmYgKyAwLjdmLzAuM2YgKiAoY2hhb3NNZWFzdXJlIC0gMC4yZik7CiAgICAgY2hhb3NNZWFzdXJlID0gZml4TWluKDEuMGYsIGZpeE1heCgwLjFmLCBjaGFvc01lYXN1cmUpKTsKICAgICBjb25zdGFudHMgc2NhbGVkIGJ5IDQuZgogICovCiAgY2hhb3NNZWFzdXJlID0gKChGTDJGWENPTlNUX0RCTCgwLjJmKT4+MikgKyBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmLyg0LmYqMC4zZikpLCAoY2hhb3NNZWFzdXJlIC0gRkwyRlhDT05TVF9EQkwoMC4yZikpKSk7CiAgY2hhb3NNZWFzdXJlID0gKGZpeE1pbigoRklYUF9EQkwpKEZMMkZYQ09OU1RfREJMKDEuMGYpPj4yKSwgZml4TWF4KChGSVhQX0RCTCkoRkwyRlhDT05TVF9EQkwoMC4xZik+PjIpLCBjaGFvc01lYXN1cmUpKSk8PDI7CgogIC8qIGNhbGN1bGF0aW9uIG9mIHJlZHVjdGlvbiB2YWx1ZSAqLwogIGlmIChwc3lPdXRDaGFubmVsWzBdLT5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKXsgLyogc2hvcnQtYmxvY2tzICovCiAgICBGREtfQVNTRVJUKFRSQU5TX0ZBQz09OCk7CiAgICAjZGVmaW5lICAgV0lOX1RZUEVfU0NBTEUgICAoMykKCiAgICBJTlQgc2ZiR3JwLCBncm91cENudD0wOwogICAgZm9yIChzZmJHcnA9MDsgc2ZiR3JwPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCxncm91cENudCsrKSB7CgogICAgICBGSVhQX0RCTCBncm91cEVuZXJneSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CgogICAgICBmb3IoY2g9MDtjaDxuQ2hhbm5lbHM7Y2grKyl7CiAgICAgICAgZ3JvdXBFbmVyZ3kgKz0gY2hHcm91cEVuZXJneVtncm91cENudF1bY2hdOyAgIC8qIGFkZGluZyB1cCB0aGUgY2hhbm5lbHMgZ3JvdXBFbmVyZ3kgKi8KICAgICAgfQoKICAgICAgRkRLX0FTU0VSVChwc3lPdXRDaGFubmVsWzBdLT5ncm91cExlbltncm91cENudF08PUlOVl9JTlRfVEFCX1NJWkUpOwogICAgICBncm91cEVuZXJneSA9IGZNdWx0KGdyb3VwRW5lcmd5LGludkludFtwc3lPdXRDaGFubmVsWzBdLT5ncm91cExlbltncm91cENudF1dKTsgIC8qIGNvcnJlY3Rpb24gb2YgZ3JvdXAgZW5lcmd5ICovCiAgICAgIGdyb3VwRW5lcmd5ID0gZml4TWluKGdyb3VwRW5lcmd5LCBmcmFtZUVuZXJneT4+V0lOX1RZUEVfU0NBTEUpOyAgICAgICAgICAgICAgICAgLyogZG8gbm90IGFsbG93IGFuIGhpZ2hlciByZWRWYWwgYXMgY2FsY3VsYXRlZCBmcmFtZXdpc2UgKi8KCiAgICAgIGdyb3VwRW5lcmd5Pj49MjsgLyogMipXSU5fVFlQRV9TQ0FMRSA9IDYgPT4gNisyID0gOCA9PT4gOC80ID0gaW50IG51bWJlciAqLwoKICAgICAgcmVkVmFsW2dyb3VwQ250XSA9IGZNdWx0KGZNdWx0KHZiclF1YWxGYWN0b3IsY2hhb3NNZWFzdXJlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGNJbnZMZERhdGEoQ2FsY0xkRGF0YShncm91cEVuZXJneSk+PjIpICkKICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChpbnQpKCAoIDIgKyAoMipXSU5fVFlQRV9TQ0FMRSkgKyBTQ0FMRV9HUk9VUF9FTkVSR1kgKT4+MiApIDsKCiAgICB9CiAgfSBlbHNlIHsgLyogbG9uZy1ibG9jayAqLwoKICAgIHJlZFZhbFswXSA9IGZNdWx0KCBmTXVsdCh2YnJRdWFsRmFjdG9yLGNoYW9zTWVhc3VyZSksCiAgICAgICAgICAgICAgICAgICAgICAgQ2FsY0ludkxkRGF0YShDYWxjTGREYXRhKGZyYW1lRW5lcmd5KT4+MikgKQogICAgICAgICAgICAgICAgPDwgKGludCkoIFNDQUxFX0dST1VQX0VORVJHWT4+MiApIDsKICB9CgogIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgIHFjT3V0Q2hhbiAgPSBxY091dENoYW5uZWxbY2hdOwogICAgcHN5T3V0Q2hhbiAgPSBwc3lPdXRDaGFubmVsW2NoXTsKCiAgICBmb3IgKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7CiAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspewoKICAgICAgICBzZmJFbkxkRGF0YSAgPSAocWNPdXRDaGFuLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSk7CiAgICAgICAgc2ZiVGhyTGREYXRhID0gKHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdKTsKICAgICAgICBzZmJUaHJFeHAgICAgPSB0aHJFeHBbY2hdW3NmYkdycCtzZmJdOwoKICAgICAgICBpZiAoIChzZmJUaHJMZERhdGE+PU1JTl9MRFRIUkVTSCkgJiYgKHNmYkVuTGREYXRhID4gc2ZiVGhyTGREYXRhKSAmJiAoYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSAhPSBBSF9BQ1RJVkUpKSB7CgogICAgICAgICAgLyogU2hvcnQtV2luZG93ICovCiAgICAgICAgICBpZiAocHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHsKICAgICAgICAgICAgY29uc3QgaW50IGdyb3VwTnVtYmVyID0gKGludCkgc2ZiL3BzeU91dENoYW4tPnNmYlBlckdyb3VwOwoKICAgICAgICAgICAgRkRLX0FTU0VSVChJTlZfU1FSVDRfVEFCX1NJWkU+cHN5T3V0Q2hhbi0+Z3JvdXBMZW5bZ3JvdXBOdW1iZXJdKTsKCiAgICAgICAgICAgIHNmYlRockV4cCA9IGZNdWx0KHNmYlRockV4cCwgZk11bHQoIEZMMkZYQ09OU1RfREJMKDIuODJmLzQuZiksIGludlNxcnQ0W3BzeU91dENoYW4tPmdyb3VwTGVuW2dyb3VwTnVtYmVyXV0pKTw8MiA7CgogICAgICAgICAgICBpZiAoIHNmYlRockV4cCA8PSAobGltaXRUaHJSZWR1Y2VkTGREYXRhLXJlZFZhbFtncm91cE51bWJlcl0pICkgewogICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICgoRklYUF9EQkwpcmVkVmFsW2dyb3VwTnVtYmVyXSA+PSBGTDJGWENPTlNUX0RCTCgxLjBmKS1zZmJUaHJFeHApCiAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlZHVjdGlvbiBmb3JtdWxhICovCiAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IENhbGNMZERhdGEoc2ZiVGhyRXhwICsgcmVkVmFsW2dyb3VwTnVtYmVyXSk7CiAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA8PD0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhICs9ICggQ2FsY0xkSW50KHBzeU91dENoYW4tPmdyb3VwTGVuW2dyb3VwTnVtYmVyXSkgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGSVhQX0RCTCk2PDwoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSkgKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvKiBMb25nLVdpbmRvdyAqLwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICgoRklYUF9EQkwpcmVkVmFsWzBdID49IEZMMkZYQ09OU1RfREJMKDEuMGYpLXNmYlRockV4cCkgewogICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVkdWN0aW9uIGZvcm11bGEgKi8KICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gQ2FsY0xkRGF0YShzZmJUaHJFeHAgKyByZWRWYWxbMF0pOwogICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPDw9IDI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvKiBhdm9pZCBob2xlcyAqLwogICAgICAgICAgaWYgKCAoKHNmYlRoclJlZHVjZWRMZERhdGEgLSBzZmJFbkxkRGF0YSkgPiBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSApCiAgICAgICAgICAgICAgICAgICYmIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdICE9IE5PX0FIKSApCiAgICAgICAgICB7CiAgICAgICAgICAgIGlmIChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSAgPiAoRkwyRlhDT05TVF9EQkwoLTEuMGYpIC0gc2ZiRW5MZERhdGEpICl7CiAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heCgocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKyBzZmJFbkxkRGF0YSksIHNmYlRockxkRGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBzZmJUaHJSZWR1Y2VkTGREYXRhID0gc2ZiVGhyTGREYXRhOwogICAgICAgICAgICBhaEZsYWdbY2hdW3NmYkdycCtzZmJdID0gQUhfQUNUSVZFOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChzZmJUaHJSZWR1Y2VkTGREYXRhPEZMMkZYQ09OU1RfREJMKC0wLjVmKSkKICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IEZMMkZYQ09OU1RfREJMKC0xLmYpOwoKICAgICAgICAgIC8qIG1pbmltdW0gb2YgMjkgZEIgUmF0aW8gZm9yIFRocmVzaG9sZHMgKi8KICAgICAgICAgIGlmICgoc2ZiRW5MZERhdGErRkwyRlhDT05TVF9EQkwoMS4wZikpID4gRkwyRlhDT05TVF9EQkwoOS42MzM2MjA2L0xEX0RBVEFfU0NBTElORykpewogICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KHNmYlRoclJlZHVjZWRMZERhdGEsIHNmYkVuTGREYXRhIC0gRkwyRlhDT05TVF9EQkwoOS42MzM2MjA2L0xEX0RBVEFfU0NBTElORykpOwogICAgICAgICAgfQoKICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBmaXhNYXgoTUlOX0xEVEhSRVNILHNmYlRoclJlZHVjZWRMZERhdGEpOwoKICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gc2ZiVGhyUmVkdWNlZExkRGF0YTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jb3JyZWN0VGhyZXNoCmRlc2NyaXB0aW9uOiAgaWYgcGUgZGlmZmVyZW5jZSBkZWx0YVBlIGJldHdlZW4gZGVzaXJlZCBwZSBhbmQgcmVhbCBwZSBpcyBzbWFsbCBlbm91Z2gsCnRoZSBkaWZmZXJlbmNlIGNhbiBiZSBkaXN0cmlidXRlZCBhbW9uZyB0aGUgc2NhbGUgZmFjdG9yIGJhbmRzLgpOZXcgdGhyZXNob2xkcyBjYW4gYmUgZGVyaXZlZCBmcm9tIHRoaXMgcGUtZGlmZmVyZW5jZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvcnJlY3RUaHJlc2goQ0hBTk5FTF9NQVBQSU5HKiBjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogIHFjRWxlbWVudFsoOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudFsoOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgYWhGbGFnWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAgdGhyRXhwWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgRklYUF9EQkwgcmVkVmFsWyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgICAgICAgICBTQ0hBUiByZWRWYWxTY2FsaW5nWyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgICAgICAgICBJTlQgZGVsdGFQZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIElOVCBwcm9jZXNzRWxlbWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgICAgICAgICBJTlQgZWxlbWVudE9mZnNldCkKewogICBJTlQgY2gsIHNmYiwgc2ZiR3JwOwogICBRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFuOwogICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW47CiAgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YTsKICAgRklYUF9EQkwgdGhyRmFjdG9yTGREYXRhOwogICBGSVhQX0RCTCBzZmJFbkxkRGF0YSwgc2ZiVGhyTGREYXRhLCBzZmJUaHJSZWR1Y2VkTGREYXRhOwogICBGSVhQX0RCTCAqc2ZiUGVGYWN0b3JzTGREYXRhWyg4KV1bKDIpXTsKICAgRklYUF9EQkwgc2ZiTkFjdGl2ZUxpbmVzTGREYXRhWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdOwogICBJTlQgICAgICBub3JtRmFjdG9ySW50OwogICBGSVhQX0RCTCBub3JtRmFjdG9yTGREYXRhOwoKICAgSU5UIG5FbGVtZW50cyA9IGVsZW1lbnRPZmZzZXQrcHJvY2Vzc0VsZW1lbnRzOwogICBJTlQgZWxlbWVudElkOwoKICAgLyogc2NyYXRjaCBpcyBlbXB0eTsgdXNlIHRlbXBvcmFsIG1lbW9yeSBmcm9tIHF1YW50U3BlYyBpbiBRQ19PVVRfQ0hBTk5FTCAqLwogICBmb3IoZWxlbWVudElkPWVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewogICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgewogICAgICAgU0hPUlQqIHB0ciA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdLT5xdWFudFNwZWM7CiAgICAgICBzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF0gPSAoRklYUF9EQkwqKXB0cjsKICAgICB9CiAgIH0KCiAgIC8qIGZvciBlYWNoIHNmYiBjYWxjIHJlbGF0aXZlIGZhY3RvcnMgZm9yIHBlIGNoYW5nZXMgKi8KICAgbm9ybUZhY3RvckludCA9IDA7CgogICBmb3IoZWxlbWVudElkPWVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewogICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewoKICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgewoKICAgICAgICAgIHFjT3V0Q2hhbiA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOwogICAgICAgICAgcHN5T3V0Q2hhbiA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF07CiAgICAgICAgICBwZUNoYW5EYXRhID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGEucGVDaGFubmVsRGF0YVtjaF07CgogICAgICAgICAgZm9yKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApewogICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CgogICAgICAgICAgICAgaWYgKCBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gPT0gMCApIHsKICAgICAgICAgICAgICAgIHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyogQm90aCBDYWxjTGRJbnQgYW5kIENhbGNMZERhdGEgY2FuIGJlIHVzZWQhCiAgICAgICAgICAgICAgICAgKiBObyBvZmZzZXQgaGFzIHRvIGJlIHN1YnRyYWN0ZWQsIGJlY2F1c2Ugc2ZiTkFjdGl2ZUxpbmVzTGREYXRhCiAgICAgICAgICAgICAgICAgKiBpcyBzaG9ydGVkIHdoaWxlIHRockZhY3RvciBjYWxjdWxhdGlvbiAqLwogICAgICAgICAgICAgICAgc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gQ2FsY0xkSW50KHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoICgoYWhGbGFnW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdIDwgQUhfQUNUSVZFKSB8fCAoZGVsdGFQZSA+IDApKSAmJgogICAgICAgICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdICE9IDAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRockV4cFtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA+IC1yZWRWYWxbZWxlbWVudElkXSkgewoKICAgICAgICAgICAgICAgICAgIC8qIHNmYlBlRmFjdG9yc1tjaF1bc2ZiR3JwK3NmYl0gPSBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRockV4cFtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSArIHJlZFZhbFtlbGVtZW50SWRdKTsgKi8KCiAgICAgICAgICAgICAgICAgICBpbnQgbWluU2NhbGUgPSBmaXhNaW4oQ291bnRMZWFkaW5nQml0cyh0aHJFeHBbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0pLCBDb3VudExlYWRpbmdCaXRzKHJlZFZhbFtlbGVtZW50SWRdKSAtIChERlJBQ1RfQklUUy0xLXJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSkgKSAtIDE7CgogICAgICAgICAgICAgICAgICAgLyogc3VtbGQgPSBsZDY0KCBzZmJUaHJFeHAgKyByZWRWYWwgKSAqLwogICAgICAgICAgICAgICAgICAgRklYUF9EQkwgc3VtTGQgPSBDYWxjTGREYXRhKHNjYWxlVmFsdWUodGhyRXhwW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdLCBtaW5TY2FsZSkgKyBzY2FsZVZhbHVlKHJlZFZhbFtlbGVtZW50SWRdLCAoREZSQUNUX0JJVFMtMS1yZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF0pK21pblNjYWxlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChGSVhQX0RCTCkobWluU2NhbGU8PChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpKTsKCiAgICAgICAgICAgICAgICAgICBpZiAoc3VtTGQgPCBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CiAgICAgICAgICAgICAgICAgICAgICBzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPSBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gLSBzdW1MZDsKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA+IChGTDJGWENPTlNUX0RCTCgtMS5mKSArIHN1bUxkKSApIHsKICAgICAgICAgICAgICAgICAgICAgICBzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPSBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gLSBzdW1MZDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgIG5vcm1GYWN0b3JJbnQgKz0gKElOVClDYWxjSW52TGREYXRhKHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKDEuMGYpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KCiAgIC8qIG5vcm1GYWN0b3JMZERhdGEgPSBsZDY0KGRlbHRhUGUvbm9ybUZhY3RvckludCkgKi8KICAgbm9ybUZhY3RvckxkRGF0YSA9IENhbGNMZERhdGEoKEZJWFBfREJMKSgoZGVsdGFQZTwwKSA/ICgtZGVsdGFQZSkgOiAoZGVsdGFQZSkpKSAtIENhbGNMZERhdGEoKEZJWFBfREJMKW5vcm1GYWN0b3JJbnQpOwoKICAgLyogZGlzdHJpYnV0ZSB0aGUgcGUgZGlmZmVyZW5jZSB0byB0aGUgc2NhbGVmYWN0b3JzCiAgICAgIGFuZCBjYWxjdWxhdGUgdGhlIGFjY29yZGluZyB0aHJlc2hvbGRzICovCiAgIGZvcihlbGVtZW50SWQ9ZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CgogICAgICAgZm9yKGNoPTA7IGNoPGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CiAgICAgICAgICBxY091dENoYW4gPSBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsW2NoXTsKICAgICAgICAgIHBzeU91dENoYW4gPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdOwogICAgICAgICAgcGVDaGFuRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhLnBlQ2hhbm5lbERhdGFbY2hdOwoKICAgICAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7CiAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKCiAgICAgICAgICAgICAgaWYgKHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSA+IDApIHsKCiAgICAgICAgICAgICAgICAgLyogcGUgZGlmZmVyZW5jZSBmb3IgdGhpcyBzZmIgKi8KICAgICAgICAgICAgICAgICBpZiAoIChzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl09PUZMMkZYQ09OU1RfREJMKC0xLjBmKSkgfHwKICAgICAgICAgICAgICAgICAgICAgIChkZWx0YVBlPT0wKSApCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgdGhyRmFjdG9yTGREYXRhID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAvKiBuZXcgdGhyZXNob2xkICovCiAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB0bXAgPSBDYWxjSW52TGREYXRhKHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSArIG5vcm1GYWN0b3JMZERhdGEgLSBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gLSBGTDJGWENPTlNUX0RCTCgoZmxvYXQpTERfREFUQV9TSElGVC9MRF9EQVRBX1NDQUxJTkcpKTsKCiAgICAgICAgICAgICAgICAgICAvKiBsaW1pdCB0aHJGYWN0b3IgdG8gNjBkQiAqLwogICAgICAgICAgICAgICAgICAgdG1wID0gKGRlbHRhUGU8MCkgPyB0bXAgOiAoLXRtcCk7CiAgICAgICAgICAgICAgICAgICB0aHJGYWN0b3JMZERhdGEgPSBGREttaW4odG1wLCBGTDJGWENPTlNUX0RCTCgyMC5mL0xEX0RBVEFfU0NBTElORykpOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgLyogbmV3IHRocmVzaG9sZCAqLwogICAgICAgICAgICAgICAgIHNmYlRockxkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdOwogICAgICAgICAgICAgICAgIHNmYkVuTGREYXRhICA9IHFjT3V0Q2hhbi0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07CgogICAgICAgICAgICAgICAgIGlmICh0aHJGYWN0b3JMZERhdGEgPCBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CiAgICAgICAgICAgICAgICAgICBpZiggc2ZiVGhyTGREYXRhID4gKEZMMkZYQ09OU1RfREJMKC0xLmYpLXRockZhY3RvckxkRGF0YSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBzZmJUaHJMZERhdGEgKyB0aHJGYWN0b3JMZERhdGE7CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IEZMMkZYQ09OU1RfREJMKC0xLmYpOwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBzZmJUaHJMZERhdGEgKyB0aHJGYWN0b3JMZERhdGE7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAvKiBhdm9pZCBob2xlICovCiAgICAgICAgICAgICAgICAgaWYgKCAoc2ZiVGhyUmVkdWNlZExkRGF0YSAtIHNmYkVuTGREYXRhID4gcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0pICYmCiAgICAgICAgICAgICAgICAgICAgICAoYWhGbGFnW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID09IEFIX0lOQUNUSVZFKSApCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8qIHNmYlRoclJlZHVjZWQgPSBtYXgocHN5T3V0Q2hhbltjaF0tPnNmYk1pblNucltpXSAqIHNmYkVuLCBzZmJUaHIpOyAqLwogICAgICAgICAgICAgICAgICAgIGlmICggc2ZiRW5MZERhdGEgPiAoc2ZiVGhyTGREYXRhLXFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdICsgc2ZiRW5MZERhdGE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gc2ZiVGhyTGREYXRhOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPSBBSF9BQ1RJVkU7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9IHNmYlRoclJlZHVjZWRMZERhdGE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfcmVkdWNlTWluU25yCiAgICBkZXNjcmlwdGlvbjogIGlmIHRoZSBkZXNpcmVkIHBlIGNhbiBub3QgYmUgcmVhY2hlZCwgcmVkdWNlIHBlIGJ5CiAgICAgICAgICAgICAgICAgIHJlZHVjaW5nIG1pblNucgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBGREthYWNFbmNfcmVkdWNlTWluU25yKENIQU5ORUxfTUFQUElORyogY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogIHFjRWxlbWVudFsoOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgIGFoRmxhZ1soOCldWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgSU5UIGRlc2lyZWRQZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogICAgICAgICAgICAgcmVkUGVHbG9iYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIElOVCBwcm9jZXNzRWxlbWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIElOVCBlbGVtZW50T2Zmc2V0KQoKewogICBJTlQgZWxlbWVudElkOwogICBJTlQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCtwcm9jZXNzRWxlbWVudHM7CgogICBJTlQgbmV3R2xvYmFsUGUgPSAqcmVkUGVHbG9iYWw7CgogICBmb3IoZWxlbWVudElkPWVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewogICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewogICAgICAgSU5UIGNoOwogICAgICAgSU5UIG1heFNmYlBlckdyb3VwWzJdOwogICAgICAgSU5UIHNmYkNudFsyXTsKICAgICAgIElOVCBzZmJQZXJHcm91cFsyXTsKCiAgICAgICBmb3IoY2g9MDsgY2g8Y20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAtMTsKICAgICAgICAgc2ZiQ250W2NoXSAgICAgICAgID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OwogICAgICAgICBzZmJQZXJHcm91cFtjaF0gICAgPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cDsKICAgICAgIH0KCiAgICAgICBQRV9EQVRBICpwZURhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKCiAgICAgICBkbwogICAgICAgewogICAgICAgICBmb3IoY2g9MDsgY2g8Y20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKCiAgICAgICAgICAgIElOVCBzZmIsIHNmYkdycDsKICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW4gPSBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsW2NoXTsKICAgICAgICAgICAgSU5UIG5vUmVkdWN0aW9uID0gMTsKCiAgICAgICAgICAgIGlmIChtYXhTZmJQZXJHcm91cFtjaF0+PTApIHsgIC8qIHNmYiBpbiBuZXh0IGNoYW5uZWwgKi8KICAgICAgICAgICAgICBJTlQgZGVsdGFQZSA9IDA7CiAgICAgICAgICAgICAgc2ZiID0gbWF4U2ZiUGVyR3JvdXBbY2hdLS07CiAgICAgICAgICAgICAgbm9SZWR1Y3Rpb24gPSAwOwoKICAgICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHNmYkNudFtjaF07IHNmYkdycCArPSBzZmJQZXJHcm91cFtjaF0pIHsKCiAgICAgICAgICAgICAgICBpZiAoYWhGbGFnW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdICE9IE5PX0FIICYmCiAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPCBTbnJMZEZhYykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgLyogaW5jcmVhc2UgdGhyZXNob2xkIHRvIG5ldyBtaW5TbnIgb2YgMWRCICovCiAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gU25yTGRGYWM7CgogICAgICAgICAgICAgICAgICAvKiBzZmJUaHJSZWR1Y2VkID0gbWF4KHBzeU91dENoYW5bY2hdLT5zZmJNaW5TbnJbaV0gKiBzZmJFbiwgc2ZiVGhyKTsgKi8KICAgICAgICAgICAgICAgICAgaWYgKCBxY091dENoYW4tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdID49IHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdIC0gcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKSB7CgogICAgICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9IHFjT3V0Q2hhbi0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gKyBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXTsKCiAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGMgbmV3IHBlICovCiAgICAgICAgICAgICAgICAgICAgIC8qIEMyICsgQzMqbGQoMS8wLjgpID0gMS41ICovCiAgICAgICAgICAgICAgICAgICAgIGRlbHRhUGUgLT0gKHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiR3JwK3NmYl0+PlBFX0NPTlNUUEFSVF9TSElGVCk7CgogICAgICAgICAgICAgICAgICAgICAvKiBzZmJQZSA9IDEuNSAqIHNmYk5MaW5lcyAqLwogICAgICAgICAgICAgICAgICAgICBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYkdycCtzZmJdID0gKDMqcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJOTGluZXNbc2ZiR3JwK3NmYl0pIDw8IChQRV9DT05TVFBBUlRfU0hJRlQtMSk7CiAgICAgICAgICAgICAgICAgICAgIGRlbHRhUGUgKz0gKHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiR3JwK3NmYl0+PlBFX0NPTlNUUEFSVF9TSElGVCk7CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIH0gLyogc2ZiR3JwIGxvb3AgKi8KCiAgICAgICAgICAgICAgcGVEYXRhLT5wZSArPSBkZWx0YVBlOwogICAgICAgICAgICAgIHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0ucGUgKz0gZGVsdGFQZTsKICAgICAgICAgICAgICBuZXdHbG9iYWxQZSArPSBkZWx0YVBlOwoKICAgICAgICAgICAgICAvKiBzdG9wIGlmIGVub3VnaCBoYXMgYmVlbiBzYXZlZCAqLwogICAgICAgICAgICAgIGlmIChwZURhdGEtPnBlIDw9IGRlc2lyZWRQZSkgewogICAgICAgICAgICAgICAgZ290byBiYWlsOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0gLyogc2ZiID4gMCAqLwoKICAgICAgICAgICAgaWYgKCAoY2g9PShjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbC0xKSkgJiYgbm9SZWR1Y3Rpb24gKSB7CiAgICAgICAgICAgICAgZ290byBiYWlsOwogICAgICAgICAgICB9CgogICAgICAgICB9IC8qIGNoIGxvb3AgKi8KCiAgICAgICB9IHdoaWxlICggcGVEYXRhLT5wZSA+IGRlc2lyZWRQZSk7CgogICAgIH0gLyogIT0gSURfRFNFICovCiAgIH0gLyogZWxlbWVudCBsb29wICovCgoKYmFpbDoKICAgLyogdXBkYXRlIGdsb2JhbCBQRSAqLwogICAqcmVkUGVHbG9iYWwgPSBuZXdHbG9iYWxQZTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfYWxsb3dNb3JlSG9sZXMKICAgIGRlc2NyaXB0aW9uOiAgaWYgdGhlIGRlc2lyZWQgcGUgY2FuIG5vdCBiZSByZWFjaGVkLCBzb21lIG1vcmUgc2NhbGVmYWN0b3IKICAgICAgICAgICAgICAgICAgYmFuZHMgaGF2ZSB0byBiZSBxdWFudGl6ZWQgdG8gemVybwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgRkRLYWFjRW5jX2FsbG93TW9yZUhvbGVzKENIQU5ORUxfTUFQUElORyogY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgcWNFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudFsoOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogICAgIEFkalRoclN0YXRlRWxlbWVudFsoOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgIGFoRmxhZ1soOCldWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBkZXNpcmVkUGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgY3VycmVudFBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgIHByb2Nlc3NFbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICBlbGVtZW50T2Zmc2V0KQp7CiAgSU5UIGVsZW1lbnRJZDsKICBJTlQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCtwcm9jZXNzRWxlbWVudHM7CiAgSU5UIGFjdFBlID0gY3VycmVudFBlOwoKICBpZiAoYWN0UGUgPD0gZGVzaXJlZFBlKSB7CiAgICByZXR1cm47IC8qIG5vdGhpbmcgdG8gZG8gKi8KICB9CgogIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKCiAgICAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CgogICAgICBQRV9EQVRBICpwZURhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKICAgICAgY29uc3QgSU5UIG5DaGFubmVscyA9IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOwoKICAgICAgUUNfT1VUX0NIQU5ORUwqICBxY091dENoYW5uZWxbKDIpXSA9IHtOVUxMfTsKICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0gPSB7TlVMTH07CgogICAgICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewoKICAgICAgICAvKiBpbml0IHBvaW50ZXJzICovCiAgICAgICAgcWNPdXRDaGFubmVsW2NoXSA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOwogICAgICAgIHBzeU91dENoYW5uZWxbY2hdID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXTsKCiAgICAgICAgZm9yKHNmYkdycD0wOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKICAgICAgICAgIGZvciAoc2ZiPXBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICAgICAgcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJQZVtzZmJHcnArc2ZiXSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKiBmb3IgTVMgYWxsb3cgaG9sZSBpbiB0aGUgY2hhbm5lbCB3aXRoIGxlc3MgZW5lcmd5ICovCiAgICAgIGlmICggbkNoYW5uZWxzPT0yICYmIHBzeU91dENoYW5uZWxbMF0tPmxhc3RXaW5kb3dTZXF1ZW5jZT09cHN5T3V0Q2hhbm5lbFsxXS0+bGFzdFdpbmRvd1NlcXVlbmNlICkgewoKICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFswXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgICBmb3Ioc2ZiR3JwPTA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbMF0tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsWzBdLT5zZmJQZXJHcm91cCkgewogICAgICAgICAgICBpZiAocHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT50b29sc0luZm8ubXNNYXNrW3NmYkdycCtzZmJdKSB7CiAgICAgICAgICAgICAgRklYUF9EQkwgRW5lcmd5TGRfTCA9IHFjT3V0Q2hhbm5lbFswXS0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07CiAgICAgICAgICAgICAgRklYUF9EQkwgRW5lcmd5TGRfUiA9IHFjT3V0Q2hhbm5lbFsxXS0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07CgogICAgICAgICAgICAgIC8qIGFsbG93IGhvbGUgaW4gc2lkZSBjaGFubmVsID8gKi8KICAgICAgICAgICAgICBpZiAoIChhaEZsYWdbZWxlbWVudElkXVsxXVtzZmJHcnArc2ZiXSAhPSBOT19BSCkgJiYKICAgICAgICAgICAgICAgICAgICgoKEZMMkZYQ09OU1RfREJMKC0wLjAyMDY1NTEyNjQ4Zik+PjEpICsgKHFjT3V0Q2hhbm5lbFswXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdPj4xKSkKICAgICAgICAgICAgICAgICAgICAgICAgPiAoKEVuZXJneUxkX1I+PjEpIC0gKEVuZXJneUxkX0w+PjEpKSkgKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgYWhGbGFnW2VsZW1lbnRJZF1bMV1bc2ZiR3JwK3NmYl0gPSBOT19BSDsKICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzFdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gPSBGTDJGWENPTlNUX0RCTCgwLjAxNTYyNWYpICsgRW5lcmd5TGRfUjsKICAgICAgICAgICAgICAgICAgYWN0UGUgLT0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhWzFdLnNmYlBlW3NmYkdycCtzZmJdPj5QRV9DT05TVFBBUlRfU0hJRlQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8qIGFsbG93IGhvbGUgaW4gbWlkIGNoYW5uZWwgPyAqLwogICAgICAgICAgICAgIGVsc2UgaWYgKCAoYWhGbGFnW2VsZW1lbnRJZF1bMF1bc2ZiR3JwK3NmYl0gIT0gTk9fQUgpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICgoKEZMMkZYQ09OU1RfREJMKC0wLjAyMDY1NTEyNjQ4Zik+PjEpICsgKHFjT3V0Q2hhbm5lbFsxXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdPj4xKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+ICgoRW5lcmd5TGRfTD4+MSkgLSAoRW5lcmd5TGRfUj4+MSkpKSApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBhaEZsYWdbZWxlbWVudElkXVswXVtzZmJHcnArc2ZiXSA9IE5PX0FIOwogICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKDAuMDE1NjI1ZikgKyBFbmVyZ3lMZF9MOwogICAgICAgICAgICAgICAgICBhY3RQZSAtPSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbMF0uc2ZiUGVbc2ZiR3JwK3NmYl0+PlBFX0NPTlNUUEFSVF9TSElGVDsKICAgICAgICAgICAgICB9IC8qIGlmIChhaEZsYWcpICovCiAgICAgICAgICAgIH0gLyogaWYgTVMgKi8KICAgICAgICAgIH0gLyogc2ZiR3JwICovCiAgICAgICAgICBpZiAoYWN0UGUgPD0gZGVzaXJlZFBlKSB7CiAgICAgICAgICAgIHJldHVybjsgLyogc3RvcCBpZiBlbm91Z2ggaGFzIGJlZW4gc2F2ZWQgKi8KICAgICAgICAgIH0KICAgICAgICB9IC8qIHNmYiAqLwogICAgICB9IC8qIE1TIHBvc3NpYmxlID8gKi8KCiAgICAgIC8qIG1vcmUgaG9sZXMgbmVjZXNzYXJ5PyBzdWJzZXF1ZW50bHkgZXJhc2UgYmFuZHMKICAgICAgICAgc3RhcnRpbmcgd2l0aCBsb3cgZW5lcmdpZXMgKi8KICAgICAgSU5UIHN0YXJ0U2ZiWzJdOwogICAgICBGSVhQX0RCTCBhdmdFbkxENjQsbWluRW5MRDY0OwogICAgICBJTlQgYWhDbnQ7CiAgICAgIEZJWFBfREJMIGFoQ250TEQ2NDsKICAgICAgSU5UIGVuSWR4OwogICAgICBGSVhQX0RCTCBlbkxENjRbNF07CiAgICAgIEZJWFBfREJMIGF2Z0VuOwoKICAgICAgLyogZG8gbm90IGdvIGJlbG93IHN0YXJ0U2ZiICovCiAgICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQogICAgICAgICAgc3RhcnRTZmJbY2hdID0gQWRqVGhyU3RhdGVFbGVtZW50W2VsZW1lbnRJZF0tPmFoUGFyYW0uc3RhcnRTZmJMOwogICAgICAgIGVsc2UKICAgICAgICAgIHN0YXJ0U2ZiW2NoXSA9IEFkalRoclN0YXRlRWxlbWVudFtlbGVtZW50SWRdLT5haFBhcmFtLnN0YXJ0U2ZiUzsKICAgICAgfQoKICAgICAgLyogY2FsYyBhdmcgYW5kIG1pbiBlbmVyZ2llcyBvZiBiYW5kcyB0aGF0IGF2b2lkIGhvbGVzICovCiAgICAgIGF2Z0VuID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgIG1pbkVuTEQ2NCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICBhaENudCA9IDA7CgogICAgICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewoKICAgICAgICBzZmJHcnA9MDsKICAgICAgICBzZmI9c3RhcnRTZmJbY2hdOwoKICAgICAgICBkbyB7CiAgICAgICAgICBmb3IgKDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICAgICAgaWYgKChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0hPU5PX0FIKSAmJgogICAgICAgICAgICAgICAgKHFjT3V0Q2hhbm5lbFtjaF0tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdID4gcWNPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdKSl7CiAgICAgICAgICAgICAgbWluRW5MRDY0ID0gZml4TWluKG1pbkVuTEQ2NCxxY091dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0pOwogICAgICAgICAgICAgIGF2Z0VuICs9IHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneVtzZmJHcnArc2ZiXSA+PiA2OwogICAgICAgICAgICAgIGFoQ250Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwOwogICAgICAgICAgc2ZiPTA7CgogICAgICAgIH0gd2hpbGUgKHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQpOwogICAgICB9CgogICAgICBpZiAoIChhdmdFbiA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgfHwgKGFoQ250ID09IDApICkgewogICAgICAgIGF2Z0VuTEQ2NCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGF2Z0VuTEQ2NCA9IENhbGNMZERhdGEoYXZnRW4pOwogICAgICAgIGFoQ250TEQ2NCA9IENhbGNMZEludChhaENudCk7CiAgICAgICAgYXZnRW5MRDY0ID0gYXZnRW5MRDY0ICsgRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpIC0gYWhDbnRMRDY0OyAvKiBjb21wZW5zYXRlIHNoaWZ0IHdpdGggNiAqLwogICAgICB9CgogICAgICAvKiBjYWxjIHNvbWUgZW5lcmd5IGJvcmRlcnMgYmV0d2VlbiBtaW5FbiBhbmQgYXZnRW4gKi8KICAgICAgLyogZm9yIChlbklkeD0wOyBlbklkeDw0OyBlbklkeCsrKSAqLwogICAgICAgIC8qIGVuW2VuSWR4XSA9IG1pbkVuICogKGZsb2F0KUZES3BvdyhhdmdFbi8obWluRW4rRkxUX01JTiksICgyKmVuSWR4KzEpLzcuMGYpOyAqLwogICAgICBlbkxENjRbMF0gPSBtaW5FbkxENjQgKyBmTXVsdCgoYXZnRW5MRDY0LW1pbkVuTEQ2NCksRkwyRlhDT05TVF9EQkwoMC4xNDI4NTcxNDI4NWYpKTsKICAgICAgZW5MRDY0WzFdID0gbWluRW5MRDY0ICsgZk11bHQoKGF2Z0VuTEQ2NC1taW5FbkxENjQpLEZMMkZYQ09OU1RfREJMKDAuNDI4NTcxNDI4NTdmKSk7CiAgICAgIGVuTEQ2NFsyXSA9IG1pbkVuTEQ2NCArIGZNdWx0KChhdmdFbkxENjQtbWluRW5MRDY0KSxGTDJGWENPTlNUX0RCTCgwLjcxNDI4NTcxNDI4ZikpOwogICAgICBlbkxENjRbM10gPSBtaW5FbkxENjQgKyAoYXZnRW5MRDY0LW1pbkVuTEQ2NCk7CgogICAgICBmb3IgKGVuSWR4PTA7IGVuSWR4PDQ7IGVuSWR4KyspIHsKICAgICAgICBJTlQgbm9SZWR1Y3Rpb24gPSAxOwoKICAgICAgICBJTlQgbWF4U2ZiUGVyR3JvdXBbMl07CiAgICAgICAgSU5UIHNmYkNudFsyXTsKICAgICAgICBJTlQgc2ZiUGVyR3JvdXBbMl07CgogICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgewogICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAtMTsKICAgICAgICAgIHNmYkNudFtjaF0gICAgICAgICA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKICAgICAgICAgIHNmYlBlckdyb3VwW2NoXSAgICA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwOwogICAgICAgIH0KCiAgICAgICAgZG8gewoKICAgICAgICAgIG5vUmVkdWN0aW9uID0gMTsKCiAgICAgICAgICBmb3IoY2g9MDsgY2g8Y20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKCiAgICAgICAgICAgIElOVCBzZmIsIHNmYkdycDsKCiAgICAgICAgICAgIC8qIHN0YXJ0IHdpdGggbG93ZXN0IGVuZXJneSBib3JkZXIgYXQgaGlnaGVzdCBzZmIgKi8KICAgICAgICAgICAgaWYgKG1heFNmYlBlckdyb3VwW2NoXT49c3RhcnRTZmJbY2hdKSB7ICAvKiBzZmIgaW4gbmV4dCBjaGFubmVsICovCiAgICAgICAgICAgICAgc2ZiID0gbWF4U2ZiUGVyR3JvdXBbY2hdLS07CiAgICAgICAgICAgICAgbm9SZWR1Y3Rpb24gPSAwOwoKICAgICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHNmYkNudFtjaF07IHNmYkdycCArPSBzZmJQZXJHcm91cFtjaF0pIHsKICAgICAgICAgICAgICAgIC8qIHNmYiBlbmVyZ3kgYmVsb3cgYm9yZGVyID8gKi8KICAgICAgICAgICAgICAgIGlmIChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gIT0gTk9fQUggJiYgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdIDwgZW5MRDY0W2VuSWR4XSkgewogICAgICAgICAgICAgICAgICAvKiBhbGxvdyBob2xlICovCiAgICAgICAgICAgICAgICAgIGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IE5PX0FIOwogICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gPSBGTDJGWENPTlNUX0RCTCgwLjAxNTYyNWYpICsgcWNPdXRDaGFubmVsW2NoXS0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07CiAgICAgICAgICAgICAgICAgIGFjdFBlIC09IHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiR3JwK3NmYl0+PlBFX0NPTlNUUEFSVF9TSElGVDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IC8qIHNmYkdycCAgKi8KCiAgICAgICAgICAgICAgaWYgKGFjdFBlIDw9IGRlc2lyZWRQZSkgewogICAgICAgICAgICAgICAgcmV0dXJuOyAvKiBzdG9wIGlmIGVub3VnaCBoYXMgYmVlbiBzYXZlZCAqLwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAvKiBzZmIgPiAwICovCiAgICAgICAgICB9IC8qIGNoIGxvb3AgKi8KCiAgICAgICAgfSB3aGlsZSggKG5vUmVkdWN0aW9uID09IDApICYmIChhY3RQZSA+IGRlc2lyZWRQZSkgKTsKCiAgICAgICAgaWYgKGFjdFBlIDw9IGRlc2lyZWRQZSkgewogICAgICAgICAgcmV0dXJuOyAvKiBzdG9wIGlmIGVub3VnaCBoYXMgYmVlbiBzYXZlZCAqLwogICAgICAgIH0KCiAgICAgIH0gLyogZW5JZHggbG9vcCAqLwoKICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLwogIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KCn0KCi8qIHJlc2V0IGF2b2lkIGhvbGUgZmxhZ3MgZnJvbSBBSF9BQ1RJVkUgdG8gQUhfSU5BQ1RJVkUgICovCnN0YXRpYyB2b2lkIEZES2FhY0VuY19yZXNldEFIRmxhZ3MoIFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICpwc3lPdXRDaGFubmVsWygyKV0pCnsKICBpbnQgY2gsIHNmYiwgc2ZiR3JwOwoKICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICBmb3IgKHNmYkdycD0wOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewogICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgIGlmICggYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA9PSBBSF9BQ1RJVkUpIHsKICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBBSF9JTkFDVElWRTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCgpzdGF0aWMgRklYUF9EQkwgQ2FsY1JlZFZhbFBvd2VyKEZJWFBfREJMIG51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBkZW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQqICAgICBzY2FsaW5nICkKewogICAgRklYUF9EQkwgdmFsdWUgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwoKICAgIGlmIChudW0+PUZMMkZYQ09OU1RfREJMKDAuZikpIHsKICAgICAgdmFsdWUgPSBmRGl2Tm9ybSggbnVtLCBkZW51bSwgc2NhbGluZyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgdmFsdWUgPSAtZkRpdk5vcm0oIC1udW0sIGRlbnVtLCBzY2FsaW5nKTsKICAgIH0KICAgIHZhbHVlID0gZjJQb3codmFsdWUsICpzY2FsaW5nLCBzY2FsaW5nKTsKICAgICpzY2FsaW5nID0gREZSQUNUX0JJVFMtMS0qc2NhbGluZzsKCiAgICByZXR1cm4gdmFsdWU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfYWRhcHRUaHJlc2hvbGRzVG9QZQpkZXNjcmlwdGlvbjogIHR3byBndWVzc2VzIGZvciB0aGUgcmVkdWN0aW9uIHZhbHVlIGFuZCBvbmUgZmluYWwgY29ycmVjdGlvbiBvZiB0aGUgdGhyZXNob2xkcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgRkRLYWFjRW5jX2FkYXB0VGhyZXNob2xkc1RvUGUoQ0hBTk5FTF9NQVBQSU5HKiAgY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqICAgICAgQWRqVGhyU3RhdGVFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICAgcWNFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiAgcHN5T3V0RWxlbWVudFsoOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIGRlc2lyZWRQZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICBtYXhJdGVyMm5kR3Vlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgcHJvY2Vzc0VsZW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIGVsZW1lbnRPZmZzZXQpCnsKICAgRklYUF9EQkwgcmVkVmFsdWVbKDgpXTsKICAgU0NIQVIgICAgcmVkVmFsU2NhbGluZ1soOCldOwogICBVQ0hBUiAgICBwQWhGbGFnWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdOwogICBGSVhQX0RCTCBwVGhyRXhwWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdOwogICBpbnQgaXRlcjsKCiAgIElOVCBjb25zdFBhcnRHbG9iYWwsIG5vUmVkUGVHbG9iYWwsIG5BY3RpdmVMaW5lc0dsb2JhbCwgcmVkUGVHbG9iYWw7CiAgIGNvbnN0UGFydEdsb2JhbCA9IG5vUmVkUGVHbG9iYWwgPSBuQWN0aXZlTGluZXNHbG9iYWwgPSByZWRQZUdsb2JhbCA9IDA7CgogICBpbnQgZWxlbWVudElkOwoKICAgaW50IG5FbGVtZW50cyA9IGVsZW1lbnRPZmZzZXQrcHJvY2Vzc0VsZW1lbnRzOwogICBpZihuRWxlbWVudHMgPiBjbS0+bkVsZW1lbnRzKSB7CiAgICAgbkVsZW1lbnRzID0gY20tPm5FbGVtZW50czsKICAgfQoKICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAvKiBQYXJ0IEk6IEluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCB2YXJpYWJsZXMuLi4gKi8KICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewogICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewoKICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKICAgICAgIFBFX0RBVEEgKnBlRGF0YSAgICA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwoKICAgICAgIC8qIHRocmVzaG9sZHMgdG8gdGhlIHBvd2VyIG9mIHJlZEV4cCAqLwogICAgICAgRkRLYWFjRW5jX2NhbGNUaHJlc2hFeHAocFRockV4cFtlbGVtZW50SWRdLCBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7CgogICAgICAgLyogbG93ZXIgdGhlIG1pblNuciByZXF1aXJlbWVudHMgZm9yIGxvdyBlbmVyZ2llcyBjb21wYXJlZCB0byB0aGUgYXZlcmFnZQogICAgICAgICAgZW5lcmd5IGluIHRoaXMgZnJhbWUgKi8KICAgICAgIEZES2FhY0VuY19hZGFwdE1pblNucihxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsICZBZGpUaHJTdGF0ZUVsZW1lbnRbZWxlbWVudElkXS0+bWluU25yQWRhcHRQYXJhbSwgbkNoYW5uZWxzKTsKCiAgICAgICAvKiBpbml0IGFoRmxhZyAoMDogbm8gYWggbmVjZXNzYXJ5LCAxOiBhaCBwb3NzaWJsZSwgMjogYWggYWN0aXZlICovCiAgICAgICBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcocWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBwQWhGbGFnW2VsZW1lbnRJZF0sICZwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnRvb2xzSW5mbywgbkNoYW5uZWxzLCBwZURhdGEsICZBZGpUaHJTdGF0ZUVsZW1lbnRbZWxlbWVudElkXS0+YWhQYXJhbSk7CgogICAgICAgLyogc3VtIHVwICovCiAgICAgICBjb25zdFBhcnRHbG9iYWwgICAgKz0gcGVEYXRhLT5jb25zdFBhcnQ7CiAgICAgICBub1JlZFBlR2xvYmFsICAgICAgKz0gcGVEYXRhLT5wZTsKICAgICAgIG5BY3RpdmVMaW5lc0dsb2JhbCArPSBmaXhNYXgoKElOVClwZURhdGEtPm5BY3RpdmVMaW5lcywgMSk7CgogICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLwogICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCgogICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAvKiBQYXJ0IElJOiBDYWxjdWxhdGUgYml0IGNvbnN1bXB0aW9uIG9mIGluaXRpYWwgYml0IGNvbnN0cmFpbnRzIHNldHVwICovCiAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CiAgICAgICAvKgogICAgICAgcmVkVmFsID0gKCAyIF4gKCAoY29uc3RQYXJ0R2xvYmFsLWRlc2lyZWRQZSkgLyAoaW52UmVkRXhwKm5BY3RpdmVMaW5lc0dsb2JhbCkgKQogICAgICAgICAgICAgICAgLSAyIF4gKCAoY29uc3RQYXJ0R2xvYmFsLW5vUmVkUGVHbG9iYWwpIC8gKGludlJlZEV4cCpuQWN0aXZlTGluZXNHbG9iYWwpICkgKQogICAgICAgKi8KCgogICAgICAgSU5UIG5DaGFubmVscyA9IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOwogICAgICAgUEVfREFUQSAqcGVEYXRhICAgID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGE7CgogICAgICAgLyogZmlyc3QgZ3Vlc3Mgb2YgcmVkdWN0aW9uIHZhbHVlICovCiAgICAgICBpbnQgc2NhbGUwPTAsIHNjYWxlMT0wOwogICAgICAgRklYUF9EQkwgdG1wMCA9IENhbGNSZWRWYWxQb3dlciggY29uc3RQYXJ0R2xvYmFsLWRlc2lyZWRQZSwgNCpuQWN0aXZlTGluZXNHbG9iYWwsICZzY2FsZTAgKTsKICAgICAgIEZJWFBfREJMIHRtcDEgPSBDYWxjUmVkVmFsUG93ZXIoIGNvbnN0UGFydEdsb2JhbC1ub1JlZFBlR2xvYmFsLCA0Km5BY3RpdmVMaW5lc0dsb2JhbCwgJnNjYWxlMSApOwoKICAgICAgIGludCBzY2FsTWluID0gRkRLbWluKHNjYWxlMCwgc2NhbGUxKS0xOwoKICAgICAgIHJlZFZhbHVlW2VsZW1lbnRJZF0gID0gc2NhbGVWYWx1ZSh0bXAwLChzY2FsTWluLXNjYWxlMCkpIC0gc2NhbGVWYWx1ZSh0bXAxLChzY2FsTWluLXNjYWxlMSkpOwogICAgICAgcmVkVmFsU2NhbGluZ1tlbGVtZW50SWRdID0gc2NhbE1pbjsKCiAgICAgICAvKiByZWR1Y2UgdGhyZXNob2xkcyAqLwogICAgICAgRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNDQlIocWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBwQWhGbGFnW2VsZW1lbnRJZF0sIHBUaHJFeHBbZWxlbWVudElkXSwgbkNoYW5uZWxzLCByZWRWYWx1ZVtlbGVtZW50SWRdLCByZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF0pOwoKICAgICAgIC8qIHBlIGFmdGVyIGZpcnN0IGd1ZXNzICovCiAgICAgICBGREthYWNFbmNfY2FsY1BlKHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcGVEYXRhLCBuQ2hhbm5lbHMpOwoKICAgICAgIHJlZFBlR2xvYmFsICs9IHBlRGF0YS0+cGU7CiAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCiAgIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KCiAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgIC8qIFBhcnQgSUlJOiBJdGVyYXRlIHVudGlsIGJpdCBjb25zdHJhaW50cyBhcmUgbWV0ICovCiAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgIGl0ZXIgPSAwOwogICB3aGlsZSAoKGZpeHBfYWJzKHJlZFBlR2xvYmFsIC0gZGVzaXJlZFBlKSA+IGZNdWx0SShGTDJGWENPTlNUX0RCTCgwLjA1ZiksZGVzaXJlZFBlKSkgJiYgKGl0ZXIgPCBtYXhJdGVyMm5kR3Vlc3MpKSB7CgogICAgIElOVCBkZXNpcmVkUGVOb0FIR2xvYmFsOwogICAgIElOVCByZWRQZU5vQUhHbG9iYWwgPSAwOwogICAgIElOVCBjb25zdFBhcnROb0FIR2xvYmFsID0gMDsKICAgICBJTlQgbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCA9IDA7CgogICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CiAgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKCiAgICAgICAgIElOVCByZWRQZU5vQUgsIGNvbnN0UGFydE5vQUgsIG5BY3RpdmVMaW5lc05vQUg7CiAgICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKICAgICAgICAgUEVfREFUQSAqcGVEYXRhICAgID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGE7CgogICAgICAgICAvKiBwZSBmb3IgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZSAqLwogICAgICAgICBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZU5vQUgoJnJlZFBlTm9BSCwgJmNvbnN0UGFydE5vQUgsICZuQWN0aXZlTGluZXNOb0FILAogICAgICAgICAgICAgICAgICAgIHBlRGF0YSwgcEFoRmxhZ1tlbGVtZW50SWRdLCBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7CgogICAgICAgICByZWRQZU5vQUhHbG9iYWwgKz0gcmVkUGVOb0FIOwogICAgICAgICBjb25zdFBhcnROb0FIR2xvYmFsICs9IGNvbnN0UGFydE5vQUg7CiAgICAgICAgIG5BY3RpdmVMaW5lc05vQUhHbG9iYWwgKz0gbkFjdGl2ZUxpbmVzTm9BSDsKICAgICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLwogICAgIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KCiAgICAgLyogQ2FsY3VsYXRlIG5ldyByZWRWYWwgLi4uICovCiAgICAgaWYoZGVzaXJlZFBlIDwgcmVkUGVHbG9iYWwpIHsKCiAgICAgICAvKiBuZXcgZGVzaXJlZCBwZSB3aXRob3V0IGJhbmRzIHdoZXJlIGF2b2lkIGhvbGUgaXMgYWN0aXZlICovCiAgICAgICBkZXNpcmVkUGVOb0FIR2xvYmFsID0gZGVzaXJlZFBlIC0gKHJlZFBlR2xvYmFsIC0gcmVkUGVOb0FIR2xvYmFsKTsKCiAgICAgICAvKiBsaW1pdCBkZXNpcmVkUGVOb0FIIHRvIHBvc2l0aXZlIHZhbHVlcywgYXMgdGhlIFBFIGNhbiBub3QgYmVjb21lIG5lZ2F0aXZlICovCiAgICAgICBkZXNpcmVkUGVOb0FIR2xvYmFsID0gRkRLbWF4KDAsZGVzaXJlZFBlTm9BSEdsb2JhbCk7CgogICAgICAgLyogc2Vjb25kIGd1ZXNzIChvbmx5IGlmIHRoZXJlIGFyZSBiYW5kcyBsZWZ0IHdoZXJlIGF2b2lkIGhvbGUgaXMgaW5hY3RpdmUpKi8KICAgICAgIGlmIChuQWN0aXZlTGluZXNOb0FIR2xvYmFsID4gMCkgewogICAgICAgICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewogICAgICAgICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgIHJlZFZhbCArPSAoIDIgXiAoIChjb25zdFBhcnROb0FIR2xvYmFsLWRlc2lyZWRQZU5vQUhHbG9iYWwpIC8gKGludlJlZEV4cCpuQWN0aXZlTGluZXNOb0FIR2xvYmFsKSApCiAgICAgICAgICAgICAgICAgICAgICAgLSAyIF4gKCAoY29uc3RQYXJ0Tm9BSEdsb2JhbC1yZWRQZU5vQUhHbG9iYWwpIC8gKGludlJlZEV4cCpuQWN0aXZlTGluZXNOb0FIR2xvYmFsKSApICkKICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpbnQgc2NhbGUwID0gMDsKICAgICAgICAgICAgIGludCBzY2FsZTEgPSAwOwoKICAgICAgICAgICAgIEZJWFBfREJMIHRtcDAgPSBDYWxjUmVkVmFsUG93ZXIoIGNvbnN0UGFydE5vQUhHbG9iYWwtZGVzaXJlZFBlTm9BSEdsb2JhbCwgNCpuQWN0aXZlTGluZXNOb0FIR2xvYmFsLCAmc2NhbGUwICk7CiAgICAgICAgICAgICBGSVhQX0RCTCB0bXAxID0gQ2FsY1JlZFZhbFBvd2VyKCBjb25zdFBhcnROb0FIR2xvYmFsLXJlZFBlTm9BSEdsb2JhbCwgNCpuQWN0aXZlTGluZXNOb0FIR2xvYmFsLCAmc2NhbGUxICk7CgogICAgICAgICAgICAgaW50IHNjYWxNaW4gPSBGREttaW4oc2NhbGUwLCBzY2FsZTEpLTE7CgogICAgICAgICAgICAgdG1wMCA9IHNjYWxlVmFsdWUodG1wMCwoc2NhbE1pbi1zY2FsZTApKSAtIHNjYWxlVmFsdWUodG1wMSwoc2NhbE1pbi1zY2FsZTEpKTsKICAgICAgICAgICAgIHNjYWxlMCA9IHNjYWxNaW47CgogICAgICAgICAgICAgLyogb2xkIHJlZHVjdGlvbiB2YWx1ZSAqLwogICAgICAgICAgICAgdG1wMSA9IHJlZFZhbHVlW2VsZW1lbnRJZF07CiAgICAgICAgICAgICBzY2FsZTEgPSByZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF07CgogICAgICAgICAgICAgc2NhbE1pbiA9IGZpeE1pbihzY2FsZTAsc2NhbGUxKS0xOwoKICAgICAgICAgICAgIC8qIHN1bSB1cCBvbGQgYW5kIG5ldyByZWR1Y3Rpb24gdmFsdWUgKi8KICAgICAgICAgICAgIHJlZFZhbHVlW2VsZW1lbnRJZF0gPSBzY2FsZVZhbHVlKHRtcDAsKHNjYWxNaW4tc2NhbGUwKSkgKyBzY2FsZVZhbHVlKHRtcDEsKHNjYWxNaW4tc2NhbGUxKSk7CiAgICAgICAgICAgICByZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF0gPSBzY2FsTWluOwoKICAgICAgICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KICAgICAgICAgfSAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLwogICAgICAgfSAvKiBuQWN0aXZlTGluZXNOb0FIR2xvYmFsID4gMCAqLwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAvKiBkZXNpcmVkUGUgPj0gcmVkUGVHbG9iYWwgKi8KICAgICAgICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewogICAgICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CgogICAgICAgICAgICBJTlQgcmVkVmFsX3NjYWxlID0gMDsKICAgICAgICAgICAgRklYUF9EQkwgdG1wID0gZkRpdk5vcm0oKEZJWFBfREJMKXJlZFBlR2xvYmFsLCAoRklYUF9EQkwpZGVzaXJlZFBlLCAmcmVkVmFsX3NjYWxlKTsKCiAgICAgICAgICAgIC8qIHJlZFZhbCAqPSByZWRQZUdsb2JhbC9kZXNpcmVkUGU7ICovCiAgICAgICAgICAgIHJlZFZhbHVlW2VsZW1lbnRJZF0gPSBmTXVsdChyZWRWYWx1ZVtlbGVtZW50SWRdLCB0bXApOwogICAgICAgICAgICByZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF0gLT0gcmVkVmFsX3NjYWxlOwoKICAgICAgICAgICAgRkRLYWFjRW5jX3Jlc2V0QUhGbGFncyhwQWhGbGFnW2VsZW1lbnRJZF0sIGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsLCBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwpOwogICAgICAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCiAgICAgICAgfSAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLwogICAgIH0KCiAgICAgcmVkUGVHbG9iYWwgPSAwOwogICAgIC8qIENhbGN1bGF0ZSBuZXcgcmVkVmFsJ3MgUEUuLi4gKi8KICAgICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewogICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CgogICAgICAgICBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7CiAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSAgICA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwoKICAgICAgICAgLyogcmVkdWNlIHRocmVzaG9sZHMgKi8KICAgICAgICAgRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNDQlIocWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBwQWhGbGFnW2VsZW1lbnRJZF0sIHBUaHJFeHBbZWxlbWVudElkXSwgbkNoYW5uZWxzLCByZWRWYWx1ZVtlbGVtZW50SWRdLCByZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF0pOwoKICAgICAgICAgLyogcGUgYWZ0ZXIgc2Vjb25kIGd1ZXNzICovCiAgICAgICAgIEZES2FhY0VuY19jYWxjUGUocHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwZURhdGEsIG5DaGFubmVscyk7CiAgICAgICAgIHJlZFBlR2xvYmFsICs9IHBlRGF0YS0+cGU7CgogICAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCiAgICAgfSAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLwoKICAgICBpdGVyKys7CiAgIH0gLyogRU9GIHdoaWxlICovCgoKICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAvKiBQYXJ0IElWOiBpZiBzdGlsbCByZXF1aXJlZCwgZnVydGhlciByZWR1Y2UgY29uc3RyYWludHMgICovCiAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgLyogICAgICAgICAgICAgICAgICAxLjAqICAgICAgICAxLjE1KiAgICAgICAxLjIwKgogICAgKiAgICAgICAgICAgICAgIGRlc2lyZWRQZSAgIGRlc2lyZWRQZSAgIGRlc2lyZWRQZQogICAgKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8CiAgICAqIC4uLlhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWHwgICAgICAgICAgIHwKICAgICogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfFhYWFhYWFhYWFhYLi4uCiAgICAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHxYWFhYWFhYWFhYWHwKICAgICogICAgICAgICAgICAtLS0gQSAtLS0gICAgICAgICAgfCAtLS0gQiAtLS0gfCAtLS0gQyAtLS0KICAgICoKICAgICogKFgpOiByZWRQZUdsb2JhbAogICAgKiAoQSk6IEZES2FhY0VuY19jb3JyZWN0VGhyZXNoKCkKICAgICogKEIpOiBGREthYWNFbmNfYWxsb3dNb3JlSG9sZXMoKQogICAgKiAoQyk6IEZES2FhY0VuY19yZWR1Y2VNaW5TbnIoKQogICAqLwoKICAgLyogY29ycmVjdCB0aHJlc2hvbGRzIHRvIGdldCBjbG9zZXIgdG8gdGhlIGRlc2lyZWQgcGUgKi8KICAgaWYgKCByZWRQZUdsb2JhbCA+IGRlc2lyZWRQZSApIHsKICAgICBGREthYWNFbmNfY29ycmVjdFRocmVzaChjbSwgcWNFbGVtZW50LCBwc3lPdXRFbGVtZW50LCBwQWhGbGFnLCBwVGhyRXhwLCByZWRWYWx1ZSwgcmVkVmFsU2NhbGluZywKICAgICAgICAgICAgICAgICAgIGRlc2lyZWRQZSAtIHJlZFBlR2xvYmFsLCBwcm9jZXNzRWxlbWVudHMsIGVsZW1lbnRPZmZzZXQpOwoKICAgICAvKiB1cGRhdGUgUEUgKi8KICAgICByZWRQZUdsb2JhbCA9IDA7CiAgICAgZm9yKGVsZW1lbnRJZD1lbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKICAgICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewoKICAgICAgICAgSU5UIG5DaGFubmVscyA9IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOwogICAgICAgICBQRV9EQVRBICpwZURhdGEgICAgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKCiAgICAgICAgIC8qIHBlIGFmdGVyIGNvcnJlY3RUaHJlc2ggKi8KICAgICAgICAgRkRLYWFjRW5jX2NhbGNQZShwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBlRGF0YSwgbkNoYW5uZWxzKTsKICAgICAgICAgcmVkUGVHbG9iYWwgKz0gcGVEYXRhLT5wZTsKCiAgICAgICB9IC8qIEVPRiBEU0Utc3VwcHJlc3Npb24gKi8KICAgICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCiAgIH0KCiAgIGlmICggcmVkUGVHbG9iYWwgPiBkZXNpcmVkUGUgKSB7CiAgICAgLyogcmVkdWNlIHBlIGJ5IHJlZHVjaW5nIG1pblNuciByZXF1aXJlbWVudHMgKi8KICAgICBGREthYWNFbmNfcmVkdWNlTWluU25yKGNtLCBxY0VsZW1lbnQsIHBzeU91dEVsZW1lbnQsIHBBaEZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZk11bHRJKEZMMkZYQ09OU1RfREJMKDAuMTVmKSxkZXNpcmVkUGUpICsgZGVzaXJlZFBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWRQZUdsb2JhbCwgcHJvY2Vzc0VsZW1lbnRzLCBlbGVtZW50T2Zmc2V0KTsKCiAgICAgLyogcmVkdWNlIHBlIGJ5IGFsbG93aW5nIGFkZGl0aW9uYWwgc3BlY3RyYWwgaG9sZXMgKi8KICAgICBGREthYWNFbmNfYWxsb3dNb3JlSG9sZXMoY20sIHFjRWxlbWVudCwgcHN5T3V0RWxlbWVudCwgQWRqVGhyU3RhdGVFbGVtZW50LCBwQWhGbGFnLAogICAgICAgICAgICAgICAgICAgIGRlc2lyZWRQZSwgcmVkUGVHbG9iYWwsIHByb2Nlc3NFbGVtZW50cywgZWxlbWVudE9mZnNldCk7CiAgIH0KCn0KCi8qIHNpbWlsYXIgdG8gRkRLYWFjRW5jX2FkYXB0VGhyZXNob2xkc1RvUGUoKSwgZm9yICBWQlItbW9kZSAqLwp2b2lkIEZES2FhY0VuY19BZGFwdFRocmVzaG9sZHNWQlIoUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2hhbm5lbFsoMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogQWRqVGhyU3RhdGVFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRPT0xTSU5GTyAqdG9vbHNJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAqcGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscykKewogICBVQ0hBUiAgICAoKnBBaEZsYWcpW01BWF9HUk9VUEVEX1NGQl07CiAgIEZJWFBfREJMICgqcFRockV4cClbTUFYX0dST1VQRURfU0ZCXTsKCiAgIC8qIGFsbG9jYXRlIHNjcmF0Y2ggbWVtb3J5ICovCiAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChfcEFoRmxhZywgVUNIQVIsICgyKSpNQVhfR1JPVVBFRF9TRkIpCiAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChfcFRockV4cCwgRklYUF9EQkwsICgyKSpNQVhfR1JPVVBFRF9TRkIpCiAgIHBBaEZsYWcgPSAoVUNIQVIoKilbTUFYX0dST1VQRURfU0ZCXSlfcEFoRmxhZzsKICAgcFRockV4cCA9IChGSVhQX0RCTCgqKVtNQVhfR1JPVVBFRF9TRkJdKV9wVGhyRXhwOwoKICAgLyogdGhyZXNob2xkcyB0byB0aGUgcG93ZXIgb2YgcmVkRXhwICovCiAgIEZES2FhY0VuY19jYWxjVGhyZXNoRXhwKHBUaHJFeHAsIHFjT3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKCiAgIC8qIGxvd2VyIHRoZSBtaW5TbnIgcmVxdWlyZW1lbnRzIGZvciBsb3cgZW5lcmdpZXMgY29tcGFyZWQgdG8gdGhlIGF2ZXJhZ2UKICAgICAgZW5lcmd5IGluIHRoaXMgZnJhbWUgKi8KICAgRkRLYWFjRW5jX2FkYXB0TWluU25yKHFjT3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbCwgJkFkalRoclN0YXRlRWxlbWVudC0+bWluU25yQWRhcHRQYXJhbSwgbkNoYW5uZWxzKTsKCiAgIC8qIGluaXQgYWhGbGFnICgwOiBubyBhaCBuZWNlc3NhcnksIDE6IGFoIHBvc3NpYmxlLCAyOiBhaCBhY3RpdmUgKi8KICAgRkRLYWFjRW5jX2luaXRBdm9pZEhvbGVGbGFnKHFjT3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbCwgcEFoRmxhZywgdG9vbHNJbmZvLAogICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIHBlRGF0YSwgJkFkalRoclN0YXRlRWxlbWVudC0+YWhQYXJhbSk7CgogICAvKiByZWR1Y2UgdGhyZXNob2xkcyAqLwogICBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc1ZCUihxY091dENoYW5uZWwsIHBzeU91dENoYW5uZWwsIHBBaEZsYWcsIHBUaHJFeHAsIG5DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnZiclF1YWxGYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlT2xkKTsKCiAgIC8qIGZyZWUgc2NyYXRjaCBtZW1vcnkgKi8KICAgQ19BTExPQ19TQ1JBVENIX0VORChfcFRockV4cCwgRklYUF9EQkwsICgyKSpNQVhfR1JPVVBFRF9TRkIpCiAgIENfQUxMT0NfU0NSQVRDSF9FTkQoX3BBaEZsYWcsIFVDSEFSLCAoMikqTUFYX0dST1VQRURfU0ZCKQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NhbGNCaXRTYXZlCiAgZGVzY3JpcHRpb246ICBDYWxjdWxhdGVzIHBlcmNlbnRhZ2Ugb2YgYml0IHNhdmUsIHNlZSBmaWd1cmUgYmVsb3cKICByZXR1cm5zOgogIGlucHV0OiAgICAgICAgcGFyYW1ldGVycyBhbmQgYml0cmVzLWZ1bGxuZXNzCiAgb3V0cHV0OiAgICAgICBwZXJjZW50YWdlIG9mIGJpdCBzYXZlCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICAgICAgICBiaXRzYXZlCiAgICAgICAgICAgICAgICAgICAgbWF4Qml0U2F2ZSglKXwgICBjbGlwTG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS1cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS0tLS1cLS0tLS0tLS0tLS0tLS0+IGJpdHJlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIG1pbkJpdFNhdmUoJSl8ICAgICAgICAgIFwtLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcEhpZ2ggICAgICBtYXhCaXRyZXMKKi8Kc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19jYWxjQml0U2F2ZShGSVhQX0RCTCBmaWxsTGV2ZWwsCiAgICBjb25zdCBGSVhQX0RCTCBjbGlwTG93LAogICAgY29uc3QgRklYUF9EQkwgY2xpcEhpZ2gsCiAgICBjb25zdCBGSVhQX0RCTCBtaW5CaXRTYXZlLAogICAgY29uc3QgRklYUF9EQkwgbWF4Qml0U2F2ZSwKICAgIGNvbnN0IEZJWFBfREJMIGJpdHNhdmVfc2xvcGUpCnsKICAgIEZJWFBfREJMIGJpdHNhdmU7CgogICAgZmlsbExldmVsID0gZml4TWF4KGZpbGxMZXZlbCwgY2xpcExvdyk7CiAgICBmaWxsTGV2ZWwgPSBmaXhNaW4oZmlsbExldmVsLCBjbGlwSGlnaCk7CgogICAgYml0c2F2ZSA9IG1heEJpdFNhdmUgLSBmTXVsdCgoZmlsbExldmVsLWNsaXBMb3cpLCBiaXRzYXZlX3Nsb3BlKTsKCiAgICByZXR1cm4gKGJpdHNhdmUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY2FsY0JpdFNwZW5kCiAgZGVzY3JpcHRpb246ICBDYWxjdWxhdGVzIHBlcmNlbnRhZ2Ugb2YgYml0IHNwZW5kLCBzZWUgZmlndXJlIGJlbG93CiAgcmV0dXJuczoKICBpbnB1dDogICAgICAgIHBhcmFtZXRlcnMgYW5kIGJpdHJlcy1mdWxsbmVzcwogIG91dHB1dDogICAgICAgcGVyY2VudGFnZSBvZiBiaXQgc3BlbmQKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzcGVuZCAgICAgIGNsaXBIaWdoCiAgICAgICAgICAgICAgICAgICBtYXhCaXRTcGVuZCglKXwgICAgICAgICAgLy0tLS0tLS0tLS0tbWF4Qml0cmVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS0vLS0tLS0tLS0tLS0tLS0tLS0+IGJpdHJlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgLwogICAgICAgICAgICAgICAgICAgbWluQml0U3BlbmQoJSl8LS0vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcExvdwoqLwpzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NhbGNCaXRTcGVuZChGSVhQX0RCTCBmaWxsTGV2ZWwsCiAgICBjb25zdCBGSVhQX0RCTCBjbGlwTG93LAogICAgY29uc3QgRklYUF9EQkwgY2xpcEhpZ2gsCiAgICBjb25zdCBGSVhQX0RCTCBtaW5CaXRTcGVuZCwKICAgIGNvbnN0IEZJWFBfREJMIG1heEJpdFNwZW5kLAogICAgY29uc3QgRklYUF9EQkwgYml0c3BlbmRfc2xvcGUpCnsKICAgIEZJWFBfREJMIGJpdHNwZW5kOwoKICAgIGZpbGxMZXZlbCA9IGZpeE1heChmaWxsTGV2ZWwsIGNsaXBMb3cpOwogICAgZmlsbExldmVsID0gZml4TWluKGZpbGxMZXZlbCwgY2xpcEhpZ2gpOwoKICAgIGJpdHNwZW5kID0gbWluQml0U3BlbmQgKyBmTXVsdChmaWxsTGV2ZWwtY2xpcExvdywgYml0c3BlbmRfc2xvcGUpOwoKICAgIHJldHVybiAoYml0c3BlbmQpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2FkanVzdFBlTWluTWF4KCkKICBkZXNjcmlwdGlvbjogIGFkanVzdHMgcGVNaW4gYW5kIHBlTWF4IHBhcmFtZXRlcnMgb3ZlciB0aW1lCiAgcmV0dXJuczoKICBpbnB1dDogICAgICAgIGN1cnJlbnQgcGUsIHBlTWluLCBwZU1heCwgYml0cmVzIHNpemUKICBvdXRwdXQ6ICAgICAgIGFkanVzdGVkIHBlTWluL3BlTWF4CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgRkRLYWFjRW5jX2FkanVzdFBlTWluTWF4KGNvbnN0IElOVCBjdXJyUGUsCiAgICBJTlQgICAgICAqcGVNaW4sCiAgICBJTlQgICAgICAqcGVNYXgpCnsKICBGSVhQX0RCTCBtaW5GYWNIaSA9IEZMMkZYQ09OU1RfREJMKDAuM2YpLCBtYXhGYWNIaSA9IChGSVhQX0RCTClNQVhWQUxfREJMLCBtaW5GYWNMbyA9IEZMMkZYQ09OU1RfREJMKDAuMTRmKSwgbWF4RmFjTG8gPSBGTDJGWENPTlNUX0RCTCgwLjA3Zik7CiAgICBJTlQgZGlmZjsKCiAgICBJTlQgbWluRGlmZl9maXggPSBmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC4xNjY2NjY2NjY3ZiksIGN1cnJQZSk7CgogICAgaWYgKGN1cnJQZSA+ICpwZU1heCkKICAgIHsKICAgICAgICBkaWZmID0gKGN1cnJQZS0qcGVNYXgpIDsKICAgICAgICAqcGVNaW4gKz0gZk11bHRJKG1pbkZhY0hpLGRpZmYpOwogICAgICAgICpwZU1heCArPSBmTXVsdEkobWF4RmFjSGksZGlmZik7CiAgICB9CiAgICBlbHNlIGlmIChjdXJyUGUgPCAqcGVNaW4pCiAgICB7CiAgICAgICAgZGlmZiA9ICgqcGVNaW4tY3VyclBlKSA7CiAgICAgICAgKnBlTWluIC09IGZNdWx0SShtaW5GYWNMbyxkaWZmKTsKICAgICAgICAqcGVNYXggLT0gZk11bHRJKG1heEZhY0xvLGRpZmYpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgICpwZU1pbiArPSBmTXVsdEkobWluRmFjSGksIChjdXJyUGUgLSAqcGVNaW4pKTsKICAgICAgICAqcGVNYXggLT0gZk11bHRJKG1heEZhY0xvLCAoKnBlTWF4IC0gY3VyclBlKSk7CiAgICB9CgogICAgaWYgKCgqcGVNYXggLSAqcGVNaW4pIDwgbWluRGlmZl9maXgpCiAgICB7CiAgICAgICAgSU5UIHBlTWF4X2ZpeCA9ICpwZU1heCwgcGVNaW5fZml4ID0gKnBlTWluOwogICAgICAgIEZJWFBfREJMIHBhcnRMb19maXgsIHBhcnRIaV9maXg7CgogICAgICAgIHBhcnRMb19maXggPSAoRklYUF9EQkwpZml4TWF4KDAsIGN1cnJQZSAtIHBlTWluX2ZpeCk7CiAgICAgICAgcGFydEhpX2ZpeCA9IChGSVhQX0RCTClmaXhNYXgoMCwgcGVNYXhfZml4IC0gY3VyclBlKTsKCiAgICAgICAgcGVNYXhfZml4ID0gKElOVCkoY3VyclBlICsgZk11bHRJKGZEaXZOb3JtKHBhcnRIaV9maXgsIChwYXJ0TG9fZml4K3BhcnRIaV9maXgpKSwgbWluRGlmZl9maXgpKTsKICAgICAgICBwZU1pbl9maXggPSAoSU5UKShjdXJyUGUgLSBmTXVsdEkoZkRpdk5vcm0ocGFydExvX2ZpeCwgKHBhcnRMb19maXgrcGFydEhpX2ZpeCkpLCBtaW5EaWZmX2ZpeCkpOwogICAgICAgIHBlTWluX2ZpeCA9IGZpeE1heCgwLCBwZU1pbl9maXgpOwoKICAgICAgICAqcGVNYXggPSBwZU1heF9maXg7CiAgICAgICAgKnBlTWluID0gcGVNaW5fZml4OwogICAgfQp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICBmdW5jdGlvbm5hbWU6IEJpdHJlc0NhbGNCaXRGYWMKICBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZXMgZmFjdG9yIG9mIHNwZW5kaW5nIGJpdHMgZm9yIG9uZSBmcmFtZQogIDEuMCA6IHRha2UgYWxsIGZyYW1lIGR5bnBhcnQgYml0cwogID4xLjAgOiB0YWtlIGFsbCBmcmFtZSBkeW5wYXJ0IGJpdHMgKyBiaXRyZXMKICA8MS4wIDogcHV0IGJpdHMgaW4gYml0cmVzZXJ2b2lyCiAgcmV0dXJuczogICAgICBCaXRGYWMKICBpbnB1dDogICAgICAgIGJpdHJlcy1mdWxsbmVzcywgcGUsIGJsb2NrVHlwZSwgcGFyYW1ldGVyLXNldHRpbmdzCiAgb3V0cHV0OgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAgICAgICAgICAgICAgICAgICAgIGJpdGZhYyglKSAgICAgICAgICAgIHBlbWF4CiAgICAgICAgICAgICAgICAgICBiaXRzcGVuZCglKSAgIHwgICAgICAgICAgLy0tLS0tLS0tLS0tbWF4Qml0cmVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS0vLS0tLS0tLS0tLS0tLS0tLS0+IHBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAvCiAgICAgICAgICAgICAgICAgICBiaXRzYXZlKCUpICAgIHwtLS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVtaW4KKi8KCnN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfYml0cmVzQ2FsY0JpdEZhYyhjb25zdCBJTlQgICAgICAgYml0cmVzQml0cywKICAgIGNvbnN0IElOVCAgICAgICAgbWF4Qml0cmVzQml0cywKICAgIGNvbnN0IElOVCAgICAgICAgcGUsCiAgICBjb25zdCBJTlQgICAgICAgIGxhc3RXaW5kb3dTZXF1ZW5jZSwKICAgIGNvbnN0IElOVCAgICAgICAgYXZnQml0cywKICAgIGNvbnN0IEZJWFBfREJMICAgbWF4Qml0RmFjLAogICAgQURKX1RIUl9TVEFURSAgICpBZGpUaHIsCiAgICBBVFNfRUxFTUVOVCAgICAgKmFkalRockNoYW4pCnsKICAgIEJSRVNfUEFSQU0gKmJyZXNQYXJhbTsKICAgIElOVCBwZXg7CgogICAgSU5UIHFtaW4sIHFiciwgcWJyZXMsIHFtYnI7CiAgICBGSVhQX0RCTCBiaXRTYXZlLCBiaXRTcGVuZDsKCiAgICBGSVhQX0RCTCBiaXRyZXNGYWNfZml4LCB0bXBfY3N0LCB0bXBfZml4OwogICAgRklYUF9EQkwgcGVfcGVycywgYml0c19yYXRpbywgbWF4QnJWYWw7CiAgICBGSVhQX0RCTCBiaXRzYXZlX3Nsb3BlLCBiaXRzcGVuZF9zbG9wZSwgbWF4Qml0RmFjX3RtcDsKICAgIEZJWFBfREJMIGZpbGxMZXZlbF9maXggPSAoRklYUF9EQkwpMHg3ZmZmZmZmZjsKICAgIEZJWFBfREJMIFVOSVRZID0gKEZJWFBfREJMKTB4N2ZmZmZmZmY7CiAgICBGSVhQX0RCTCBQT0lOVDcgPSAoRklYUF9EQkwpMHg1OTk5OTk5QTsKCiAgICBpZiAobWF4Qml0cmVzQml0cyA+IGJpdHJlc0JpdHMpIHsKICAgICAgZmlsbExldmVsX2ZpeCA9IGZEaXZOb3JtKGJpdHJlc0JpdHMsIG1heEJpdHJlc0JpdHMpOwogICAgfQoKICAgIGlmIChsYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQogICAgewogICAgICAgIGJyZXNQYXJhbSA9ICYoQWRqVGhyLT5icmVzUGFyYW1Mb25nKTsKICAgICAgICBiaXRzYXZlX3Nsb3BlID0gKEZJWFBfREJMKTB4M0JCQkJCQkM7CiAgICAgICAgYml0c3BlbmRfc2xvcGUgPSAoRklYUF9EQkwpMHg1NTU1NTU1NTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBicmVzUGFyYW0gPSAmKEFkalRoci0+YnJlc1BhcmFtU2hvcnQpOwogICAgICAgIGJpdHNhdmVfc2xvcGUgPSAoRklYUF9EQkwpMHgyRThCQTJFOTsKICAgICAgICBiaXRzcGVuZF9zbG9wZSA9IChGSVhQX0RCTCkweDdmZmZmZmZmOwogICAgfQoKICAgIHBleCA9IGZpeE1heChwZSwgYWRqVGhyQ2hhbi0+cGVNaW4pOwogICAgcGV4ID0gZml4TWluKHBleCwgYWRqVGhyQ2hhbi0+cGVNYXgpOwoKICAgIGJpdFNhdmUgPSBGREthYWNFbmNfY2FsY0JpdFNhdmUoZmlsbExldmVsX2ZpeCwKICAgICAgICBicmVzUGFyYW0tPmNsaXBTYXZlTG93LCBicmVzUGFyYW0tPmNsaXBTYXZlSGlnaCwKICAgICAgICBicmVzUGFyYW0tPm1pbkJpdFNhdmUsIGJyZXNQYXJhbS0+bWF4Qml0U2F2ZSwgYml0c2F2ZV9zbG9wZSk7CgogICAgYml0U3BlbmQgPSBGREthYWNFbmNfY2FsY0JpdFNwZW5kKGZpbGxMZXZlbF9maXgsCiAgICAgICAgYnJlc1BhcmFtLT5jbGlwU3BlbmRMb3csIGJyZXNQYXJhbS0+Y2xpcFNwZW5kSGlnaCwKICAgICAgICBicmVzUGFyYW0tPm1pbkJpdFNwZW5kLCBicmVzUGFyYW0tPm1heEJpdFNwZW5kLCBiaXRzcGVuZF9zbG9wZSk7CgogICAgcGVfcGVycyA9IChwZXggPiBhZGpUaHJDaGFuLT5wZU1pbikgPyBmRGl2Tm9ybShwZXggLSBhZGpUaHJDaGFuLT5wZU1pbiwgYWRqVGhyQ2hhbi0+cGVNYXggLSBhZGpUaHJDaGFuLT5wZU1pbikgOiAwOwogICAgdG1wX2ZpeCA9IGZNdWx0KCgoRklYUF9EQkwpYml0U3BlbmQgKyAoRklYUF9EQkwpYml0U2F2ZSksIHBlX3BlcnMpOwogICAgYml0cmVzRmFjX2ZpeCA9IChVTklUWT4+MSkgLSAoKEZJWFBfREJMKWJpdFNhdmU+PjEpICsgKHRtcF9maXg+PjEpOyBxYnJlcyA9IChERlJBQ1RfQklUUy0yKTsKCiAgICAvKiAoZmxvYXQpYml0cmVzQml0cy8oZmxvYXQpYXZnQml0cyAqLwogICAgYml0c19yYXRpbyA9IGZEaXZOb3JtKGJpdHJlc0JpdHMsIGF2Z0JpdHMsICZxYnIpOwogICAgcWJyID0gREZSQUNUX0JJVFMtMS1xYnI7CgogICAgLyogQWRkIDAuNyBpbiBxMzEgdG8gYml0c19yYXRpbyBpbiBxYnIgKi8KICAgIC8qIDAuN2YgKyAoZmxvYXQpYml0cmVzQml0cy8oZmxvYXQpYXZnQml0cyAqLwogICAgcW1pbiA9IGZpeE1pbihxYnIsIChERlJBQ1RfQklUUy0xKSk7CiAgICBiaXRzX3JhdGlvID0gYml0c19yYXRpbyA+PiAocWJyIC0gcW1pbik7CiAgICB0bXBfY3N0ID0gUE9JTlQ3ID4+ICgoREZSQUNUX0JJVFMtMSkgLSBxbWluKTsKICAgIG1heEJyVmFsID0gKGJpdHNfcmF0aW8+PjEpICsgKHRtcF9jc3Q+PjEpOyBxbWJyID0gcW1pbiAtIDE7CgogICAgLyogYml0cmVzRmFjX2ZpeCA9IGZpeE1pbihiaXRyZXNGYWNfZml4LCAwLjcgKyBiaXRyZXNCaXRzL2F2Z0JpdHMpOyAqLwogICAgYml0cmVzRmFjX2ZpeCA9IGJpdHJlc0ZhY19maXggPj4gKHFicmVzIC0gcW1icik7IHFicmVzID0gcW1icjsKICAgIGJpdHJlc0ZhY19maXggPSBmaXhNaW4oYml0cmVzRmFjX2ZpeCwgbWF4QnJWYWwpOwoKICAgIC8qIENvbXBhcmUgd2l0aCBtYXhCaXRGYWMgKi8KICAgIHFtaW4gPSBmaXhNaW4oUV9CSVRGQUMsIHFicmVzKTsKICAgIGJpdHJlc0ZhY19maXggPSBiaXRyZXNGYWNfZml4ID4+IChxYnJlcyAtIHFtaW4pOwogICAgbWF4Qml0RmFjX3RtcCA9IG1heEJpdEZhYyA+PiAoUV9CSVRGQUMgLSBxbWluKTsKICAgIGlmKG1heEJpdEZhY190bXAgPCBiaXRyZXNGYWNfZml4KQogICAgewogICAgICAgIGJpdHJlc0ZhY19maXggPSBtYXhCaXRGYWM7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYocW1pbiA8IFFfQklURkFDKQogICAgICAgIHsKICAgICAgICAgICAgYml0cmVzRmFjX2ZpeCA9IGJpdHJlc0ZhY19maXggPDwgKFFfQklURkFDLXFtaW4pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBiaXRyZXNGYWNfZml4ID0gYml0cmVzRmFjX2ZpeCA+PiAocW1pbi1RX0JJVEZBQyk7CiAgICAgICAgfQogICAgfQoKICAgIEZES2FhY0VuY19hZGp1c3RQZU1pbk1heChwZSwgJmFkalRockNoYW4tPnBlTWluLCAmYWRqVGhyQ2hhbi0+cGVNYXgpOwoKICAgIHJldHVybiBiaXRyZXNGYWNfZml4Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkalRock5ldwpkZXNjcmlwdGlvbjogIGFsbG9jYXRlIEFESl9USFJfU1RBVEUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCklOVCBGREthYWNFbmNfQWRqVGhyTmV3KEFESl9USFJfU1RBVEUqKiBwaEFkalRociwKICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgIG5FbGVtZW50cykKewogICAgSU5UIGVyciA9IDA7CiAgICBJTlQgaTsKICAgIEFESl9USFJfU1RBVEUqIGhBZGpUaHIgPSBHZXRSYW1fYWFjRW5jX0FkanVzdFRocmVzaG9sZCgpOwogICAgaWYgKGhBZGpUaHI9PU5VTEwpIHsKICAgICAgICBlcnIgPSAxOwogICAgICAgIGdvdG8gYmFpbDsKICAgIH0KCiAgICBmb3IgKGk9MDsgaTxuRWxlbWVudHM7IGkrKykgewogICAgICAgIGhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSA9ICBHZXRSYW1fYWFjRW5jX0FkalRoclN0YXRlRWxlbWVudChpKTsKICAgICAgICBpZiAoaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldPT1OVUxMKSB7CiAgICAgICAgICBlcnIgPSAxOwogICAgICAgICAgZ290byBiYWlsOwogICAgICAgIH0KICAgIH0KCmJhaWw6CiAgICAqcGhBZGpUaHIgPSBoQWRqVGhyOwogICAgcmV0dXJuIGVycjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19BZGpUaHJJbml0CmRlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZSBBREpfVEhSX1NUQVRFCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEZES2FhY0VuY19BZGpUaHJJbml0KAogICAgICAgIEFESl9USFJfU1RBVEUgICAqaEFkalRociwKICAgICAgICBjb25zdCBJTlQgICAgICAgbWVhblBlLAogICAgICAgIEVMRU1FTlRfQklUUyAgICAqZWxCaXRzWyg4KV0sCiAgICAgICAgSU5UICAgICAgICAgICAgIGludlF1YW50LAogICAgICAgIElOVCAgICAgICAgICAgICBuRWxlbWVudHMsCiAgICAgICAgSU5UICAgICAgICAgICAgIG5DaGFubmVsc0VmZiwKICAgICAgICBJTlQgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICBJTlQgICAgICAgICAgICAgYWR2YW5jZWRCaXRzVG9QZSwKICAgICAgICBGSVhQX0RCTCAgICAgICAgdmJyUXVhbEZhY3RvciwKICAgICAgICBjb25zdCBJTlQgICAgICAgZFpvbmVRdWFudEVuYWJsZQogICAgICAgICkKewogIElOVCBpOwoKICBGSVhQX0RCTCBQT0lOVDggPSBGTDJGWENPTlNUX0RCTCgwLjhmKTsKICBGSVhQX0RCTCBQT0lOVDYgPSBGTDJGWENPTlNUX0RCTCgwLjZmKTsKCiAgLyogTWF4IG51bWJlciBvZiBpdGVyYXRpb25zIGluIHNlY29uZCBndWVzcyBpcyAzIGZvciBsb3dkZWxheSBhb3QgYW5kIGZvciBjb25maWd1cmF0aW9ucyB3aXRoCiAgICAgbXVsdGlwbGUgYXVkaW8gZWxlbWVudHMgaW4gZ2VuZXJhbCwgb3RoZXJ3aXNlIGl0ZXJhdGlvbiB2YWx1ZSBpcyBhbHdheXMgMS4gKi8KICBoQWRqVGhyLT5tYXhJdGVyMm5kR3Vlc3MgPSAoYWR2YW5jZWRCaXRzVG9QZSE9MCB8fCBuRWxlbWVudHM+MSkgPyAzIDogMTsKCiAgLyogY29tbW9uIGZvciBhbGwgZWxlbWVudHM6ICovCiAgLyogcGFyYW1ldGVycyBmb3IgYml0cmVzIGNvbnRyb2wgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTYXZlTG93ICAgPSAoRklYUF9EQkwpMHgxOTk5OTk5YTsgLyogRkwyRlhDT05TVF9EQkwoMC4yZik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU2F2ZUhpZ2ggID0gKEZJWFBfREJMKTB4Nzk5OTk5OWE7IC8qIEZMMkZYQ09OU1RfREJMKDAuOTVmKTsgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1pbkJpdFNhdmUgICAgPSAoRklYUF9EQkwpMHhmOTk5OTk5YTsgLyogRkwyRlhDT05TVF9EQkwoLTAuMDVmKTsgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1heEJpdFNhdmUgICAgPSAoRklYUF9EQkwpMHgyNjY2NjY2NjsgLyogRkwyRlhDT05TVF9EQkwoMC4zZik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU3BlbmRMb3cgID0gKEZJWFBfREJMKTB4MTk5OTk5OWE7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLwogIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNwZW5kSGlnaCA9IChGSVhQX0RCTCkweDc5OTk5OTlhOyAvKiBGTDJGWENPTlNUX0RCTCgwLjk1Zik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5taW5CaXRTcGVuZCAgID0gKEZJWFBfREJMKTB4ZjMzMzMzMzM7IC8qIEZMMkZYQ09OU1RfREJMKC0wLjEwZik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5tYXhCaXRTcGVuZCAgID0gKEZJWFBfREJMKTB4MzMzMzMzMzM7IC8qIEZMMkZYQ09OU1RfREJMKDAuNGYpOyAqLwoKICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU2F2ZUxvdyAgID0gKEZJWFBfREJMKTB4MTk5OTk5YTA7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLwogIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTYXZlSGlnaCAgPSAoRklYUF9EQkwpMHg1ZmZmZmZmZjsgLyogRkwyRlhDT05TVF9EQkwoMC43NWYpOyAqLwogIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1pbkJpdFNhdmUgICAgPSAoRklYUF9EQkwpMHgwMDAwMDAwMDsgLyogRkwyRlhDT05TVF9EQkwoMC4wZik7ICovCiAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWF4Qml0U2F2ZSAgICA9IChGSVhQX0RCTCkweDE5OTk5OWEwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU3BlbmRMb3cgID0gKEZJWFBfREJMKTB4MTk5OTk5YTA7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLwogIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTcGVuZEhpZ2ggPSAoRklYUF9EQkwpMHg1ZmZmZmZmZjsgLyogRkwyRlhDT05TVF9EQkwoMC43NWYpOyAqLwogIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1pbkJpdFNwZW5kICAgPSAoRklYUF9EQkwpMHhmOTk5OTk5ODsgLyogRkwyRlhDT05TVF9EQkwoLTAuMDVmKTsgKi8KICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5tYXhCaXRTcGVuZCAgID0gKEZJWFBfREJMKTB4NDAwMDAwMDA7IC8qIEZMMkZYQ09OU1RfREJMKDAuNWYpOyAqLwoKICAvKiBzcGVjaWZpYyBmb3IgZWFjaCBlbGVtZW50OiAqLwogIGZvciAoaT0wOyBpPG5FbGVtZW50czsgaSsrKSB7CiAgICBBVFNfRUxFTUVOVCogYXRzRWxlbSA9IGhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXTsKICAgIE1JTlNOUl9BREFQVF9QQVJBTSAqbXNhUGFyYW0gPSAmYXRzRWxlbS0+bWluU25yQWRhcHRQYXJhbTsKICAgIElOVCBjaEJpdHJhdGUgPSBlbEJpdHNbaV0tPmNoQml0cmF0ZUVsOwoKICAgIC8qIHBhcmFtZXRlcnMgZm9yIGJpdHJlcyBjb250cm9sICovCiAgICBhdHNFbGVtLT5wZU1pbiA9IGZNdWx0SShQT0lOVDgsIG1lYW5QZSkgPj4gMTsKICAgIGF0c0VsZW0tPnBlTWF4ID0gZk11bHRJKFBPSU5UNiwgbWVhblBlKTsKCiAgICAvKiBmb3IgdXNlIGluIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzVkJSICovCiAgICBhdHNFbGVtLT5jaGFvc01lYXN1cmVPbGQgPSBGTDJGWENPTlNUX0RCTCgwLjNmKTsKCiAgICAvKiBhZGRpdGlvbmFsIHBlIG9mZnNldCB0byBjb3JyZWN0IHBlMmJpdHMgZm9yIGxvdyBiaXRyYXRlcyAqLwogICAgYXRzRWxlbS0+cGVPZmZzZXQgPSAwOwoKICAgIC8qIHZiciBpbml0aWFsaXNhdGlvbiAqLwogICAgYXRzRWxlbS0+dmJyUXVhbEZhY3RvciA9IHZiclF1YWxGYWN0b3I7CiAgICBpZiAoY2hCaXRyYXRlIDwgMzIwMDApCiAgICB7CiAgICAgIGF0c0VsZW0tPnBlT2Zmc2V0ID0gZml4TWF4KDUwLCAxMDAtZk11bHRJKChGSVhQX0RCTCkweDY2NjY2NywgY2hCaXRyYXRlKSk7CiAgICB9CgogICAgLyogYXZvaWQgaG9sZSBwYXJhbWV0ZXJzICovCiAgICBpZiAoY2hCaXRyYXRlID4gMjAwMDApIHsKICAgICAgYXRzRWxlbS0+YWhQYXJhbS5tb2RpZnlNaW5TbnIgPSBUUlVFOwogICAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiTCA9IDE1OwogICAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiUyA9IDM7CiAgICB9CiAgICBlbHNlIHsKICAgICAgYXRzRWxlbS0+YWhQYXJhbS5tb2RpZnlNaW5TbnIgPSBGQUxTRTsKICAgICAgYXRzRWxlbS0+YWhQYXJhbS5zdGFydFNmYkwgPSAwOwogICAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiUyA9IDA7CiAgICB9CgogICAgLyogbWluU25yIGFkYXB0YXRpb24gKi8KICAgIG1zYVBhcmFtLT5tYXhSZWQgPSBGTDJGWENPTlNUX0RCTCgwLjAwMzkwNjI1Zik7IC8qIDAuMjVmLzY0LjBmICovCiAgICAvKiBzdGFydCBhZGFwdGF0aW9uIG9mIG1pblNuciBmb3IgYXZnRW4vc2ZiRW4gPiBzdGFydFJhdGlvICovCiAgICBtc2FQYXJhbS0+c3RhcnRSYXRpbyA9IEZMMkZYQ09OU1RfREJMKDAuMDUxOTA1MTI2NDhmKTsgLyogbGQ2NCgxMC4wZikgKi8KICAgIC8qIG1heGltdW0gbWluU25yIHJlZHVjdGlvbiB0byBtaW5TbnJebWF4UmVkIGlzIHJlYWNoZWQgZm9yCiAgICAgICBhdmdFbi9zZmJFbiA+PSBtYXhSYXRpbyAqLwogICAgLyogbXNhUGFyYW0tPm1heFJhdGlvID0gMTAwMC4wZjsgKi8KICAgIC8qbXNhUGFyYW0tPnJlZFJhdGlvRmFjID0gKChmbG9hdCkxLjBmIC0gbXNhUGFyYW0tPm1heFJlZCkgLyAoKGZsb2F0KTEwLjBmKmxvZzEwKG1zYVBhcmFtLT5zdGFydFJhdGlvL21zYVBhcmFtLT5tYXhSYXRpbykvbG9nMTAoMi4wZikqKGZsb2F0KTAuMzAxMDI5OTk1NmYpOyovCiAgICBtc2FQYXJhbS0+cmVkUmF0aW9GYWMgPSBGTDJGWENPTlNUX0RCTCgtMC4zNzVmKTsgLyogLTAuMDM3NWYgKiAxMC4wZiAqLwogICAgLyptc2FQYXJhbS0+cmVkT2ZmcyA9IChmbG9hdCkxLjBmIC0gbXNhUGFyYW0tPnJlZFJhdGlvRmFjICogKGZsb2F0KTEwLjBmICogbG9nMTAobXNhUGFyYW0tPnN0YXJ0UmF0aW8pL2xvZzEwKDIuMGYpICogKGZsb2F0KTAuMzAxMDI5OTk1NmY7Ki8KICAgIG1zYVBhcmFtLT5yZWRPZmZzID0gRkwyRlhDT05TVF9EQkwoMC4wMjE0ODQzNzUpOyAvKiAxLjM3NWYvNjQuMGYgKi8KCiAgICAvKiBpbml0IHBlIGNvcnJlY3Rpb24gKi8KICAgIGF0c0VsZW0tPnBlQ29ycmVjdGlvbkZhY3Rvcl9tID0gRkwyRlhDT05TVF9EQkwoMC41Zik7IC8qIDEuMCAqLwogICAgYXRzRWxlbS0+cGVDb3JyZWN0aW9uRmFjdG9yX2UgPSAxOwoKICAgIGF0c0VsZW0tPmR5bkJpdHNMYXN0ID0gLTE7CiAgICBhdHNFbGVtLT5wZUxhc3QgPSAwOwoKICAgIC8qIGluaXQgYml0cyB0byBwZSBmYWN0b3IgKi8KCiAgICAvKiBpbml0IGJpdHMyUGVGYWN0b3IgKi8KICAgIEZES2FhY0VuY19Jbml0Qml0czJQZUZhY3RvcigKICAgICAgICAgICAgICAmYXRzRWxlbS0+Yml0czJQZUZhY3Rvcl9tLAogICAgICAgICAgICAgICZhdHNFbGVtLT5iaXRzMlBlRmFjdG9yX2UsCiAgICAgICAgICAgICAgY2hCaXRyYXRlKm5DaGFubmVsc0VmZiwgLyogb3ZlcmFsbCBiaXRyYXRlICovCiAgICAgICAgICAgICAgbkNoYW5uZWxzRWZmLCAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgIGFkdmFuY2VkQml0c1RvUGUsCiAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSwKICAgICAgICAgICAgICBpbnZRdWFudAogICAgICAgICAgICAgICk7CgogIH0gLyogZm9yIG5FbGVtZW50cyAqLwoKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZUNvcnJlY3Rpb24KICAgIGRlc2NyaXB0aW9uOiAgY2FsYyBkZXNpcmVkIHBlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZUNvcnJlY3Rpb24oCiAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICBjb3JyZWN0aW9uRmFjX20sCiAgICAgICAgSU5UICpjb25zdCAgICAgICAgICAgICAgICBjb3JyZWN0aW9uRmFjX2UsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBwZUFjdCwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHBlTGFzdCwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHNMYXN0LAogICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9lCiAgICAgICAgKQp7CiAgaWYgKCAoYml0c0xhc3QgPiAwKSAmJiAocGVBY3QgPCAxLjVmKnBlTGFzdCkgJiYgKHBlQWN0ID4gMC43ZipwZUxhc3QpICYmCiAgICAgICAoRkRLYWFjRW5jX2JpdHMycGUyKGJpdHNMYXN0LCBmTXVsdChGTDJGWENPTlNUX0RCTCgxLjJmLzIuZiksIGJpdHMyUGVGYWN0b3JfbSksIGJpdHMyUGVGYWN0b3JfZSsxKSA+IHBlTGFzdCkgJiYKICAgICAgIChGREthYWNFbmNfYml0czJwZTIoYml0c0xhc3QsIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNjVmKSwgICAgYml0czJQZUZhY3Rvcl9tKSwgYml0czJQZUZhY3Rvcl9lICApIDwgcGVMYXN0KSApCiAgewogICAgRklYUF9EQkwgY29yckZhYyA9ICpjb3JyZWN0aW9uRmFjX207CgogICAgaW50IHNjYWxpbmcgPSAwOwogICAgRklYUF9EQkwgZGVudW0gPSAoRklYUF9EQkwpRkRLYWFjRW5jX2JpdHMycGUyKGJpdHNMYXN0LCBiaXRzMlBlRmFjdG9yX20sIGJpdHMyUGVGYWN0b3JfZSk7CiAgICBGSVhQX0RCTCBuZXdGYWMgPSBmRGl2Tm9ybSgoRklYUF9EQkwpcGVMYXN0LCBkZW51bSwgJnNjYWxpbmcpOwoKICAgIC8qIGRlYWQgem9uZSwgbmV3RmFjIGFuZCBjb3JyRmFjIGFyZSBzY2FsZWQgYnkgMC41ICovCiAgICBpZiAoKEZJWFBfREJMKXBlTGFzdCA8PSBkZW51bSkgeyAvKiByYXRpbyA8PSAxLmYgKi8KICAgICAgbmV3RmFjID0gZml4TWF4KHNjYWxlVmFsdWUoZml4TWluKCBmTXVsdChGTDJGWENPTlNUX0RCTCgxLjFmLzIuZiksIG5ld0ZhYyksIHNjYWxlVmFsdWUoRkwyRlhDT05TVF9EQkwoICAxLmYvMi5mKSwgLXNjYWxpbmcpKSwgc2NhbGluZyksIEZMMkZYQ09OU1RfREJMKDAuODVmLzIuZikgKTsKICAgIH0KICAgIGVsc2UgeyAvKiByYXRpbyA8IDEuZiAqLwogICAgIG5ld0ZhYyA9IGZpeE1heCggZml4TWluKCBzY2FsZVZhbHVlKGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuOWYvMi5mKSwgbmV3RmFjKSwgc2NhbGluZyksIEZMMkZYQ09OU1RfREJMKDEuMTVmLzIuZikgKSwgRkwyRlhDT05TVF9EQkwoICAgMS5mLzIuZikgKTsKICAgIH0KCiAgICBpZiAoICAgKChuZXdGYWMgPiBGTDJGWENPTlNUX0RCTCgxLmYvMi5mKSkgJiYgKGNvcnJGYWMgPCBGTDJGWENPTlNUX0RCTCgxLmYvMi5mKSkpCiAgICAgICAgfHwgKChuZXdGYWMgPCBGTDJGWENPTlNUX0RCTCgxLmYvMi5mKSkgJiYgKGNvcnJGYWMgPiBGTDJGWENPTlNUX0RCTCgxLmYvMi5mKSkpKQogICAgewogICAgICBjb3JyRmFjID0gRkwyRlhDT05TVF9EQkwoMS5mLzIuZik7CiAgICB9CgogICAgLyogZmFzdGVyIGFkYXB0YXRpb24gdG93YXJkcyAxLjAsIHNsb3dlciBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uICovCiAgICBpZiAoIChjb3JyRmFjIDwgRkwyRlhDT05TVF9EQkwoMS5mLzIuZikgJiYgbmV3RmFjIDwgY29yckZhYykKICAgICAgfHwgKGNvcnJGYWMgPiBGTDJGWENPTlNUX0RCTCgxLmYvMi5mKSAmJiBuZXdGYWMgPiBjb3JyRmFjKSApCiAgICB7CiAgICAgIGNvcnJGYWMgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjg1ZiksIGNvcnJGYWMpICsgZk11bHQoRkwyRlhDT05TVF9EQkwoMC4xNWYpLCBuZXdGYWMpOwogICAgfQogICAgZWxzZSB7CiAgICAgIGNvcnJGYWMgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmKSwgY29yckZhYykgKyBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjNmKSwgbmV3RmFjKTsKICAgIH0KCiAgICBjb3JyRmFjID0gZml4TWF4KCBmaXhNaW4oIGNvcnJGYWMsIEZMMkZYQ09OU1RfREJMKDEuMTVmLzIuZikgKSwgRkwyRlhDT05TVF9EQkwoMC44NS8yLmYpICk7CgogICAgKmNvcnJlY3Rpb25GYWNfbSA9IGNvcnJGYWM7CiAgICAqY29ycmVjdGlvbkZhY19lID0gMTsKICB9CiAgZWxzZSB7CiAgICAqY29ycmVjdGlvbkZhY19tID0gRkwyRlhDT05TVF9EQkwoMS5mLzIuZik7CiAgICAqY29ycmVjdGlvbkZhY19lID0gMTsKICB9Cn0KCgpzdGF0aWMgdm9pZCBGREthYWNFbmNfY2FsY1BlQ29ycmVjdGlvbkxvd0JpdFJlcygKICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgIGNvcnJlY3Rpb25GYWNfbSwKICAgICAgICBJTlQgKmNvbnN0ICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25GYWNfZSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHBlTGFzdCwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHNMYXN0LAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgYml0cmVzTGV2ZWwsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCiAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX20sCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX2UKICAgICAgICApCnsKICAvKiB0dW5pbmcgcGFyYW1zICovCiAgY29uc3QgRklYUF9EQkwgYW1wICAgICA9IEZMMkZYQ09OU1RfREJMKDAuMDA1KTsKICBjb25zdCBGSVhQX0RCTCBtYXhEaWZmID0gRkwyRlhDT05TVF9EQkwoMC4yNWYpOwoKICBpZiAoYml0c0xhc3QgPiAwKSB7CgogICAgLyogRXN0aW1hdGUgZGV2aWF0aW9uIG9mIGdyYW50ZWQgYW5kIHVzZWQgZHluYW1pYyBiaXRzIGluIHByZXZpb3VzIGZyYW1lLCBpbiBQRSB1bml0cyAqLwogICAgY29uc3QgaW50IGJpdHNCYWxMYXN0ID0gcGVMYXN0IC0gRkRLYWFjRW5jX2JpdHMycGUyKAogICAgICAgICAgYml0c0xhc3QsCiAgICAgICAgICBiaXRzMlBlRmFjdG9yX20sCiAgICAgICAgICBiaXRzMlBlRmFjdG9yX2UpOwoKICAgIC8qIHJlc2VydmUgbiBiaXRzIHBlciBjaGFubmVsICovCiAgICBpbnQgaGVhZHJvb20gPSAoYml0cmVzTGV2ZWw+PTUwKm5DaGFubmVscykgPyAwIDogKDEwMCpuQ2hhbm5lbHMpOwoKICAgIC8qIGluIFBFIHVuaXRzICovCiAgICBoZWFkcm9vbSA9IEZES2FhY0VuY19iaXRzMnBlMigKICAgICAgICAgIGhlYWRyb29tLAogICAgICAgICAgYml0czJQZUZhY3Rvcl9tLAogICAgICAgICAgYml0czJQZUZhY3Rvcl9lKTsKCiAgICAvKgogICAgICogZGlmZiA9IGFtcCAqICgoYml0c0JhbExhc3QgLSBoZWFkcm9vbSkgLyAoYml0cmVzTGV2ZWwgKyBoZWFkcm9vbSkKICAgICAqIGRpZmYgPSBtYXggKCBtaW4gKCBkaWZmLCBtYXhEaWZmLCAtbWF4RGlmZikpIC8gMgogICAgICovCiAgICBGSVhQX0RCTCBkZW5vbWluYXRvciA9IChGSVhQX0RCTClGREthYWNFbmNfYml0czJwZTIoYml0cmVzTGV2ZWwsIGJpdHMyUGVGYWN0b3JfbSwgYml0czJQZUZhY3Rvcl9lKSArIChGSVhQX0RCTCloZWFkcm9vbTsKCiAgICBpbnQgc2NhbGluZyA9IDA7CiAgICBGSVhQX0RCTCBkaWZmID0gKGJpdHNCYWxMYXN0Pj1oZWFkcm9vbSkKICAgICAgICAgPyAgZk11bHQoYW1wLCBmRGl2Tm9ybSggKEZJWFBfREJMKShiaXRzQmFsTGFzdCAtIGhlYWRyb29tKSwgZGVub21pbmF0b3IsICZzY2FsaW5nKSkKICAgICAgICAgOiAtZk11bHQoYW1wLCBmRGl2Tm9ybSgtKEZJWFBfREJMKShiaXRzQmFsTGFzdCAtIGhlYWRyb29tKSwgZGVub21pbmF0b3IsICZzY2FsaW5nKSkgOwoKICAgIHNjYWxpbmcgLT0gMTsgLyogZGl2aWRlIGJ5IDIgKi8KCiAgICBkaWZmID0gKHNjYWxpbmc8PTApID8gRkRLbWF4KCBGREttaW4gKGRpZmY+Pigtc2NhbGluZyksIG1heERpZmY+PjEpLCAtbWF4RGlmZj4+MSkKICAgICAgICAgICAgICAgICAgICAgICAgOiBGREttYXgoIEZES21pbiAoZGlmZiwgbWF4RGlmZj4+KDErc2NhbGluZykpLCAtbWF4RGlmZj4+KDErc2NhbGluZykpIDw8IHNjYWxpbmc7CgogICAgLyoKICAgICAqIGNvcnJGYWMgKz0gZGlmZgogICAgICogY29yckZhYyA9IG1heCAoIG1pbiAoIGNvcnJGYWMvMi5mLCAxLmYvMi5mLCAwLjc1Zi8yLmYgKSApCiAgICAgKi8KICAgICpjb3JyZWN0aW9uRmFjX20gPSBGREttYXgoRkRLbWluKCgqY29ycmVjdGlvbkZhY19tKStkaWZmLCBGTDJGWENPTlNUX0RCTCgxLjBmLzIuZikpLCBGTDJGWENPTlNUX0RCTCgwLjc1Zi8yLmYpKSA7CiAgICAqY29ycmVjdGlvbkZhY19lID0gMTsKICB9CiAgZWxzZSB7CiAgICAqY29ycmVjdGlvbkZhY19tID0gRkwyRlhDT05TVF9EQkwoMC43NS8yLmYpOwogICAgKmNvcnJlY3Rpb25GYWNfZSA9IDE7CiAgfQp9Cgp2b2lkIEZES2FhY0VuY19EaXN0cmlidXRlQml0cyhBREpfVEhSX1NUQVRFICphZGpUaHJTdGF0ZSwKICAgIEFUU19FTEVNRU5UICAgICAgICpBZGpUaHJTdGF0ZUVsZW1lbnQsCiAgICBQU1lfT1VUX0NIQU5ORUwgICAqcHN5T3V0Q2hhbm5lbFsoMildLAogICAgUEVfREFUQSAgICAgICAgICAgKnBlRGF0YSwKICAgIElOVCAgICAgICAgICAgICAgICpncmFudGVkUGUsCiAgICBJTlQgICAgICAgICAgICAgICAqZ3JhbnRlZFBlQ29yciwKICAgIGNvbnN0IElOVCAgICAgICAgIG5DaGFubmVscywKICAgIGNvbnN0IElOVCAgICAgICAgIGNvbW1vbldpbmRvdywKICAgIGNvbnN0IElOVCAgICAgICAgIGdyYW50ZWREeW5CaXRzLAogICAgY29uc3QgSU5UICAgICAgICAgYml0cmVzQml0cywKICAgIGNvbnN0IElOVCAgICAgICAgIG1heEJpdHJlc0JpdHMsCiAgICBjb25zdCBGSVhQX0RCTCAgICBtYXhCaXRGYWMsCiAgICBjb25zdCBJTlQgICAgICAgICBiaXREaXN0cmlidXRpb25Nb2RlKQp7CiAgRklYUF9EQkwgYml0RmFjdG9yOwogIElOVCBub1JlZFBlID0gcGVEYXRhLT5wZTsKCiAgLyogcHJlZmVyIHNob3J0IHdpbmRvd3MgZm9yIGNhbGN1bGF0aW9uIG9mIGJpdEZhY3RvciAqLwogIElOVCBjdXJXaW5kb3dTZXF1ZW5jZSA9IExPTkdfV0lORE9XOwogIGlmIChuQ2hhbm5lbHM9PTIpIHsKICAgIGlmICgocHN5T3V0Q2hhbm5lbFswXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgfHwKICAgICAgICAocHN5T3V0Q2hhbm5lbFsxXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykpIHsKICAgICAgICBjdXJXaW5kb3dTZXF1ZW5jZSA9IFNIT1JUX1dJTkRPVzsKICAgIH0KICB9CiAgZWxzZSB7CiAgICBjdXJXaW5kb3dTZXF1ZW5jZSA9IHBzeU91dENoYW5uZWxbMF0tPmxhc3RXaW5kb3dTZXF1ZW5jZTsKICB9CgogIGlmIChncmFudGVkRHluQml0cyA+PSAxKSB7CiAgICBpZiAoYml0RGlzdHJpYnV0aW9uTW9kZSE9MCkgewogICAgICAqZ3JhbnRlZFBlID0gRkRLYWFjRW5jX2JpdHMycGUyKGdyYW50ZWREeW5CaXRzLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfbSwgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX2UpOwogICAgfQogICAgZWxzZQogICAgewogICAgLyogZmFjdG9yIGRlcGVuZGVuZCBvbiBjdXJyZW50IGZpbGwgbGV2ZWwgYW5kIHBlICovCiAgICBiaXRGYWN0b3IgPSBGREthYWNFbmNfYml0cmVzQ2FsY0JpdEZhYyhiaXRyZXNCaXRzLCBtYXhCaXRyZXNCaXRzLCBub1JlZFBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJXaW5kb3dTZXF1ZW5jZSwgZ3JhbnRlZER5bkJpdHMsIG1heEJpdEZhYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqVGhyU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgIC8qIGRlc2lyZWQgcGUgZm9yIGFjdHVhbCBmcmFtZSAqLwogICAgLyogV29yc3QgY2FzZSBtYXggb2YgZ3JhbnRlZER5bkJpdHMgaXMgPSAxMDI0ICogNS4yNyAqIDIgKi8KICAgICpncmFudGVkUGUgPSBGREthYWNFbmNfYml0czJwZTIoZ3JhbnRlZER5bkJpdHMsCiAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGJpdEZhY3RvciwgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX20pLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfZSsoREZSQUNUX0JJVFMtMS1RX0JJVEZBQykKICAgICAgICAgICAgICAgICAgICAgKTsKICAgIH0KICB9CiAgZWxzZSB7CiAgICAqZ3JhbnRlZFBlID0gMDsgLyogcHJldmVudCBkaXZzaW9uIGJ5IDAgKi8KICB9CgogIC8qIGNvcnJlY3Rpb24gb2YgcGUgdmFsdWUgKi8KICBzd2l0Y2ggKGJpdERpc3RyaWJ1dGlvbk1vZGUpIHsKICBjYXNlIDI6CiAgY2FzZSAxOgogICAgRkRLYWFjRW5jX2NhbGNQZUNvcnJlY3Rpb25Mb3dCaXRSZXMoCiAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX20sCiAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX2UsCiAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+cGVMYXN0LAogICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmR5bkJpdHNMYXN0LAogICAgICAgICAgICBiaXRyZXNCaXRzLAogICAgICAgICAgICBuQ2hhbm5lbHMsCiAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9tLAogICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfZQogICAgICAgICk7CiAgICBicmVhazsKICBjYXNlIDA6CiAgZGVmYXVsdDoKICAgICAgRkRLYWFjRW5jX0ZES2FhY0VuY19jYWxjUGVDb3JyZWN0aW9uKAogICAgICAgICAgICZBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3Rvcl9tLAogICAgICAgICAgICZBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3Rvcl9lLAogICAgICAgICAgICBmaXhNaW4oKmdyYW50ZWRQZSwgbm9SZWRQZSksCiAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+cGVMYXN0LAogICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmR5bkJpdHNMYXN0LAogICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfbSwKICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX2UKICAgICAgICAgICAgKTsKICAgIGJyZWFrOwogIH0KCiAgKmdyYW50ZWRQZUNvcnIgPSAoSU5UKShmTXVsdCgoRklYUF9EQkwpKCpncmFudGVkUGU8PFFfQVZHQklUUyksIEFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX20pID4+IChRX0FWR0JJVFMtQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfZSkpOwoKICAvKiB1cGRhdGUgbGFzdCBwZSAqLwogIEFkalRoclN0YXRlRWxlbWVudC0+cGVMYXN0ID0gKmdyYW50ZWRQZTsKICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmR5bkJpdHNMYXN0ID0gLTE7Cgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQWRqdXN0VGhyZXNob2xkcwpkZXNjcmlwdGlvbjogIGFkanVzdCB0aHJlc2hvbGRzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEZES2FhY0VuY19BZGp1c3RUaHJlc2hvbGRzKEFUU19FTEVNRU5UKiAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICAgICBxY0VsZW1lbnRbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqICAgICAgICAgICAgIHFjT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogICAgcHN5T3V0RWxlbWVudFsoOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgQ0JSYml0cmF0ZU1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICBtYXhJdGVyMm5kR3Vlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiAgICBjbSkKewogICAgaW50IGk7CiAgICBpZiAoQ0JSYml0cmF0ZU1vZGUpCiAgICB7CiAgICAgICAgLyogSW4gY2FzZSwgbm8gYml0cyBtdXN0IGJlIHNoaWZ0ZWQgYmV0d2VlbiBkaWZmZXJlbnQgZWxlbWVudHMsICovCiAgICAgICAgLyogYW4gZWxlbWVudC13aXNlIGV4ZWN1dGlvbiBvZiB0aGUgcGUtZGVwZW5kZW50IHRocmVzaG9sZC0gKi8KICAgICAgICAvKiBhZGFwdGlvbiBiZWNvbWVzIG5lY2Vzc2FyeS4uLiAqLwogICAgICAgICAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOwoKICAgICAgICAgICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKICAgICAgICAgICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8qIHFjRWxlbWVudFtpXS0+Z3JhbnRlZFBlID0gMjAwMDsgKi8gIC8qIFVzZSB0aGlzIG9ubHkgZm9yIGRlYnVnZ2luZyAqLwogICAgICAgICAgICAgICAgICAgIC8vaWYgKHRvdGFsR3JhbnRlZFBlQ29yciA8IHRvdGFsTm9SZWRQZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChxY0VsZW1lbnRbaV0tPmdyYW50ZWRQZSA8IHFjRWxlbWVudFtpXS0+cGVEYXRhLnBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsYyB0aHJlc2hvbGQgbmVjZXNzYXJ5IGZvciBkZXNpcmVkIHBlICovCiAgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlKGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbaV0tPmdyYW50ZWRQZUNvcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SXRlcjJuZEd1ZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgLyogUHJvY2VzcyBvbmx5IDEgZWxlbWVudCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOyAgICAgICAgLyogUHJvY2VzcyBleGFjdGx5IFRISVMgZWxlbWVudCAqLwoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSAgLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLwoKICAgICAgICAgICAgfSAgLyogLWVuZC0gZWxlbWVudCBsb29wICovCiAgICB9CiAgICBlbHNlIHsKICAgICAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKCiAgICAgICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKICAgICAgICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgLyogZm9yIFZCUi1tb2RlICovCiAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19BZGFwdFRocmVzaG9sZHNWQlIocWNFbGVtZW50W2ldLT5xY091dENoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnRbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnRbaV0tPnRvb2xzSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNFbGVtZW50W2ldLT5wZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsKTsKICAgICAgICAgICAgfSAgLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLwoKICAgICAgICB9ICAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KCiAgICB9CiAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspIHsKICAgICAgICBpbnQgY2gsc2ZiLHNmYkdycDsKICAgICAgICAvKiBubyB3ZWlnaHRpbmcgb2YgdGhyZWhvbGRzIGFuZCBlbmVyZ2llcyBmb3IgbWxvdXQgKi8KICAgICAgICAvKiB3ZWlnaHQgZW5lcmdpZXMgYW5kIHRocmVzaG9sZHMgKi8KICAgICAgICBmb3IgKGNoPTA7IGNoPGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbDsgY2grKykgewogICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcFFjT3V0Q2ggPSBxY0VsZW1lbnRbaV0tPnFjT3V0Q2hhbm5lbFtjaF07CiAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewogICAgICAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgICAgICAgICAgICAgICBwUWNPdXRDaC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYitzZmJHcnBdICs9IHBRY091dENoLT5zZmJFbkZhY0xkW3NmYitzZmJHcnBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIEZES2FhY0VuY19BZGpUaHJDbG9zZShBREpfVEhSX1NUQVRFKiogcGhBZGpUaHIpCnsKICAgIElOVCBpOwogICAgQURKX1RIUl9TVEFURSogaEFkalRociA9ICpwaEFkalRocjsKCiAgICBpZiAoaEFkalRociE9TlVMTCkgewogICAgICBmb3IgKGk9MDsgaTwoOCk7IGkrKykgewogICAgICAgIGlmIChoQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0hPU5VTEwpIHsKICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX0FkalRoclN0YXRlRWxlbWVudCgmaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgRnJlZVJhbV9hYWNFbmNfQWRqdXN0VGhyZXNob2xkKHBoQWRqVGhyKTsKICAgIH0KfQoK