Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBJbml0aWFsIGF1dGhvcjogICAgICAgQS4gSG9ybmRhc2NoIChjb2RlIG9yaWdpbmFsbHkgZnJvbSBsd3IpIC8gSm9zZWYgSG9lcGZsIChGREspCiAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBpbnRlbnNpdHkgc3RlcmVvIHByb2Nlc3NpbmcKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJpbnRlbnNpdHkuaCIKI2luY2x1ZGUgImludGVyZmFjZS5oIgojaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKI2luY2x1ZGUgInBzeV9jb25zdC5oIgojaW5jbHVkZSAicWNfbWFpbi5oIgojaW5jbHVkZSAiYml0X2NudC5oIgoKLyogb25seSBzZXQgYW4gSVMgc2VlZCBpdCBsZWZ0L3JpZ2h0IGNoYW5uZWwgY29ycmVsYXRpb24gaXMgYWJvdmUgSVNfQ09SUl9USFJFU0ggKi8KI2RlZmluZSBJU19DT1JSX1RIUkVTSCAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjk1ZikKCi8qIHdoZW4gZXhwYW5kaW5nIHRoZSBJUyByZWdpb24gdG8gbW9yZSBTRkJzIG9ubHkgYWNjZXB0IGFuIGVycm9yIHRoYXQgaXMKICogbm90IG1vcmUgdGhhbiBJU19UT1RBTF9FUlJPUl9USFJFU0ggb3ZlcmFsbCBhbmQKICogbm90IG1vcmUgdGhhbiBJU19MT0NBTF9FUlJPUl9USFJFU0ggZm9yIHRoZSBjdXJyZW50IFNGQiAqLwojZGVmaW5lIElTX1RPVEFMX0VSUk9SX1RIUkVTSCAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMDRmKQojZGVmaW5lIElTX0xPQ0FMX0VSUk9SX1RIUkVTSCAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMDFmKQoKLyogdGhlIG1heGltdW0gYWxsb3dlZCBjaGFuZ2Ugb2YgdGhlIGludGVuc2l0eSBkaXJlY3Rpb24gKHVuaXQ6IElTIHNjYWxlKSAtIHNjYWxlZCB3aXRoIGZhY3RvciAwLjI1IC0gKi8KI2RlZmluZSBJU19ESVJFQ1RJT05fREVWSUFUSU9OX1RIUkVTSF9TRiAyCiNkZWZpbmUgSVNfRElSRUNUSU9OX0RFVklBVElPTl9USFJFU0ggRkwyRlhDT05TVF9EQkwoMi4wZi8oMTw8SVNfRElSRUNUSU9OX0RFVklBVElPTl9USFJFU0hfU0YpKQoKLyogSVMgcmVnaW9ucyBuZWVkIHRvIGhhdmUgYSBtaW5pbWFsIHBlcmNlbnRhZ2Ugb2YgdGhlIG92ZXJhbGwgbG91ZG5lc3MsIGUuZy4gMC4wNiA9PSA2JSAqLwojZGVmaW5lIElTX1JFR0lPTl9NSU5fTE9VRE5FU1MgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMWYpCgovKiBvbmx5IHBlcmZvcm0gSVMgaWYgSVNfTUlOX1NGQlMgbmVpZ2hib3JpbmcgU0ZCcyBjYW4gYmUgcHJvY2Vzc2VkICovCiNkZWZpbmUgSVNfTUlOX1NGQlMgICAgICAgICAgICAgICAgICAgNgoKLyogb25seSBkbyBJUyBpZgogKiBpZiBJU19MRUZUX1JJR0hUX1JBVElPX1RIUkVTSCA8IHNmYkVuZXJneUxlZnRbc2ZiXS9zZmJFbmVyZ3lSaWdodFtzZmJdIDwgMSAvIElTX0xFRlRfUklHSFRfUkFUSU9fVEhSRVNICiAqIC0+IG5vIElTIGlmIHRoZSBwYW5uaW5nIGFuZ2xlIGlzIG5vdCBmYXIgZnJvbSB0aGUgbWlkZGxlLCBNUyB3aWxsIGRvICovCi8qIHRoaXMgaXMgZXF1aXZhbGVudCB0byBhIHNjYWxlIG9mICsvLTEuMDI5MTQ2MzQ1NjYgKi8KI2RlZmluZSBJU19MRUZUX1JJR0hUX1JBVElPX1RIUkVTSCAgICBGTDJGWENPTlNUX0RCTCgwLjdmKQoKLyogc2NhbGVmYWN0b3Igb2YgcmVhbFNjYWxlICovCiNkZWZpbmUgUkVBTF9TQ0FMRV9TRiAgICAgICAgICAgICAgICAgICAgMQoKLyogc2NhbGVmYWN0b3Igb3ZlcmFsbExvdWRuZXNzICovCiNkZWZpbmUgT1ZFUkFMTF9MT1VETkVTU19TRiAgICAgICAgICAgICAgNgoKLyogc2NhbGVmYWN0b3IgZm9yIHN1bSBvdmVyIG1heCBzYW1wbGVzIHBlciBnb3VwICovCiNkZWZpbmUgTUFYX1NGQl9QRVJfR1JPVVBfU0YgICAgICAgICAgICAgNgoKLyogc2NhbGVmYWN0b3IgZm9yIHN1bSBvZiBtZGN0IHNwZWN0cnVtICovCiNkZWZpbmUgTURDVF9TUEVDX1NGICAgICAgICAgICAgICAgICAgICAgNgoKCnR5cGVkZWYgc3RydWN0CnsKCiAgRklYUF9EQkwgY29ycl90aHJlc2g7ICAgICAgICAgICAgICAgICAvKiE8IE9ubHkgc2V0IGFuIElTIHNlZWQgaXQgbGVmdC9yaWdodCBjaGFubmVsIGNvcnJlbGF0aW9uIGlzIGFib3ZlIGNvcnJfdGhyZXNoICovCgogIEZJWFBfREJMIHRvdGFsX2Vycm9yX3RocmVzaDsgICAgICAgICAgLyohPCBXaGVuIGV4cGFuZGluZyB0aGUgSVMgcmVnaW9uIHRvIG1vcmUgU0ZCcyBvbmx5IGFjY2VwdCBhbiBlcnJvciB0aGF0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtb3JlIHRoYW4gJ3RvdGFsX2Vycm9yX3RocmVzaCcgb3ZlcmFsbC4gKi8KCiAgRklYUF9EQkwgbG9jYWxfZXJyb3JfdGhyZXNoOyAgICAgICAgICAvKiE8IFdoZW4gZXhwYW5kaW5nIHRoZSBJUyByZWdpb24gdG8gbW9yZSBTRkJzIG9ubHkgYWNjZXB0IGFuIGVycm9yIHRoYXQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IG1vcmUgdGhhbiAnbG9jYWxfZXJyb3JfdGhyZXNoJyBmb3IgdGhlIGN1cnJlbnQgU0ZCLiAqLwoKICBGSVhQX0RCTCBkaXJlY3Rpb25fZGV2aWF0aW9uX3RocmVzaDsgIC8qITwgVGhlIG1heGltdW0gYWxsb3dlZCBjaGFuZ2Ugb2YgdGhlIGludGVuc2l0eSBkaXJlY3Rpb24gKHVuaXQ6IElTIHNjYWxlKSAqLwoKICBGSVhQX0RCTCBpc19yZWdpb25fbWluX2xvdWRuZXNzOyAgICAgIC8qITwgSVMgcmVnaW9ucyBuZWVkIHRvIGhhdmUgYSBtaW5pbWFsIHBlcmNlbnRhZ2Ugb2YgdGhlIG92ZXJhbGwgbG91ZG5lc3MsIGUuZy4gMC4wNiA9PSA2JSAqLwoKICBJTlQgICAgICBtaW5faXNfc2ZiczsgICAgICAgICAgICAgICAgIC8qITwgT25seSBwZXJmb3JtIElTIGlmICdtaW5faXNfc2ZicycgbmVpZ2hib3JpbmcgU0ZCcyBjYW4gYmUgcHJvY2Vzc2VkICovCgogIEZJWFBfREJMIGxlZnRfcmlnaHRfcmF0aW9fdGhyZXNob2xkOyAgLyohPCBObyBJUyBpZiB0aGUgcGFubmluZyBhbmdsZSBpcyBub3QgZmFyIGZyb20gdGhlIG1pZGRsZSwgTVMgd2lsbCBkbyAqLwoKfSBJTlRFTlNJVFlfUEFSQU1FVEVSUzsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IGNhbGNTZmJNYXhTY2FsZQoKICAgIGRlc2NyaXB0aW9uOiAgQ2FsYyBtYXggdmFsdWUgaW4gc2NhbGVmYWN0b3IgYmFuZAoKICAgIGlucHV0OiAgICAgICAgKm1kY3RTcGVjdHJ1bQogICAgICAgICAgICAgICAgICAgbDEKICAgICAgICAgICAgICAgICAgIGwyCgogICAgb3V0cHV0OiAgICAgICBub25lCgogICAgcmV0dXJuczogICAgICBzY2FsZWZhY3RvcgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBJTlQKY2FsY1NmYk1heFNjYWxlKGNvbnN0IEZJWFBfREJMICptZGN0U3BlY3RydW0sCiAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbDEsCiAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbDIpCnsKICBJTlQgaTsKICBJTlQgc2ZiTWF4U2NhbGU7CiAgRklYUF9EQkwgbWF4U3BjOwoKICBtYXhTcGMgPSBGTDJGWENPTlNUX0RCTCgwLjApOwogIGZvciAoaT1sMTsgaTxsMjsgaSsrKSB7CiAgICBGSVhQX0RCTCB0bXAgPSBmaXhwX2FicygoRklYUF9EQkwpbWRjdFNwZWN0cnVtW2ldKTsKICAgIG1heFNwYyA9IGZpeE1heChtYXhTcGMsIHRtcCk7CiAgfQogIHNmYk1heFNjYWxlID0gKG1heFNwYz09RkwyRlhDT05TVF9EQkwoMC4wKSkgPyAoREZSQUNUX0JJVFMtMikgOiBDbnRMZWFkaW5nWmVyb3MobWF4U3BjKS0xOwoKICByZXR1cm4gc2ZiTWF4U2NhbGU7CiB9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfaW5pdElzUGFyYW1zCgogICAgZGVzY3JpcHRpb246ICBJbml0aWFsaXphdGlvbiBvZiBpbnRlbnNpdHkgcGFyYW1ldGVycwoKICAgIGlucHV0OiAgICAgICAgaXNQYXJhbXMKCiAgICBvdXRwdXQ6ICAgICAgIGlzUGFyYW1zCgogICAgcmV0dXJuczogICAgICBub25lCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKRkRLYWFjRW5jX2luaXRJc1BhcmFtcyhJTlRFTlNJVFlfUEFSQU1FVEVSUyAqaXNQYXJhbXMpCnsKICBpc1BhcmFtcy0+Y29ycl90aHJlc2ggICAgICAgICAgICAgICAgPSBJU19DT1JSX1RIUkVTSDsKICBpc1BhcmFtcy0+dG90YWxfZXJyb3JfdGhyZXNoICAgICAgICAgPSBJU19UT1RBTF9FUlJPUl9USFJFU0g7CiAgaXNQYXJhbXMtPmxvY2FsX2Vycm9yX3RocmVzaCAgICAgICAgID0gSVNfTE9DQUxfRVJST1JfVEhSRVNIOwogIGlzUGFyYW1zLT5kaXJlY3Rpb25fZGV2aWF0aW9uX3RocmVzaCA9IElTX0RJUkVDVElPTl9ERVZJQVRJT05fVEhSRVNIOwogIGlzUGFyYW1zLT5pc19yZWdpb25fbWluX2xvdWRuZXNzICAgICA9IElTX1JFR0lPTl9NSU5fTE9VRE5FU1M7CiAgaXNQYXJhbXMtPm1pbl9pc19zZmJzICAgICAgICAgICAgICAgID0gSVNfTUlOX1NGQlM7CiAgaXNQYXJhbXMtPmxlZnRfcmlnaHRfcmF0aW9fdGhyZXNob2xkID0gSVNfTEVGVF9SSUdIVF9SQVRJT19USFJFU0g7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19wcmVwYXJlSW50ZW5zaXR5RGVjaXNpb24KCiAgICBkZXNjcmlwdGlvbjogIFByZXBhcmVzIGludGVuc2l0eSBkZWNpc2lvbgoKICAgIGlucHV0OiAgICAgICAgc2ZiRW5lcmd5TGVmdAogICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lSaWdodAogICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lMZERhdGFMZWZ0CiAgICAgICAgICAgICAgICAgIHNmYkVuZXJneUxkRGF0YVJpZ2h0CiAgICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnQKICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5TGREYXRhUmlnaHQKICAgICAgICAgICAgICAgICAgaXNQYXJhbXMKCiAgICBvdXRwdXQ6ICAgICAgIGhyckVyciAgICAgICAgICAgIHNjYWxlOiBub25lCiAgICAgICAgICAgICAgICAgIGlzTWFzayAgICAgICAgICAgIHNjYWxlOiBub25lCiAgICAgICAgICAgICAgICAgIHJlYWxTY2FsZSAgICAgICAgIHNjYWxlOiBMRF9EQVRBX1NISUZUICsgUkVBTF9TQ0FMRV9TRgogICAgICAgICAgICAgICAgICBub3JtU2ZiTG91ZG5lc3MgICBzY2FsZTogbm9uZQoKICAgIHJldHVybnM6ICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCkZES2FhY0VuY19wcmVwYXJlSW50ZW5zaXR5RGVjaXNpb24oY29uc3QgRklYUF9EQkwgICAgKnNmYkVuZXJneUxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgKnNmYkVuZXJneVJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICpzZmJFbmVyZ3lMZERhdGFMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICpzZmJFbmVyZ3lMZERhdGFSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAqbWRjdFNwZWN0cnVtTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAqbWRjdFNwZWN0cnVtUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5URU5TSVRZX1BBUkFNRVRFUlMgKmlzUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpocnJFcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKmlzTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqcmVhbFNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpub3JtU2ZiTG91ZG5lc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIHNmYkNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgc2ZiUGVyR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIG1heFNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICpzZmJPZmZzZXQpCnsKICBJTlQgaixzZmIsc2Zib2ZmczsKICBJTlQgZ3JwQ291bnRlcjsKCiAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlcyB0byBjb21wdXRlIGxvdWRuZXNzICovCiAgRklYUF9EQkwgb3ZlcmFsbExvdWRuZXNzW01BWF9OT19PRl9HUk9VUFNdOwoKICAvKiB0ZW1wb3JhcnkgdmFyaWFibGVzIHRvIGNvbXB1dGUgY29ycmVsYXRpb24gKi8KICBGSVhQX0RCTCBjaGFubmVsQ29ycltNQVhfR1JPVVBFRF9TRkJdOwogIEZJWFBfREJMIG1sLCBtcjsKICBGSVhQX0RCTCBwcm9kX2xyOwogIEZJWFBfREJMIHNxdWFyZV9sLCBzcXVhcmVfcjsKICBGSVhQX0RCTCB0bXBfbCwgdG1wX3I7CiAgRklYUF9EQkwgaW52X247CgogIEZES21lbWNsZWFyKGNoYW5uZWxDb3JyLCAgICAgTUFYX0dST1VQRURfU0ZCKnNpemVvZihGSVhQX0RCTCkpOwogIEZES21lbWNsZWFyKG5vcm1TZmJMb3VkbmVzcywgTUFYX0dST1VQRURfU0ZCKnNpemVvZihGSVhQX0RCTCkpOwogIEZES21lbWNsZWFyKG92ZXJhbGxMb3VkbmVzcywgTUFYX05PX09GX0dST1VQUypzaXplb2YoRklYUF9EQkwpKTsKICBGREttZW1jbGVhcihyZWFsU2NhbGUsICAgICAgIE1BWF9HUk9VUEVEX1NGQipzaXplb2YoRklYUF9EQkwpKTsKCiAgZm9yIChncnBDb3VudGVyID0gMCwgc2Zib2ZmcyA9IDA7IHNmYm9mZnMgPCBzZmJDbnQ7IHNmYm9mZnMgKz0gc2ZiUGVyR3JvdXAsIGdycENvdW50ZXIrKykgewogICAgb3ZlcmFsbExvdWRuZXNzW2dycENvdW50ZXJdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICBJTlQgc0wsc1IsczsKICAgICAgRklYUF9EQkwgaXNWYWx1ZSA9IHNmYkVuZXJneUxkRGF0YUxlZnRbc2ZiK3NmYm9mZnNdLXNmYkVuZXJneUxkRGF0YVJpZ2h0W3NmYitzZmJvZmZzXTsKCiAgICAgIC8qIGRlbGltaXRhdGUgaW50ZW5zaXR5IHNjYWxlIHZhbHVlIHRvIHJlcHJlc2VudGFibGUgcmFuZ2UgKi8KICAgICAgcmVhbFNjYWxlW3NmYiArIHNmYm9mZnNdID0gZml4TWluKEZMMkZYQ09OU1RfREJMKDYwLmYvKDE8PChSRUFMX1NDQUxFX1NGK0xEX0RBVEFfU0hJRlQpKSksIGZpeE1heChGTDJGWENPTlNUX0RCTCgtNjAuZi8oMTw8KFJFQUxfU0NBTEVfU0YrTERfREFUQV9TSElGVCkpKSwgaXNWYWx1ZSkpOwoKICAgICAgc0wgPSBmaXhNYXgoMCwoQ250TGVhZGluZ1plcm9zKHNmYkVuZXJneUxlZnRbc2ZiICsgc2Zib2Zmc10pLTEpKTsKICAgICAgc1IgPSBmaXhNYXgoMCwoQ250TGVhZGluZ1plcm9zKHNmYkVuZXJneVJpZ2h0W3NmYiArIHNmYm9mZnNdKS0xKSk7CiAgICAgIHMgID0gKGZpeE1pbihzTCxzUik+PjIpPDwyOwogICAgICBub3JtU2ZiTG91ZG5lc3Nbc2ZiICsgc2Zib2Zmc10gPSBzcXJ0Rml4cChzcXJ0Rml4cCgoKHNmYkVuZXJneUxlZnRbc2ZiICsgc2Zib2Zmc108PHMpID4+IDEpICsgKChzZmJFbmVyZ3lSaWdodFtzZmIgKyBzZmJvZmZzXTw8cykgPj4gMSkpKSA+PiAocz4+Mik7CgogICAgICBvdmVyYWxsTG91ZG5lc3NbZ3JwQ291bnRlcl0gKz0gbm9ybVNmYkxvdWRuZXNzW3NmYiArIHNmYm9mZnNdID4+IE9WRVJBTExfTE9VRE5FU1NfU0Y7CiAgICAgIC8qIGRvbid0IGRvIGludGVuc2l0eSBpZgogICAgICAgKiAtIHBhbm5pbmcgYW5nbGUgaXMgdG9vIGNsb3NlIHRvIHRoZSBtaWRkbGUgb3IKICAgICAgICogLSBvbmUgY2hhbm5lbCBpcyBub24tZXhpc3RlbnQgb3IKICAgICAgICogLSBpZiBpdCBpcyBkdWFsIG1vbm8gKi8KICAgICAgaWYoICAgKHNmYkVuZXJneUxlZnRbc2ZiICsgc2Zib2Zmc10gPj0gZk11bHQoaXNQYXJhbXMtPmxlZnRfcmlnaHRfcmF0aW9fdGhyZXNob2xkLHNmYkVuZXJneVJpZ2h0W3NmYiArIHNmYm9mZnNdKSkKICAgICAgICAgJiYgKGZNdWx0KGlzUGFyYW1zLT5sZWZ0X3JpZ2h0X3JhdGlvX3RocmVzaG9sZCxzZmJFbmVyZ3lMZWZ0W3NmYiArIHNmYm9mZnNdKSA8PSBzZmJFbmVyZ3lSaWdodFtzZmIgKyBzZmJvZmZzXSkgKSB7CgogICAgICAgIC8qIHRoaXMgd2lsbCBwcmV2ZW50IHBvc3QgcHJvY2Vzc2luZyBmcm9tIGNvbnNpZGVyaW5nIHRoaXMgU0ZCIGZvciBtZXJnaW5nICovCiAgICAgICAgaHJyRXJyW3NmYiArIHNmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoMS4wLzguMCk7CiAgICAgIH0KICAgIH0KICB9CgogIGZvciAoZ3JwQ291bnRlciA9IDAsIHNmYm9mZnMgPSAwOyBzZmJvZmZzIDwgc2ZiQ250OyBzZmJvZmZzICs9IHNmYlBlckdyb3VwLCBncnBDb3VudGVyKyspIHsKICAgIElOVCBpbnZPdmVyYWxsTG91ZG5lc3NTRjsKICAgIEZJWFBfREJMIGludk92ZXJhbGxMb3VkbmVzczsKCiAgICBpZiAob3ZlcmFsbExvdWRuZXNzW2dycENvdW50ZXJdID09IEZMMkZYQ09OU1RfREJMKDAuMCkpIHsKICAgICAgaW52T3ZlcmFsbExvdWRuZXNzID0gRkwyRlhDT05TVF9EQkwoMC4wKTsKICAgICAgaW52T3ZlcmFsbExvdWRuZXNzU0YgPSAwOwogICAgfQogICAgZWxzZSB7CiAgICAgIGludk92ZXJhbGxMb3VkbmVzcyA9IGZEaXZOb3JtKChGSVhQX0RCTClNQVhWQUxfREJMLCBvdmVyYWxsTG91ZG5lc3NbZ3JwQ291bnRlcl0sJmludk92ZXJhbGxMb3VkbmVzc1NGKTsKICAgICAgaW52T3ZlcmFsbExvdWRuZXNzU0YgPSBpbnZPdmVyYWxsTG91ZG5lc3NTRiAtIE9WRVJBTExfTE9VRE5FU1NfU0YgKyAxOyAvKiArMTogY29tcGVuc2F0ZSBmTXVsdERpdjIoKSBpbiBzdWJzZXF1ZW50IGxvb3AgKi8KICAgIH0KICAgIGludk92ZXJhbGxMb3VkbmVzc1NGID0gZml4TWluKGZpeE1heChpbnZPdmVyYWxsTG91ZG5lc3NTRiwtKERGUkFDVF9CSVRTLTEpKSxERlJBQ1RfQklUUy0xKTsKCiAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICBGSVhQX0RCTCB0bXA7CgogICAgICB0bXAgPSBmTXVsdERpdjIoKG5vcm1TZmJMb3VkbmVzc1tzZmIgKyBzZmJvZmZzXT4+T1ZFUkFMTF9MT1VETkVTU19TRik8PE9WRVJBTExfTE9VRE5FU1NfU0YsaW52T3ZlcmFsbExvdWRuZXNzKTsKCiAgICAgIG5vcm1TZmJMb3VkbmVzc1tzZmIgKyBzZmJvZmZzXSA9IHNjYWxlVmFsdWUodG1wLCBpbnZPdmVyYWxsTG91ZG5lc3NTRik7CgogICAgICBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwoKICAgICAgRkRLX0FTU0VSVCg1MCA+PSA0OSk7CiAgICAgIC8qIG1heCB3aWR0aCBvZiBzY2FsZWZhY3RvcmJhbmQgaXMgOTY7IHdpZHRoJ3MgYXJlIGFsd2F5cyBldmVuICovCiAgICAgIC8qIGludl9uIGlzIHNjYWxlZCB3aXRoIGZhY3RvciAyIHRvIGNvbXBlbnNhdGUgZk11bHREaXYyKCkgaW4gc3Vic2VxdWVudCBsb29wcyAqLwogICAgICBpbnZfbiA9IEdldEludkludCgoc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXSAtIHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXSk+PjEpOwoKICAgICAgaWYgKGludl9uID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKICAgICAgICBJTlQgcyxzTCxzUjsKCiAgICAgICAgLyogY29ycmVsYXRpb24gOj0gUGVhcnNvbidzIHByb2R1Y3QtbW9tZW50IGNvZWZmaWNpZW50ICovCiAgICAgICAgLyogY29tcHV0ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGNoYW5uZWxzIGFuZCBjaGVjayBpZiBpdCBpcyBvdmVyIHRocmVzaG9sZCAqLwogICAgICAgIG1sICAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgbXIgICAgICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgICBwcm9kX2xyICA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgIHNxdWFyZV9sID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgc3F1YXJlX3IgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKCiAgICAgICAgc0wgPSBjYWxjU2ZiTWF4U2NhbGUobWRjdFNwZWN0cnVtTGVmdCxzZmJPZmZzZXRbc2ZiK3NmYm9mZnNdLHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXSk7CiAgICAgICAgc1IgPSBjYWxjU2ZiTWF4U2NhbGUobWRjdFNwZWN0cnVtUmlnaHQsc2ZiT2Zmc2V0W3NmYitzZmJvZmZzXSxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV0pOwogICAgICAgIHMgPSBmaXhNaW4oc0wsc1IpOwoKICAgICAgICBmb3IgKGogPSBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc107IGogPCBzZmJPZmZzZXRbc2ZiICsgc2Zib2ZmcyArIDFdOyBqKyspIHsKICAgICAgICAgIG1sICs9IGZNdWx0RGl2MigobWRjdFNwZWN0cnVtTGVmdFtqXSAgPDwgcyksaW52X24pOyAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCBtZGN0U2NhbGUgLSBzICsgaW52X24KICAgICAgICAgIG1yICs9IGZNdWx0RGl2MigobWRjdFNwZWN0cnVtUmlnaHRbal0gPDwgcyksaW52X24pOyAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCBtZGN0U2NhbGUgLSBzICsgaW52X24KICAgICAgICB9CiAgICAgICAgbWwgPSBmTXVsdERpdjIobWwsaW52X24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGVkIHdpdGggbWRjdFNjYWxlIC0gcyArIGludl9uCiAgICAgICAgbXIgPSBmTXVsdERpdjIobXIsaW52X24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGVkIHdpdGggbWRjdFNjYWxlIC0gcyArIGludl9uCgogICAgICAgIGZvciAoaiA9IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXTsgaiA8IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV07IGorKykgewogICAgICAgICAgdG1wX2wgPSBmTXVsdERpdjIoKG1kY3RTcGVjdHJ1bUxlZnRbal0gIDw8IHMpLGludl9uKSAtIG1sOyAgICAgIC8vIHNjYWxlZCB3aXRoIG1kY3RTY2FsZSAtIHMgKyBpbnZfbgogICAgICAgICAgdG1wX3IgPSBmTXVsdERpdjIoKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdIDw8IHMpLGludl9uKSAtIG1yOyAgICAgIC8vIHNjYWxlZCB3aXRoIG1kY3RTY2FsZSAtIHMgKyBpbnZfbgoKICAgICAgICAgIHByb2RfbHIgICs9IGZNdWx0RGl2Mih0bXBfbCx0bXBfcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCAyKihtZGN0U2NhbGUgLSBzICsgaW52X24pICsgMQogICAgICAgICAgc3F1YXJlX2wgKz0gZlBvdzJEaXYyKHRtcF9sKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlZCB3aXRoIDIqKG1kY3RTY2FsZSAtIHMgKyBpbnZfbikgKyAxCiAgICAgICAgICBzcXVhcmVfciArPSBmUG93MkRpdjIodG1wX3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGVkIHdpdGggMioobWRjdFNjYWxlIC0gcyArIGludl9uKSArIDEKICAgICAgICB9CiAgICAgICAgcHJvZF9sciAgPSBwcm9kX2xyICA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGVkIHdpdGggMioobWRjdFNjYWxlIC0gcyArIGludl9uKQogICAgICAgIHNxdWFyZV9sID0gc3F1YXJlX2wgPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlZCB3aXRoIDIqKG1kY3RTY2FsZSAtIHMgKyBpbnZfbikKICAgICAgICBzcXVhcmVfciA9IHNxdWFyZV9yIDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCAyKihtZGN0U2NhbGUgLSBzICsgaW52X24pCgogICAgICAgIGlmIChzcXVhcmVfbCA+IEZMMkZYQ09OU1RfREJMKDAuMGYpICYmIHNxdWFyZV9yID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKICAgICAgICAgIElOVCBjaGFubmVsQ29yclNGID0gMDsKCiAgICAgICAgICAvKiBsb2NhbCBzY2FsaW5nIG9mIHNxdWFyZV9sIGFuZCBzcXVhcmVfciBpcyBjb21wZW5zYXRlZCBhZnRlciBzcXJ0IGNhbGN1bGF0aW9uICovCiAgICAgICAgICBzTCAgPSBmaXhNYXgoMCwoQ250TGVhZGluZ1plcm9zKHNxdWFyZV9sKS0xKSk7CiAgICAgICAgICBzUiAgPSBmaXhNYXgoMCwoQ250TGVhZGluZ1plcm9zKHNxdWFyZV9yKS0xKSk7CiAgICAgICAgICBzICAgPSAoKHNMICsgc1IpPj4xKTw8MTsKICAgICAgICAgIHNMICA9IGZpeE1pbihzTCxzKTsKICAgICAgICAgIHNSICA9IHMtc0w7CiAgICAgICAgICB0bXAgPSBmTXVsdChzcXVhcmVfbDw8c0wsc3F1YXJlX3I8PHNSKTsKICAgICAgICAgIHRtcCA9IHNxcnRGaXhwKHRtcCk7CgogICAgICAgICAgRkRLX0FTU0VSVCh0bXAgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSk7CgogICAgICAgICAgLyogbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBoYXZlIHRoZSBzYW1lIHNjYWxpbmcgKi8KICAgICAgICAgIGlmIChwcm9kX2xyIDwgRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7CiAgICAgICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0gLShmRGl2Tm9ybSgtcHJvZF9scix0bXAsJmNoYW5uZWxDb3JyU0YpKTsKCiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPSAgKGZEaXZOb3JtKCBwcm9kX2xyLHRtcCwmY2hhbm5lbENvcnJTRikpOwogICAgICAgICAgfQogICAgICAgICAgY2hhbm5lbENvcnJTRiA9IGZpeE1pbihmaXhNYXgoKCBjaGFubmVsQ29yclNGICsgKChzTCtzUik+PjEpKSwtKERGUkFDVF9CSVRTLTEpKSxERlJBQ1RfQklUUy0xKTsKCiAgICAgICAgICBpZiAoY2hhbm5lbENvcnJTRiA8IDApIHsKICAgICAgICAgICAgY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPSBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA+PiAoLWNoYW5uZWxDb3JyU0YpOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qIGF2b2lkIG92ZXJmbG93cyBkdWUgdG8gbGltaXRlZCBjb21wdXRhdGlvbmFsIGFjY3VyYWN5ICovCiAgICAgICAgICAgIGlmICggZkFicyhjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSkgPiAoKChGSVhQX0RCTClNQVhWQUxfREJMKT4+Y2hhbm5lbENvcnJTRikgKSB7CiAgICAgICAgICAgICAgaWYgKGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdIDwgRkwyRlhDT05TVF9EQkwoMC4wZikpCiAgICAgICAgICAgICAgICBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA9IC0oRklYUF9EQkwpIE1BWFZBTF9EQkw7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPSAgKEZJWFBfREJMKSBNQVhWQUxfREJMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0gY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPDwgY2hhbm5lbENvcnJTRjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyogZm9yIHBvc3QgcHJvY2Vzc2luZzogaHJyRXJyIGlzIHRoZSBlcnJvciBpbiB0ZXJtcyBvZiAodG9vIGxpdHRsZSkgY29ycmVsYXRpb24KICAgICAgICogd2VpZ2h0ZWQgd2l0aCB0aGUgbG91ZG5lc3Mgb2YgdGhlIFNGQjsgU0ZCcyB3aXRoIHNtYWxsIGhyckVyciBjYW4gYmUgbWVyZ2VkICovCiAgICAgIGlmIChocnJFcnJbc2ZiICsgc2Zib2Zmc10gPT0gRkwyRlhDT05TVF9EQkwoMS4wLzguMCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgaHJyRXJyW3NmYiArIHNmYm9mZnNdID0gZk11bHREaXYyKChGTDJGWENPTlNUX0RCTCgwLjI1ZiktKGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdPj4yKSksbm9ybVNmYkxvdWRuZXNzW3NmYiArIHNmYm9mZnNdKTsKCiAgICAgIC8qIHNldCBJUyBtYXNrL3ZlY3RvciB0byAxLCBpZiBjb3JyZWxhdGlvbiBpcyBoaWdoIGVub3VnaCAqLwogICAgICBpZiAoZkFicyhjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSkgPj0gaXNQYXJhbXMtPmNvcnJfdGhyZXNoKSB7CiAgICAgICAgaXNNYXNrW3NmYiArIHNmYm9mZnNdID0gMTsKICAgICAgfQogICAgfQogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2ZpbmFsaXplSW50ZW5zaXR5RGVjaXNpb24KCiAgICBkZXNjcmlwdGlvbjogIEZpbmFsaXplcyBpbnRlbnNpdHkgZGVjaXNpb24KCiAgICBpbnB1dDogICAgICAgIGlzUGFyYW1zICAgICAgICAgIHNjYWxlOiBub25lCiAgICAgICAgICAgICAgICAgIGhyckVyciAgICAgICAgICAgIHNjYWxlOiBub25lCiAgICAgICAgICAgICAgICAgIHJlYWxJc1NjYWxlICAgICAgIHNjYWxlOiBMRF9EQVRBX1NISUZUICsgUkVBTF9TQ0FMRV9TRgogICAgICAgICAgICAgICAgICBub3JtU2ZiTG91ZG5lc3MgICBzY2FsZTogbm9uZQoKICAgIG91dHB1dDogICAgICAgaXNNYXNrICAgICAgICAgICAgc2NhbGU6IG5vbmUKCiAgICByZXR1cm5zOiAgICAgIG5vbmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApGREthYWNFbmNfZmluYWxpemVJbnRlbnNpdHlEZWNpc2lvbihjb25zdCBGSVhQX0RCTCAqaHJyRXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqaXNNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqcmVhbElzU2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpub3JtU2ZiTG91ZG5lc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVEVOU0lUWV9QQVJBTUVURVJTICppc1BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIHNmYkNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIHNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbWF4U2ZiUGVyR3JvdXApCnsKICBJTlQgc2ZiLHNmYm9mZnMsIGo7CiAgRklYUF9EQkwgaXNTY2FsZUxhc3QgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICBJTlQgaXNTdGFydFZhbHVlRm91bmQgPSAwOwoKICBmb3IgKHNmYm9mZnMgPSAwOyBzZmJvZmZzIDwgc2ZiQ250OyBzZmJvZmZzICs9IHNmYlBlckdyb3VwKSB7CiAgICBJTlQgc3RhcnRJc1NmYiA9IDA7CiAgICBJTlQgaW5Jc0Jsb2NrID0gMDsKICAgIElOVCBjdXJyZW50SXNTZmJDb3VudCA9IDA7CiAgICBGSVhQX0RCTCBvdmVyYWxsSHJyRXJyb3IgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgIEZJWFBfREJMIGlzUmVnaW9uTG91ZG5lc3MgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKCiAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICBpZiAoaXNNYXNrW3NmYm9mZnMgKyBzZmJdID09IDEpIHsKICAgICAgICBpZiAoY3VycmVudElzU2ZiQ291bnQgPT0gMCkgewogICAgICAgICAgc3RhcnRJc1NmYiA9IHNmYm9mZnMgKyBzZmI7CiAgICAgICAgfQogICAgICAgIGlmIChpc1N0YXJ0VmFsdWVGb3VuZD09MCkgewogICAgICAgICAgaXNTY2FsZUxhc3QgPSByZWFsSXNTY2FsZVtzZmJvZmZzICsgc2ZiXTsKICAgICAgICAgIGlzU3RhcnRWYWx1ZUZvdW5kID0gMTsKICAgICAgICB9CiAgICAgICAgaW5Jc0Jsb2NrID0gMTsKICAgICAgICBjdXJyZW50SXNTZmJDb3VudCsrOwogICAgICAgIG92ZXJhbGxIcnJFcnJvciAgKz0gaHJyRXJyW3NmYm9mZnMgKyBzZmJdID4+IChNQVhfU0ZCX1BFUl9HUk9VUF9TRi0zKTsKICAgICAgICBpc1JlZ2lvbkxvdWRuZXNzICs9IG5vcm1TZmJMb3VkbmVzc1tzZmJvZmZzICsgc2ZiXSA+PiBNQVhfU0ZCX1BFUl9HUk9VUF9TRjsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAvKiBiYXNlZCBvbiBjb3JyZWxhdGlvbiwgSVMgc2hvdWxkIG5vdCBiZSB1c2VkCiAgICAgICAgICogLT4gdXNlIGl0IGFueXdheSwgaWYgb3ZlcmFsbCBlcnJvciBpcyBiZWxvdyB0aHJlc2hvbGQKICAgICAgICAgKiAgICBhbmQgaWYgbG9jYWwgZXJyb3IgZG9lcyBub3QgZXhjZWVkIHRocmVzaG9sZAogICAgICAgICAqIG90aGVyd2lzZTogY2hlY2sgaWYgdGhlcmUgYXJlIGVub3VnaCBJUyBTRkJzCiAgICAgICAgICovCiAgICAgICAgaWYgKGluSXNCbG9jaykgewogICAgICAgICAgb3ZlcmFsbEhyckVycm9yICArPSBocnJFcnJbc2Zib2ZmcyArIHNmYl0gPj4gKE1BWF9TRkJfUEVSX0dST1VQX1NGLTMpOwogICAgICAgICAgaXNSZWdpb25Mb3VkbmVzcyArPSBub3JtU2ZiTG91ZG5lc3Nbc2Zib2ZmcyArIHNmYl0gPj4gTUFYX1NGQl9QRVJfR1JPVVBfU0Y7CgogICAgICAgICAgaWYgKCAoaHJyRXJyW3NmYm9mZnMgKyBzZmJdIDwgKGlzUGFyYW1zLT5sb2NhbF9lcnJvcl90aHJlc2g+PjMpKSAmJiAob3ZlcmFsbEhyckVycm9yIDwgKGlzUGFyYW1zLT50b3RhbF9lcnJvcl90aHJlc2g+Pk1BWF9TRkJfUEVSX0dST1VQX1NGKSkgKSB7CiAgICAgICAgICAgIGN1cnJlbnRJc1NmYkNvdW50Kys7CiAgICAgICAgICAgIC8qIG92ZXJ3cml0ZSBjb3JyZWxhdGlvbiBiYXNlZCBkZWNpc2lvbiAqLwogICAgICAgICAgICBpc01hc2tbc2Zib2ZmcyArIHNmYl0gPSAxOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW5Jc0Jsb2NrID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyogY2hlY2sgZm9yIGxhcmdlIGRpcmVjdGlvbiBkZXZpYXRpb24gKi8KICAgICAgaWYgKGluSXNCbG9jaykgewogICAgICAgIGlmKCBmQWJzKGlzU2NhbGVMYXN0LXJlYWxJc1NjYWxlW3NmYm9mZnMgKyBzZmJdKSA8IChpc1BhcmFtcy0+ZGlyZWN0aW9uX2RldmlhdGlvbl90aHJlc2g+PihSRUFMX1NDQUxFX1NGK0xEX0RBVEFfU0hJRlQtSVNfRElSRUNUSU9OX0RFVklBVElPTl9USFJFU0hfU0YpKSApIHsKICAgICAgICAgIGlzU2NhbGVMYXN0ID0gcmVhbElzU2NhbGVbc2Zib2ZmcyArIHNmYl07CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICBpc01hc2tbc2Zib2ZmcyArIHNmYl0gPSAwOwogICAgICAgICAgaW5Jc0Jsb2NrID0gMDsKICAgICAgICAgIGN1cnJlbnRJc1NmYkNvdW50LS07CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoY3VycmVudElzU2ZiQ291bnQgPiAwICYmICghaW5Jc0Jsb2NrIHx8IHNmYiA9PSBtYXhTZmJQZXJHcm91cCAtIDEpKSB7CiAgICAgICAgLyogbm90IGVub3VnaCBTRkJzIC0+IGRvIG5vdCB1c2UgSVMgKi8KICAgICAgICBpZiAoY3VycmVudElzU2ZiQ291bnQgPCBpc1BhcmFtcy0+bWluX2lzX3NmYnMgfHwgKGlzUmVnaW9uTG91ZG5lc3MgPCBpc1BhcmFtcy0+aXNfcmVnaW9uX21pbl9sb3VkbmVzcz4+TUFYX1NGQl9QRVJfR1JPVVBfU0YpKSB7CiAgICAgICAgICBmb3IoaiA9IHN0YXJ0SXNTZmI7IGogPD0gc2Zib2ZmcyArIHNmYjsgaisrKSB7CiAgICAgICAgICAgIGlzTWFza1tqXSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBpc1NjYWxlTGFzdCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgICAgaXNTdGFydFZhbHVlRm91bmQgPSAwOwogICAgICAgICAgZm9yIChqPTA7IGogPCBzdGFydElzU2ZiOyBqKyspIHsKICAgICAgICAgICAgaWYgKGlzTWFza1tqXSE9MCkgewogICAgICAgICAgICAgIGlzU2NhbGVMYXN0ID0gcmVhbElzU2NhbGVbal07CiAgICAgICAgICAgICAgaXNTdGFydFZhbHVlRm91bmQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGN1cnJlbnRJc1NmYkNvdW50ID0gMDsKICAgICAgICBvdmVyYWxsSHJyRXJyb3IgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgICBpc1JlZ2lvbkxvdWRuZXNzID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgIH0KICAgIH0KICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19JbnRlbnNpdHlTdGVyZW9Qcm9jZXNzaW5nCgogICAgZGVzY3JpcHRpb246ICBJbnRlbnNpdHkgc3RlcmVvIHByb2Nlc3NpbmcgdG9vbAoKICAgIGlucHV0OiAgICAgICAgc2ZiRW5lcmd5TGVmdAogICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lSaWdodAogICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0CiAgICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0CiAgICAgICAgICAgICAgICAgIHNmYlRocmVzaG9sZExlZnQKICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHQKICAgICAgICAgICAgICAgICAgc2ZiU3ByZWFkRW5MZWZ0CiAgICAgICAgICAgICAgICAgIHNmYlNwcmVhZEVuUmlnaHQKICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5TGREYXRhTGVmdAogICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lMZERhdGFSaWdodAoKICAgIG91dHB1dDogICAgICAgaXNCb29rCiAgICAgICAgICAgICAgICAgIGlzU2NhbGUKICAgICAgICAgICAgICAgICAgcG5zRGF0YS0+cG5zRmxhZwogICAgICAgICAgICAgICAgICBtc0RpZ2VzdCAgICAgICAgICAgICAgICAgemVyb2VkIGZyb20gc3RhcnQgdG8gc2ZiQ250CiAgICAgICAgICAgICAgICAgIG1zTWFzayAgICAgICAgICAgICAgICAgICB6ZXJvZWQgZnJvbSBzdGFydCB0byBzZmJDbnQKICAgICAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHQgICAgICAgIHplcm9lZCB3aGVyZSBpc0Jvb2shPTAKICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5UmlnaHQgICAgICAgICAgIHplcm9lZCB3aGVyZSBpc0Jvb2shPTAKICAgICAgICAgICAgICAgICAgc2ZiU3ByZWFkRW5SaWdodCAgICAgICB6ZXJvZWQgd2hlcmUgaXNCb29rIT0wCiAgICAgICAgICAgICAgICAgIHNmYlRocmVzaG9sZFJpZ2h0ICAgICAgICB6ZXJvZWQgd2hlcmUgaXNCb29rIT0wCiAgICAgICAgICAgICAgICAgIHNmYkVuZXJneUxkRGF0YVJpZ2h0ICAgICBGTDJGWENPTlNUX0RCTCgtMS4wKSB3aGVyZSBpc0Jvb2shPTAKICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkTGREYXRhUmlnaHQgIEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpIHdoZXJlIGlzQm9vayE9MAoKICAgIHJldHVybnM6ICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgRkRLYWFjRW5jX0ludGVuc2l0eVN0ZXJlb1Byb2Nlc3NpbmcoCiAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiRW5lcmd5TGVmdCwKICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJFbmVyZ3lSaWdodCwKICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICptZGN0U3BlY3RydW1MZWZ0LAogICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKm1kY3RTcGVjdHJ1bVJpZ2h0LAogICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYlRocmVzaG9sZExlZnQsCiAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiVGhyZXNob2xkUmlnaHQsCiAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiVGhyZXNob2xkTGREYXRhUmlnaHQsCiAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiU3ByZWFkRW5MZWZ0LAogICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYlNwcmVhZEVuUmlnaHQsCiAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiRW5lcmd5TGREYXRhTGVmdCwKICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJFbmVyZ3lMZERhdGFSaWdodCwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICptc0RpZ2VzdCwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICptc01hc2ssCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgc2ZiQ250LAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHNmYlBlckdyb3VwLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgKnNmYk9mZnNldCwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBhbGxvd0lTLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgKmlzQm9vaywKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICppc1NjYWxlLAogICAgICAgIFBOU19EQVRBICAgICAgICAgKlJFU1RSSUNUIHBuc0RhdGFbMl0KICAgICAgICApCnsKICBJTlQgc2ZiLHNmYm9mZnMsIGo7CiAgRklYUF9EQkwgc2NhbGU7CiAgRklYUF9EQkwgbHI7CiAgRklYUF9EQkwgaHJyRXJyW01BWF9HUk9VUEVEX1NGQl07CiAgRklYUF9EQkwgbm9ybVNmYkxvdWRuZXNzW01BWF9HUk9VUEVEX1NGQl07CiAgRklYUF9EQkwgcmVhbElzU2NhbGVbTUFYX0dST1VQRURfU0ZCXTsKICBJTlRFTlNJVFlfUEFSQU1FVEVSUyBpc1BhcmFtczsKICBJTlQgaXNNYXNrW01BWF9HUk9VUEVEX1NGQl07CgogIEZES21lbWNsZWFyKCh2b2lkKilpc0Jvb2ssc2ZiQ250KnNpemVvZihJTlQpKTsKICBGREttZW1jbGVhcigodm9pZCopaXNNYXNrLHNmYkNudCpzaXplb2YoSU5UKSk7CiAgRkRLbWVtY2xlYXIoKHZvaWQqKXJlYWxJc1NjYWxlLHNmYkNudCpzaXplb2YoRklYUF9EQkwpKTsKICBGREttZW1jbGVhcigodm9pZCopaXNTY2FsZSxzZmJDbnQqc2l6ZW9mKElOVCkpOwogIEZES21lbWNsZWFyKCh2b2lkKilocnJFcnIsc2ZiQ250KnNpemVvZihGSVhQX0RCTCkpOwoKICBpZiAoIWFsbG93SVMpCiAgICByZXR1cm47CgogIEZES2FhY0VuY19pbml0SXNQYXJhbXMoJmlzUGFyYW1zKTsKCiAgLyogY29tcHV0ZSAvIHNldCB0aGUgZm9sbG93aW5nIHZhbHVlcyBwZXIgU0ZCOgogICAqIC0gbGVmdC9yaWdodCByYXRpbyBiZXR3ZWVuIGNoYW5uZWxzCiAgICogLSBub3JtYWxpemVkIGxvdWRuZXNzCiAgICogICArIGxvdWRuZXNzID09IGF2ZXJhZ2Ugb2YgZW5lcmd5IGluIGNoYW5uZWxzIHRvIDAuMjUKICAgKiAgICsgbm9ybWFsaXphdGlvbjogZGl2aXNpb24gYnkgc3VtIG9mIGFsbCBTRkIgbG91ZG5lc3NlcwogICAqIC0gaXNNYXNrIChpcyBzZXQgdG8gMCBpZiBjaGFubmVscyBhcmUgdGhlIHNhbWUgb3Igb25lIGlzIDApCiAgICovCiAgIEZES2FhY0VuY19wcmVwYXJlSW50ZW5zaXR5RGVjaXNpb24oc2ZiRW5lcmd5TGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lMZERhdGFMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkVuZXJneUxkRGF0YVJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyckVyciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbElzU2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybVNmYkxvdWRuZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJQZXJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQpOwoKICBGREthYWNFbmNfZmluYWxpemVJbnRlbnNpdHlEZWNpc2lvbihocnJFcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxJc1NjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1TZmJMb3VkbmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwKTsKCiAgZm9yIChzZmI9MDsgc2ZiPHNmYkNudDsgc2ZiKz1zZmJQZXJHcm91cCkgewogICAgZm9yIChzZmJvZmZzPTA7IHNmYm9mZnM8bWF4U2ZiUGVyR3JvdXA7IHNmYm9mZnMrKykgewogICAgICBJTlQgc0wsIHNSOwogICAgICBGSVhQX0RCTCBpbnZfbjsKCiAgICAgIG1zTWFza1tzZmIrc2Zib2Zmc10gPSAwOwogICAgICBpZiAoaXNNYXNrW3NmYitzZmJvZmZzXSA9PSAwKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIGlmICggICAoc2ZiRW5lcmd5TGVmdFtzZmIrc2Zib2Zmc10gPCBzZmJUaHJlc2hvbGRMZWZ0W3NmYitzZmJvZmZzXSkKICAgICAgICAgICYmKGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMGYvMS41Ziksc2ZiRW5lcmd5UmlnaHRbc2ZiK3NmYm9mZnNdKSA+IHNmYlRocmVzaG9sZFJpZ2h0W3NmYitzZmJvZmZzXSkgKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgLyogTkVXOiBpZiB0aGVyZSBpcyBhIGJpZy1lbm91Z2ggSVMgcmVnaW9uLCBzd2l0Y2ggb2ZmIFBOUyAqLwogICAgICBpZiAocG5zRGF0YVswXSkgewogICAgICAgIGlmKHBuc0RhdGFbMF0tPnBuc0ZsYWdbc2ZiK3NmYm9mZnNdKSB7CiAgICAgICAgICBwbnNEYXRhWzBdLT5wbnNGbGFnW3NmYitzZmJvZmZzXSA9IDA7CiAgICAgICAgfQogICAgICAgIGlmKHBuc0RhdGFbMV0tPnBuc0ZsYWdbc2ZiK3NmYm9mZnNdKSB7CiAgICAgICAgICBwbnNEYXRhWzFdLT5wbnNGbGFnW3NmYitzZmJvZmZzXSA9IDA7CiAgICAgICAgfQogICAgICB9CgogICAgICBpbnZfbiA9IEdldEludkludCgoc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXSAtIHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXSk+PjEpOyAgLy8gc2NhbGVkIHdpdGggMiB0byBjb21wZW5zYXRlIGZNdWx0RGl2MigpIGluIHN1YnNlcXVlbnQgbG9vcAogICAgICBzTCA9IGNhbGNTZmJNYXhTY2FsZShtZGN0U3BlY3RydW1MZWZ0LHNmYk9mZnNldFtzZmIrc2Zib2Zmc10sc2ZiT2Zmc2V0W3NmYitzZmJvZmZzKzFdKTsKICAgICAgc1IgPSBjYWxjU2ZiTWF4U2NhbGUobWRjdFNwZWN0cnVtUmlnaHQsc2ZiT2Zmc2V0W3NmYitzZmJvZmZzXSxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV0pOwoKICAgICAgbHIgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgZm9yIChqPXNmYk9mZnNldFtzZmIrc2Zib2Zmc107IGo8c2ZiT2Zmc2V0W3NmYitzZmJvZmZzKzFdOyBqKyspCiAgICAgICAgbHIgKz0gZk11bHREaXYyKGZNdWx0RGl2MihtZGN0U3BlY3RydW1MZWZ0W2pdPDxzTCxtZGN0U3BlY3RydW1SaWdodFtqXTw8c1IpLGludl9uKTsKICAgICAgbHIgPSBscjw8MTsKCiAgICAgIGlmIChsciA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgICAgLyogVGhpcyBtZWFucyBPVVQgT0YgcGhhc2UgaW50ZW5zaXR5IHN0ZXJlbywgY2YuIHN0YW5kYXJkICovCiAgICAgICAgSU5UIHMwLCBzMSwgczI7CiAgICAgICAgRklYUF9EQkwgdG1wLCBkLCBlZCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwoKICAgICAgICBzMCA9IGZpeE1pbihzTCxzUik7CiAgICAgICAgZm9yIChqPXNmYk9mZnNldFtzZmIrc2Zib2Zmc107IGo8c2ZiT2Zmc2V0W3NmYitzZmJvZmZzKzFdOyBqKyspIHsKICAgICAgICAgIGQgPSAoKG1kY3RTcGVjdHJ1bUxlZnRbal08PHMwKT4+MSkgLSAoKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdPDxzMCk+PjEpOwogICAgICAgICAgZWQgKz0gZk11bHREaXYyKGQsZCk+PihNRENUX1NQRUNfU0YtMSk7CiAgICAgICAgfQogICAgICAgIG1zTWFza1tzZmIrc2Zib2Zmc10gPSAxOwogICAgICAgIHRtcCA9IGZEaXZOb3JtKHNmYkVuZXJneUxlZnRbc2ZiK3NmYm9mZnNdLGVkLCZzMSk7CiAgICAgICAgczIgPSAoczEpICsgKDIqczApIC0gMiAtIE1EQ1RfU1BFQ19TRjsKICAgICAgICBpZiAoczIgJiAxKSB7CiAgICAgICAgICB0bXAgPSB0bXA+PjE7CiAgICAgICAgICBzMiA9IHMyKzE7CiAgICAgICAgfQogICAgICAgIHMyID0gKHMyPj4xKSArIDE7ICAvLyArMSBjb21wZW5zYXRlIGZNdWx0RGl2MigpIGluIHN1YnNlcXVlbnQgbG9vcAogICAgICAgIHMyID0gZml4TWluKGZpeE1heChzMiwtKERGUkFDVF9CSVRTLTEpKSwoREZSQUNUX0JJVFMtMSkpOwogICAgICAgIHNjYWxlID0gc3FydEZpeHAodG1wKTsKICAgICAgICBpZiAoczIgPCAwKSB7CiAgICAgICAgICBzMiA9IC1zMjsKICAgICAgICAgIGZvciAoaj1zZmJPZmZzZXRbc2ZiK3NmYm9mZnNdOyBqPHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXTsgaisrKSB7CiAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSAoZk11bHREaXYyKG1kY3RTcGVjdHJ1bUxlZnRbal0sc2NhbGUpIC0gZk11bHREaXYyKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdLHNjYWxlKSkgPj4gczI7CiAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgZm9yIChqPXNmYk9mZnNldFtzZmIrc2Zib2Zmc107IGo8c2ZiT2Zmc2V0W3NmYitzZmJvZmZzKzFdOyBqKyspIHsKICAgICAgICAgICAgbWRjdFNwZWN0cnVtTGVmdFtqXSA9IChmTXVsdERpdjIobWRjdFNwZWN0cnVtTGVmdFtqXSxzY2FsZSkgLSBmTXVsdERpdjIobWRjdFNwZWN0cnVtUmlnaHRbal0sc2NhbGUpKSA8PCBzMjsKICAgICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHRbal0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgLyogVGhpcyBtZWFucyBJTiBwaGFzZSBpbnRlbnNpdHkgc3RlcmVvLCBjZi4gc3RhbmRhcmQgKi8KICAgICAgICBJTlQgczAsczEsczI7CiAgICAgICAgRklYUF9EQkwgdG1wLCBzLCBlcyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwoKICAgICAgICBzMCA9IGZpeE1pbihzTCxzUik7CiAgICAgICAgZm9yIChqPXNmYk9mZnNldFtzZmIrc2Zib2Zmc107IGo8c2ZiT2Zmc2V0W3NmYitzZmJvZmZzKzFdOyBqKyspIHsKICAgICAgICAgIHMgICA9ICgobWRjdFNwZWN0cnVtTGVmdFtqXTw8czApPj4xKSArICgobWRjdFNwZWN0cnVtUmlnaHRbal08PHMwKT4+MSk7CiAgICAgICAgICBlcyArPSBmTXVsdERpdjIocyxzKT4+KE1EQ1RfU1BFQ19TRi0xKTsgICAgIC8vIHNjYWxlZCAyKihtZGN0U2NhbGUgLSBzMCArIDEpICsgTURDVF9TUEVDX1NGCiAgICAgICAgfQogICAgICAgIG1zTWFza1tzZmIrc2Zib2Zmc10gPSAwOwogICAgICAgIHRtcCA9IGZEaXZOb3JtKHNmYkVuZXJneUxlZnRbc2ZiK3NmYm9mZnNdLGVzLCZzMSk7CiAgICAgICAgczIgPSAoczEpICsgKDIqczApIC0gMiAtIE1EQ1RfU1BFQ19TRjsKICAgICAgICBpZiAoczIgJiAxKSB7CiAgICAgICAgICB0bXAgPSB0bXA+PjE7CiAgICAgICAgICBzMiA9IHMyICsgMTsKICAgICAgICB9CiAgICAgICAgczIgPSAoczI+PjEpICsgMTsgLy8gKzEgY29tcGVuc2F0ZSBmTXVsdERpdjIoKSBpbiBzdWJzZXF1ZW50IGxvb3AKICAgICAgICBzMiA9IGZpeE1pbihmaXhNYXgoczIsLShERlJBQ1RfQklUUy0xKSksKERGUkFDVF9CSVRTLTEpKTsKICAgICAgICBzY2FsZSA9IHNxcnRGaXhwKHRtcCk7CiAgICAgICAgaWYgKHMyIDwgMCkgewogICAgICAgICAgczIgPSAtczI7CiAgICAgICAgICBmb3IgKGo9c2ZiT2Zmc2V0W3NmYitzZmJvZmZzXTsgajxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV07IGorKykgewogICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0W2pdID0gKGZNdWx0RGl2MihtZGN0U3BlY3RydW1MZWZ0W2pdLHNjYWxlKSArIGZNdWx0RGl2MihtZGN0U3BlY3RydW1SaWdodFtqXSxzY2FsZSkpID4+IHMyOwogICAgICAgICAgICBtZGN0U3BlY3RydW1SaWdodFtqXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGZvciAoaj1zZmJPZmZzZXRbc2ZiK3NmYm9mZnNdOyBqPHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXTsgaisrKSB7CiAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSAoZk11bHREaXYyKG1kY3RTcGVjdHJ1bUxlZnRbal0sc2NhbGUpICsgZk11bHREaXYyKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdLHNjYWxlKSkgPDwgczI7CiAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBpc0Jvb2tbc2ZiK3NmYm9mZnNdID0gQ09ERV9CT09LX0lTX0lOX1BIQVNFX05POwoKICAgICAgaWYgKCByZWFsSXNTY2FsZVtzZmIrc2Zib2Zmc10gPCBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKICAgICAgICBpc1NjYWxlW3NmYitzZmJvZmZzXSA9IChJTlQpKCgocmVhbElzU2NhbGVbc2ZiK3NmYm9mZnNdPj4xKS1GTDJGWENPTlNUX0RCTCgwLjVmLygxPDwoUkVBTF9TQ0FMRV9TRitMRF9EQVRBX1NISUZUKzEpKSkpPj4oREZSQUNUX0JJVFMtMS1SRUFMX1NDQUxFX1NGLUxEX0RBVEFfU0hJRlQtMSkpICsgMTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBpc1NjYWxlW3NmYitzZmJvZmZzXSA9IChJTlQpKCgocmVhbElzU2NhbGVbc2ZiK3NmYm9mZnNdPj4xKStGTDJGWENPTlNUX0RCTCgwLjVmLygxPDwoUkVBTF9TQ0FMRV9TRitMRF9EQVRBX1NISUZUKzEpKSkpPj4oREZSQUNUX0JJVFMtMS1SRUFMX1NDQUxFX1NGLUxEX0RBVEFfU0hJRlQtMSkpOwogICAgICB9CgogICAgICBzZmJFbmVyZ3lSaWdodFtzZmIrc2Zib2Zmc10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgc2ZiRW5lcmd5TGREYXRhUmlnaHRbc2ZiK3NmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOwogICAgICBzZmJUaHJlc2hvbGRSaWdodFtzZmIrc2Zib2Zmc10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgc2ZiVGhyZXNob2xkTGREYXRhUmlnaHRbc2ZiK3NmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoLTAuNTE1NjI1Zik7CiAgICAgIHNmYlNwcmVhZEVuUmlnaHRbc2ZiK3NmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CgogICAgICAqbXNEaWdlc3QgPSBNU19TT01FOwogICAgfQogIH0KfQoK