Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKToKICAgRGVzY3JpcHRpb246CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAidHBfZGF0YS5oIgoKI2luY2x1ZGUgInRwZW5jX2xpYi5oIgojaW5jbHVkZSAidHBlbmNfYXNjLmgiCiNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgoKI2RlZmluZSBQQ0VfTUFYX0VMRU1FTlRTIDgKCi8qKgogKiAgRGVzY3JpYmUgYSBQQ0UgYmFzZWQgb24gcGxhY2VkIGNoYW5uZWwgZWxlbWVudHMgYW5kIGVsZW1lbnQgdHlwZSBzZXF1ZW5jZS4KICovCnR5cGVkZWYgc3RydWN0IHsKCiAgICBVQ0hBUiAgICBudW1fZnJvbnRfY2hhbm5lbF9lbGVtZW50czsgICAgIC8qITwgTnVtYmVyIG9mIGZyb250IGNoYW5uZWwgZWxlbWVudHMuICovCiAgICBVQ0hBUiAgICBudW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzOyAgICAgIC8qITwgTnVtYmVyIG9mIHNpZGUgY2hhbm5lbCBlbGVtZW50cy4gKi8KICAgIFVDSEFSICAgIG51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHM7ICAgICAgLyohPCBOdW1iZXIgb2YgYmFjayBjaGFubmVsIGVsZW1lbnRzLiAqLwogICAgVUNIQVIgICAgbnVtX2xmZV9jaGFubmVsX2VsZW1lbnRzOyAgICAgICAvKiE8IE51bWJlciBvZiBsZmUgY2hhbm5lbCBlbGVtZW50cy4gKi8KICAgIE1QNF9FTEVNRU5UX0lEIGVsX2xpc3RbUENFX01BWF9FTEVNRU5UU107LyohPCBMaXN0IGNvbnRhaW5zIHNlcXVlbmNlIGRlc2NyaWJpbmcgdGhlIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcHJlc2VudCBjaGFubmVsIG1vZGUuIChNUEVHIG9yZGVyKSAqLwp9IFBDRV9DT05GSUdVUkFUSU9OOwoKCi8qKgogKiAgTWFwIGFuIGluY29taW5nIGNoYW5uZWwgbW9kZSB0byBhIGV4aXN0aW5nIFBDRSBjb25maWd1cmF0aW9uIGVudHJ5LgogKi8KdHlwZWRlZiBzdHJ1Y3QgewoKICAgIENIQU5ORUxfTU9ERSAgICAgICAgY2hhbm5lbF9tb2RlOyAgICAgICAgLyohPCBQcmVzZW50IGNoYW5uZWwgbW9kZS4gKi8KICAgIFBDRV9DT05GSUdVUkFUSU9OICAgcGNlX2NvbmZpZ3VyYXRpb247ICAgLyohPCBQcm9ncmFtIGNvbmZpZyBlbGVtZW50IGRlc2NyaXB0aW9uLiAqLwoKfSBDSEFOTkVMX0NPTkZJR1VSQVRJT047CgoKLyoqCiAqIFxicmllZiBUYWJsZSBjb250YWlucyBhbGwgc3VwcG9ydGVkIGNoYW5uZWwgbW9kZXMgYW5kIGFjY29yZGluZyBQQ0UgY29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbi4KICoKICogVGhlIG51bWJlciBvZiBjaGFubmVsIGVsZW1lbnQgcGFyYW1ldGVyIGRlc2NyaWJlcyB0aGUga2luZCBvZiBjb25zZWN1dGl2ZWx5IGVsZW1lbnRzLgogKiBFLmcuIE1PREVfMV8yXzJfMl8xIG1lYW5zOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBGaXJzdCAyIGVsZW1lbnRzIChTQ0UsQ1BFKSBhcmUgZnJvbnQgY2hhbm5lbCBlbGVtZW50cy4KICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gRm9sbG93aW5nIGVsZW1lbnQgKENQRSkgaXMgYSBzaWRlIGNoYW5uZWwgZWxlbWVudC4KICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gTmV4dCBlbGVtZW50IChDUEUpIGlzIGEgYmFjayBjaGFubmVsIGVsZW1lbnQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAtIExhc3QgZWxlbWVudCAoTEZFKSBpcyBhIGxmZSBjaGFubmVsIGVsZW1lbnQuCiAqLwpzdGF0aWMgY29uc3QgQ0hBTk5FTF9DT05GSUdVUkFUSU9OIHBjZUNvbmZpZ1RhYltdID0KewogIHsgTU9ERV8xLCAgICAgICAgICAgICAgICAgICAgICAgIHsgIDEsIDAsIDAsIDAsIHsgSURfU0NFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKICB7IE1PREVfMiwgICAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAwLCAwLCAwLCB7IElEX0NQRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCiAgeyBNT0RFXzFfMiwgICAgICAgICAgICAgICAgICAgICAgeyAgMiwgMCwgMCwgMCwgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAogIHsgTU9ERV8xXzJfMSwgICAgICAgICAgICAgICAgICAgIHsgIDIsIDAsIDEsIDAsIHsgSURfU0NFLCAgSURfQ1BFLCAgSURfU0NFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKICB7IE1PREVfMV8yXzIsICAgICAgICAgICAgICAgICAgICB7ICAyLCAwLCAxLCAwLCB7IElEX1NDRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCiAgeyBNT0RFXzFfMl8yXzEsICAgICAgICAgICAgICAgICAgeyAgMiwgMCwgMSwgMSwgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9DUEUsICBJRF9MRkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCiAgeyBNT0RFXzFfMl8yXzJfMSwgICAgICAgICAgICAgICAgeyAgMiwgMSwgMSwgMSwgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9DUEUsICBJRF9DUEUsICBJRF9MRkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCgogIHsgTU9ERV8xXzEsICAgICAgICAgICAgICAgICAgICAgIHsgIDIsIDAsIDAsIDAsIHsgSURfU0NFLCAgSURfU0NFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKICB7IE1PREVfMV8xXzFfMSwgICAgICAgICAgICAgICAgICB7ICAyLCAyLCAwLCAwLCB7IElEX1NDRSwgIElEX1NDRSwgIElEX1NDRSwgIElEX1NDRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCiAgeyBNT0RFXzFfMV8xXzFfMV8xLCAgICAgICAgICAgICAgeyAgMiwgMiwgMiwgMCwgeyBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAogIHsgTU9ERV8xXzFfMV8xXzFfMV8xXzEsICAgICAgICAgIHsgIDMsIDIsIDMsIDAsIHsgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFIH0gfSB9LAoKICB7IE1PREVfMl8yLCAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAwLCAxLCAwLCB7IElEX0NQRSwgIElEX0NQRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCiAgeyBNT0RFXzJfMl8yLCAgICAgICAgICAgICAgICAgICAgeyAgMSwgMSwgMSwgMCwgeyBJRF9DUEUsICBJRF9DUEUsICBJRF9DUEUsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAogIHsgTU9ERV8yXzJfMl8yLCAgICAgICAgICAgICAgICAgIHsgIDQsIDAsIDAsIDAsIHsgSURfQ1BFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKCiAgeyBNT0RFXzJfMSwgICAgICAgICAgICAgICAgICAgICAgeyAgMSwgMCwgMSwgMCwgeyBJRF9DUEUsICBJRF9TQ0UsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9Cn07CgoKLyoqCiAqIFxicmllZiAgR2V0IHByb2dyYW0gY29uZmlnIGVsZW1lbnQgZGVzY3JpcHRpb24gZm9yIGV4aXN0aW5nIGNoYW5uZWwgbW9kZS4KICoKICogXHBhcmFtIGNoYW5uZWxfbW9kZSAgICAgICAgICBDdXJyZW50IGNoYW5uZWwgbW9kZS4KICoKICogXHJldHVybgogKiAgICAgICAgICAtIFBvaW50ZXIgdG8gUENFX0NPTkZJR1VSQVRJT04gZW50cnksIG9uIHN1Y2Nlc3MuCiAqICAgICAgICAgIC0gTlVMTCwgb24gZmFpbHVyZS4KICovCnN0YXRpYyBjb25zdCBQQ0VfQ09ORklHVVJBVElPTiogZ2V0UGNlRW50cnkoCiAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFIGNoYW5uZWxfbW9kZQogICAgICAgICkKewogIFVJTlQgaTsKICBjb25zdCBQQ0VfQ09ORklHVVJBVElPTiAqcGNlX2NvbmZpZyA9IE5VTEw7CgogIGZvciAoaT0wOyBpIDwgKHNpemVvZihwY2VDb25maWdUYWIpL3NpemVvZihDSEFOTkVMX0NPTkZJR1VSQVRJT04pKTsgaSsrKSB7CiAgICBpZiAocGNlQ29uZmlnVGFiW2ldLmNoYW5uZWxfbW9kZSA9PSBjaGFubmVsX21vZGUpIHsKICAgICAgcGNlX2NvbmZpZyA9ICZwY2VDb25maWdUYWJbaV0ucGNlX2NvbmZpZ3VyYXRpb247CiAgICB9CiAgfQoKICByZXR1cm4gcGNlX2NvbmZpZzsKfQoKaW50IGdldENoYW5uZWxDb25maWcoIENIQU5ORUxfTU9ERSBjaGFubmVsX21vZGUgKQp7CiAgSU5UIGNoYW5fY29uZmlnID0gMDsKCiAgc3dpdGNoKGNoYW5uZWxfbW9kZSkgewogICAgY2FzZSBNT0RFXzE6ICAgICAgICAgY2hhbl9jb25maWcgPSAxOyBicmVhazsKICAgIGNhc2UgTU9ERV8yOiAgICAgICAgIGNoYW5fY29uZmlnID0gMjsgYnJlYWs7CiAgICBjYXNlIE1PREVfMV8yOiAgICAgICBjaGFuX2NvbmZpZyA9IDM7IGJyZWFrOwogICAgY2FzZSBNT0RFXzFfMl8xOiAgICAgY2hhbl9jb25maWcgPSA0OyBicmVhazsKICAgIGNhc2UgTU9ERV8xXzJfMjogICAgIGNoYW5fY29uZmlnID0gNTsgYnJlYWs7CiAgICBjYXNlIE1PREVfMV8yXzJfMTogICBjaGFuX2NvbmZpZyA9IDY7IGJyZWFrOwogICAgY2FzZSBNT0RFXzFfMl8yXzJfMTogY2hhbl9jb25maWcgPSA3OyBicmVhazsKCiAgICBkZWZhdWx0OiAgICAgICAgICAgICBjaGFuX2NvbmZpZyA9IDA7CiAgfQoKICByZXR1cm4gY2hhbl9jb25maWc7Cn0KCkNIQU5ORUxfTU9ERSB0cmFuc3BvcnRFbmNfR2V0Q2hhbm5lbE1vZGUoIGludCBub0NoYW5uZWxzICkKewogIENIQU5ORUxfTU9ERSBjaE1vZGU7CgogIGlmIChub0NoYW5uZWxzIDw9IDggJiYgbm9DaGFubmVscyA+IDApCiAgICBjaE1vZGUgPSAoQ0hBTk5FTF9NT0RFKSgobm9DaGFubmVscyA9PSA4KSA/IDcgOiBub0NoYW5uZWxzKTsgLyogc2VlIDogaXNvL21wZWc0IHYxIGF1ZGlvIHN1YnBhcnQxKi8KICBlbHNlCiAgICBjaE1vZGUgPSBNT0RFX1VOS05PV047CgogIHJldHVybiBjaE1vZGU7Cn0KCiNpZmRlZiBUUF9QQ0VfRU5BQkxFCmludCB0cmFuc3BvcnRFbmNfd3JpdGVQQ0UoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAogICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5zdGFuY2VUYWdQQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeE1peGRvd25BLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwc2V1ZG9TdXJyb3VuZEVuYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGFsaWduQW5jaG9yKQp7CiAgaW50IHNhbXBsZVJhdGVJbmRleCwgaTsKICBjb25zdCBQQ0VfQ09ORklHVVJBVElPTiogY29uZmlnID0gTlVMTDsKICBjb25zdCBNUDRfRUxFTUVOVF9JRCogcEVsX2xpc3QgPSBOVUxMOwogIFVDSEFSIGNwZUNudD0wLCBzY2VDbnQ9MCwgbGZlQ250PTA7CgogIHNhbXBsZVJhdGVJbmRleCA9IGdldFNhbXBsaW5nUmF0ZUluZGV4KHNhbXBsZVJhdGUpOwogIGlmIChzYW1wbGVSYXRlSW5kZXggPT0gMTUpIHsKICAgIHJldHVybiAtMTsKICB9CgogIGlmICgoY29uZmlnPWdldFBjZUVudHJ5KGNoYW5uZWxNb2RlKSk9PU5VTEwpIHsKICAgIHJldHVybiAtMTsKICB9CgogIC8qIFBvaW50ZXIgdG8gZmlyc3QgZWxlbWVudCBpbiBlbGVtZW50IGxpc3QuICovCiAgcEVsX2xpc3QgPSAmY29uZmlnLT5lbF9saXN0WzBdOwoKICBGREt3cml0ZUJpdHMoaEJzLCBpbnN0YW5jZVRhZ1BDRSwgIDQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgaW5zdGFuY2UgdGFnICovCiAgRkRLd3JpdGVCaXRzKGhCcywgcHJvZmlsZSwgICAgICAgICAyKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBPYmplY3QgdHlwZSAqLwogIEZES3dyaXRlQml0cyhoQnMsIHNhbXBsZVJhdGVJbmRleCwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgaW5kZXgqLwoKICBGREt3cml0ZUJpdHMoaEJzLCBjb25maWctPm51bV9mcm9udF9jaGFubmVsX2VsZW1lbnRzLCA0KTsgICAgIC8qIEZyb250IGNoYW5uZWwgRWxlbWVudHMgKi8KICBGREt3cml0ZUJpdHMoaEJzLCBjb25maWctPm51bV9zaWRlX2NoYW5uZWxfZWxlbWVudHMgLCA0KTsgICAgIC8qIE5vIFNpZGUgQ2hhbm5lbCBFbGVtZW50cyAqLwogIEZES3dyaXRlQml0cyhoQnMsIGNvbmZpZy0+bnVtX2JhY2tfY2hhbm5lbF9lbGVtZW50cyAsIDQpOyAgICAgLyogTm8gQmFjayBjaGFubmVsIEVsZW1lbnRzICovCiAgRkRLd3JpdGVCaXRzKGhCcywgY29uZmlnLT5udW1fbGZlX2NoYW5uZWxfZWxlbWVudHMgICwgMik7ICAgICAvKiBObyBMZmUgY2hhbm5lbCBlbGVtZW50cyAqLwoKICBGREt3cml0ZUJpdHMoaEJzLCAwLCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGFzc29jIGRhdGEgZWxlbWVudHMgKi8KICBGREt3cml0ZUJpdHMoaEJzLCAwLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHZhbGlkIGNjIGVsZW1lbnRzICovCiAgRkRLd3JpdGVCaXRzKGhCcywgMCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIG1peGRvd24gcHJlc2VudCAqLwogIEZES3dyaXRlQml0cyhoQnMsIDAsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RlcmVvIG1peGRvd24gcHJlc2VudCAqLwoKICBpZiAoIG1hdHJpeE1peGRvd25BIT0wICYmICgoY2hhbm5lbE1vZGU9PU1PREVfMV8yXzIpfHwoY2hhbm5lbE1vZGU9PU1PREVfMV8yXzJfMSkpICkgewogICAgICBGREt3cml0ZUJpdHMoaEJzLCAxLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF0cml4IG1peGRvd24gcHJlc2VudCAqLwogICAgICBGREt3cml0ZUJpdHMoaEJzLCAobWF0cml4TWl4ZG93bkEtMSkmMHgzLCAyKTsgICAgICAgICAgICAgLyogbWF0cml4X21peGRvd25faWR4ICovCiAgICAgIEZES3dyaXRlQml0cyhoQnMsIChwc2V1ZG9TdXJyb3VuZEVuYWJsZSk/MTowLCAxKTsgICAgICAgICAvKiBwc2V1ZG9fc3Vycm91bmRfZW5hYmxlICovCiAgfQogIGVsc2UgewogICAgICBGREt3cml0ZUJpdHMoaEJzLCAwLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF0cml4IG1peGRvd24gbm90IHByZXNlbnQgKi8KICB9CgogIGZvcihpPTA7IGk8Y29uZmlnLT5udW1fZnJvbnRfY2hhbm5lbF9lbGVtZW50czsgaSsrKSB7CiAgICAgIFVDSEFSIGlzQ3BlID0gKCpwRWxfbGlzdCsrPT1JRF9DUEUpID8gMSA6IDA7CiAgICAgIFVDSEFSIHRhZyAgID0gKGlzQ3BlKSA/IGNwZUNudCsrIDogc2NlQ250Kys7CiAgICAgIEZES3dyaXRlQml0cyhoQnMsIGlzQ3BlLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9udCBjaGFubmVsIEVsZW1lbnRzIGlzIENQRT8gKi8KICAgICAgRkRLd3JpdGVCaXRzKGhCcywgdGFnLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb250IGNoYW5uZWwgSW5zdGFuY2UgVGFnLiovCiAgfQogIGZvcihpPTA7IGk8Y29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzOyBpKyspIHsKICAgICAgVUNIQVIgaXNDcGUgPSAoKnBFbF9saXN0Kys9PUlEX0NQRSkgPyAxIDogMDsKICAgICAgVUNIQVIgdGFnICAgPSAoaXNDcGUpID8gY3BlQ250KysgOiBzY2VDbnQrKzsKICAgICAgRkRLd3JpdGVCaXRzKGhCcywgaXNDcGUsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb250IGNoYW5uZWwgRWxlbWVudHMgaXMgQ1BFPyAqLwogICAgICBGREt3cml0ZUJpdHMoaEJzLCB0YWcsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbnQgY2hhbm5lbCBJbnN0YW5jZSBUYWcuKi8KICB9CiAgZm9yKGk9MDsgaTxjb25maWctPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHM7IGkrKykgewogICAgICBVQ0hBUiBpc0NwZSA9ICgqcEVsX2xpc3QrKz09SURfQ1BFKSA/IDEgOiAwOwogICAgICBVQ0hBUiB0YWcgICA9IChpc0NwZSkgPyBjcGVDbnQrKyA6IHNjZUNudCsrOwogICAgICBGREt3cml0ZUJpdHMoaEJzLCBpc0NwZSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbnQgY2hhbm5lbCBFbGVtZW50cyBpcyBDUEU/ICovCiAgICAgIEZES3dyaXRlQml0cyhoQnMsIHRhZywgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9udCBjaGFubmVsIEluc3RhbmNlIFRhZy4qLwogIH0KICBmb3IoaT0wOyBpPGNvbmZpZy0+bnVtX2xmZV9jaGFubmVsX2VsZW1lbnRzOyBpKyspIHsKICAgICAgRkRLd3JpdGVCaXRzKGhCcywgbGZlQ250KyssIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExGRSBjaGFubmVsIEluc3RhbmNlIFRhZy4gKi8KICB9CgogIC8qIC0gbnVtX3ZhbGlkX2NjX2VsZW1lbnRzIGFsd2F5cyAwLgogICAgIC0gbnVtX2Fzc29jX2RhdGFfZWxlbWVudHMgYWx3YXlzIDAuICovCgogIC8qIEJ5dGUgYWxpZ25tZW50OiByZWxhdGl2ZSB0byBhbGlnbkFuY2hvcgogICAgICAgQURUUzogYWxpZ24gd2l0aCByZXNwZWN0IHRvIHRoZSBmaXJzdCBiaXQgb2YgdGhlIHJhd19kYXRhX2Jsb2NrKCkKICAgICAgIEFESUY6IGFsaWduIHdpdGggcmVzcGVjdCB0byB0aGUgZmlyc3QgYml0IG9mIHRoZSBoZWFkZXIKICAgICAgIExBVE06IGFsaWduIHdpdGggcmVzcGVjdCB0byB0aGUgZmlyc3QgYml0IG9mIHRoZSBBU0MgKi8KICBGREtieXRlQWxpZ24oaEJzLCBhbGlnbkFuY2hvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsaWdubWVudCAqLwoKICBGREt3cml0ZUJpdHMoaEJzLCAwICw4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvIG5vIHdyaXRlIGFueSBjb21tZW50LiAqLwoKICAvKiAtIGNvbW1lbnRfZmllbGRfYnl0ZXMgYWx3YXlzIDAuICovCgogIHJldHVybiAwOwp9CgppbnQgdHJhbnNwb3J0RW5jX0dldFBDRUJpdHMoQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeE1peGRvd25BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMpCnsKICBjb25zdCBQQ0VfQ09ORklHVVJBVElPTiogY29uZmlnID0gTlVMTDsKCiAgaWYgKChjb25maWc9Z2V0UGNlRW50cnkoY2hhbm5lbE1vZGUpKT09TlVMTCkgewogICAgcmV0dXJuIC0xOyAgLyogdW5zdXBwb3J0ZWQgY2hhbm5lbG1hcHBpbmcgKi8KICB9CgogIGJpdHMgKz0gNCArIDIgKyA0OyAgICAgICAgLyogRWxlbWVudCBpbnN0YW5jZSB0YWcgICsgT2JqZWN0IHR5cGUgKyBTYW1wbGUgcmF0ZSBpbmRleCAqLwogIGJpdHMgKz0gNCArIDQgKyA0ICsgMjsgICAgLyogTm8gKGZyb250ICsgc2lkZSArIGJhY2sgKyBsZmUgY2hhbm5lbCkgZWxlbWVudHMgKi8KICBiaXRzICs9IDMgKyA0OyAgICAgICAgICAgIC8qIE5vIChhc3NvYyBkYXRhICsgdmFsaWQgY2MpIGVsZW1lbnRzICovCiAgYml0cyArPSAxICsgMSArIDEgOyAgICAgICAvKiBNb25vICsgU3RlcmVvICsgTWF0cml4IG1peGRvd24gcHJlc2VudCAqLwoKICBpZiAoIG1hdHJpeE1peGRvd25BIT0wICYmICgoY2hhbm5lbE1vZGU9PU1PREVfMV8yXzIpfHwoY2hhbm5lbE1vZGU9PU1PREVfMV8yXzJfMSkpICkgewogICAgYml0cyArPTM7ICAgICAgICAgICAgICAgLyogbWF0cml4X21peGRvd25faWR4ICsgcHNldWRvX3N1cnJvdW5kX2VuYWJsZSAqLwogIH0KCiAgYml0cyArPSAoMSs0KSAqIChJTlQpY29uZmlnLT5udW1fZnJvbnRfY2hhbm5lbF9lbGVtZW50czsKICBiaXRzICs9ICgxKzQpICogKElOVCljb25maWctPm51bV9zaWRlX2NoYW5uZWxfZWxlbWVudHM7CiAgYml0cyArPSAoMSs0KSAqIChJTlQpY29uZmlnLT5udW1fYmFja19jaGFubmVsX2VsZW1lbnRzOwogIGJpdHMgKz0gICAoNCkgKiAoSU5UKWNvbmZpZy0+bnVtX2xmZV9jaGFubmVsX2VsZW1lbnRzOwoKICAvKiAtIG51bV92YWxpZF9jY19lbGVtZW50cyBhbHdheXMgMC4KICAgICAtIG51bV9hc3NvY19kYXRhX2VsZW1lbnRzIGFsd2F5cyAwLiAqLwoKICBpZiAoKGJpdHMlOCkgIT0gMCkgewogICAgYml0cyArPSAoOCAtIChiaXRzJTgpKTsgLyogQWxpZ25tZW50ICovCiAgfQoKICBiaXRzICs9IDg7ICAgICAgICAgICAgICAgIC8qIENvbW1lbnQgZmllbGQgIGJ5dGVzICovCgogIC8qIC0gY29tbWVudF9maWVsZF9ieXRlcyBhbHd5cyAwLiAqLwoKICByZXR1cm4gYml0czsKfQojZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLwoKc3RhdGljIHZvaWQgd3JpdGVBb3QoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbUJ1ZmZlciwgQVVESU9fT0JKRUNUX1RZUEUgYW90KQp7CiAgICBpbnQgdG1wID0gKGludCkgYW90OwoKICAgIGlmICh0bXAgPiAzMSkgewogICAgICAgIEZES3dyaXRlQml0cyggaEJpdHN0cmVhbUJ1ZmZlciwgQU9UX0VTQ0FQRSwgNSApOwogICAgICAgIEZES3dyaXRlQml0cyggaEJpdHN0cmVhbUJ1ZmZlciwgdG1wLTMyLCA2ICk7ICAgLyogQXVkaW9PYmplY3RUeXBlICovCiAgICB9IGVsc2UgewogICAgICAgIEZES3dyaXRlQml0cyggaEJpdHN0cmVhbUJ1ZmZlciwgdG1wLCA1ICk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHdyaXRlU2FtcGxlUmF0ZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtQnVmZmVyLCBpbnQgc2FtcGxlUmF0ZSkKewogIGludCBzYW1wbGVSYXRlSW5kZXggPSBnZXRTYW1wbGluZ1JhdGVJbmRleChzYW1wbGVSYXRlKTsKCiAgRkRLd3JpdGVCaXRzKCBoQml0c3RyZWFtQnVmZmVyLCBzYW1wbGVSYXRlSW5kZXgsIDQgKTsKICBpZiggc2FtcGxlUmF0ZUluZGV4ID09IDE1ICkgewogICAgRkRLd3JpdGVCaXRzKCBoQml0c3RyZWFtQnVmZmVyLCBzYW1wbGVSYXRlLCAyNCApOwogIH0KfQoKI2lmZGVmIFRQX0dBX0VOQUJMRQpzdGF0aWMKaW50IHRyYW5zcG9ydEVuY193cml0ZUdBU3BlY2lmaWNDb25maWcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBhc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBleHRGbGcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgYWxpZ25BbmNob3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgaW50IGFvdCA9IGNvbmZpZy0+YW90OwogIGludCBzYW1wbGVzUGVyRnJhbWUgPSBjb25maWctPnNhbXBsZXNQZXJGcmFtZTsKCiAgLyogc3RhcnQgb2YgR0FTcGVjaWZpY0NvbmZpZyBhY2NvcmRpbmcgdG8gSVNPL0lFQyAxNDQ5Ni0zIFN1YnBhcnQgNCwgNC40LjEgKi8KICBGREt3cml0ZUJpdHMoIGFzYywgKChzYW1wbGVzUGVyRnJhbWU9PTk2MCB8fCBzYW1wbGVzUGVyRnJhbWU9PTQ4MCk/MTowKSwgMSk7ICAvKiBmcmFtZUxlbmd0aEZsYWc6IDEgZm9yIGEgOTYwLzQ4MCAoSSlNRENULCAwIGZvciBhIDEwMjQvNTEyIChJKU1EQ1QqLwogIEZES3dyaXRlQml0cyggYXNjLCAwLCAxKTsgIC8qIGRlcGVuZHNPbkNvcmVDb2RlcjogU2FtcGxpbmcgUmF0ZSBDb2RlciBTcGVjaWZpYywgc2VlIGluIElTTy9JRUMgMTQ0OTYtMyBTdWJwYXJ0IDQsIDQuNC4xICovCiAgRkRLd3JpdGVCaXRzKCBhc2MsIGV4dEZsZywgMSApOyAvKiBFeHRlbnNpb24gRmxhZzogU2hhbGwgYmUgMSBmb3IgYW90ID0gMTcsMTksMjAsMjEsMjIsMjMgKi8KCiAgLyogV3JpdGUgUENFIGlmIGNoYW5uZWwgY29uZmlnIGlzIG5vdCAxLTcgKi8KICBpZiAoZ2V0Q2hhbm5lbENvbmZpZyhjb25maWctPmNoYW5uZWxNb2RlKSA9PSAwKSB7CiAgICAgIHRyYW5zcG9ydEVuY193cml0ZVBDRShhc2MsIGNvbmZpZy0+Y2hhbm5lbE1vZGUsIGNvbmZpZy0+c2FtcGxpbmdSYXRlLCAwLCAxLCBjb25maWctPm1hdHJpeE1peGRvd25BLCAoY29uZmlnLT5mbGFncyZDQ19QU0VVRE9fU1VSUk9VTkQpPzE6MCwgYWxpZ25BbmNob3IpOwogIH0KICBpZiAoZXh0RmxnKSB7CiAgICBpZiAoYW90ID09IEFPVF9FUl9CU0FDKSB7CiAgICAgIEZES3dyaXRlQml0cyggYXNjLCBjb25maWctPkJTQUNudW1PZlN1YkZyYW1lLCA1ICk7IC8qIG51bU9mU3ViRnJhbWUgKi8KICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIGNvbmZpZy0+QlNBQ2xheWVyTGVuZ3RoLCAxMSApOyAgLyogbGF5ZXJfbGVuZ3RoICovCiAgICB9CiAgICBpZiAoKGFvdCA9PSBBT1RfRVJfQUFDX0xDKSAgIHx8IChhb3QgPT0gQU9UX0VSX0FBQ19MVFApICB8fAogICAgICAgIChhb3QgPT0gQU9UX0VSX0FBQ19TQ0FMKSB8fCAoYW90ID09IEFPVF9FUl9BQUNfTEQpKQogICAgewogICAgICBGREt3cml0ZUJpdHMoIGFzYywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19WQ0IxMSkgPyAxIDogMCwgMSApOyAvKiBhYWNTZWN0aW9uRGF0YVJlc2lsbGllbmNlRmxhZyAqLwogICAgICBGREt3cml0ZUJpdHMoIGFzYywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19SVkxDKSA/IDEgOiAwLCAgMSApOyAvKiBhYWNTY2FsZUZhY3RvckRhdGFSZXNpbGxpZW5jZUZsYWcgKi8KICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIChjb25maWctPmZsYWdzICYgQ0NfSENSKSA/IDEgOiAwLCAgIDEgKTsgLyogYWFjU3BlY3RyYWxEYXRhUmVzaWxsaWVuY2VGbGFnICovCiAgICB9CiAgICBGREt3cml0ZUJpdHMoIGFzYywgMCwgMSApOyAvKiBleHRlbnNpb25GbGFnMzogcmVzZXJ2ZWQuIFNoYWxsIGJlICcwJyAqLwogIH0KICByZXR1cm4gMDsKfQojZW5kaWYgLyogVFBfR0FfRU5BQkxFICovCgojaWZkZWYgVFBfRUxEX0VOQUJMRQoKc3RhdGljCmludCB0cmFuc3BvcnRFbmNfd3JpdGVFTERTcGVjaWZpY0NvbmZpZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERVJfQ09ORklHICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBlcENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgLyogRUxEIHNwZWNpZmljIGNvbmZpZyAqLwogIGlmIChjb25maWctPmNoYW5uZWxNb2RlID09IE1PREVfMV8xKSB7CiAgICByZXR1cm4gLTE7CiAgfQogIEZES3dyaXRlQml0cyhoQnMsIChjb25maWctPnNhbXBsZXNQZXJGcmFtZSA9PSA0ODApID8gMSA6IDAsIDEpOwoKICBGREt3cml0ZUJpdHMoaEJzLCAoY29uZmlnLT5mbGFncyAmIENDX1ZDQjExICkgPyAxOjAsIDEpOwogIEZES3dyaXRlQml0cyhoQnMsIChjb25maWctPmZsYWdzICYgQ0NfUlZMQyApID8gMTowLCAxKTsKICBGREt3cml0ZUJpdHMoaEJzLCAoY29uZmlnLT5mbGFncyAmIENDX0hDUiAgKSA/IDE6MCwgMSk7CgogIEZES3dyaXRlQml0cyhoQnMsIChjb25maWctPmZsYWdzICYgQ0NfU0JSKSA/IDE6MCwgMSk7IC8qIFNCUiBoZWFkZXIgZmxhZyAqLwogIGlmICggKGNvbmZpZy0+ZmxhZ3MgJiBDQ19TQlIpICkgewogICAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+c2FtcGxpbmdSYXRlID09IGNvbmZpZy0+ZXh0U2FtcGxpbmdSYXRlKSA/IDA6MSwgMSk7IC8qIFNhbXBsZXJhdGUgRmxhZyAqLwogICAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19TQlJDUkMpID8gMTowLCAxKTsgLyogU0JSIENSQyBmbGFnKi8KCiAgICBpZiAoY2ItPmNiU2JyICE9IE5VTEwpIHsKICAgICAgY29uc3QgUENFX0NPTkZJR1VSQVRJT04gKnBQY2U7CiAgICAgIGludCBlOwoKICAgICAgcFBjZSA9IGdldFBjZUVudHJ5KGNvbmZpZy0+Y2hhbm5lbE1vZGUpOwoKICAgICAgZm9yIChlPTA7IGU8UENFX01BWF9FTEVNRU5UUyAmJiBwUGNlLT5lbF9saXN0W2VdICE9IElEX05PTkU7IGUrKyAgKSB7CiAgICAgICAgaWYgKCAocFBjZS0+ZWxfbGlzdFtlXSA9PSBJRF9TQ0UpIHx8IChwUGNlLT5lbF9saXN0W2VdID09IElEX0NQRSkgKSB7CiAgICAgICAgICBjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCAwLCAwLCAwLCBjb25maWctPmFvdCwgcFBjZS0+ZWxfbGlzdFtlXSwgZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBGREt3cml0ZUJpdHMoaEJzLCAwLCA0KTsgLyogRUxERVhUX1RFUk0gKi8KCiAgcmV0dXJuIDA7Cn0KI2VuZGlmIC8qIFRQX0VMRF9FTkFCTEUgKi8KCgppbnQgdHJhbnNwb3J0RW5jX3dyaXRlQVNDICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGFzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVSX0NPTkZJRyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IKICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgVUlOVCBleHRGbGFnID0gMDsKICBpbnQgZXJyOwogIGludCBlcENvbmZpZyA9IDA7CgogIC8qIFJlcXVpcmVkIGZvciB0aGUgUENFLiAqLwogIFVJTlQgYWxpZ25BbmNob3IgPSBGREtnZXRWYWxpZEJpdHMoYXNjKTsKCiAgLyogRXh0ZW5zaW9uIEZsYWc6IFNoYWxsIGJlIDEgZm9yIGFvdCA9IDE3LDE5LDIwLDIxLDIyLDIzLDM5ICovCiAgc3dpdGNoIChjb25maWctPmFvdCkgewogICAgY2FzZSBBT1RfRVJfQUFDX0xDOgogICAgY2FzZSBBT1RfRVJfQUFDX0xUUDoKICAgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgogICAgY2FzZSBBT1RfRVJfVFdJTl9WUToKICAgIGNhc2UgQU9UX0VSX0JTQUM6CiAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CiAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgogICAgY2FzZSBBT1RfVVNBQzoKICAgICAgICBleHRGbGFnID0gMTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgfQoKICBpZiAoY29uZmlnLT5zYnJTaWduYWxpbmc9PVNJR19FWFBMSUNJVF9ISUVSQVJDSElDQUwgJiYgY29uZmlnLT5zYnJQcmVzZW50KQogICAgd3JpdGVBb3QoYXNjLCBjb25maWctPmV4dEFPVCk7CiAgZWxzZQogICAgd3JpdGVBb3QoYXNjLCBjb25maWctPmFvdCk7CgogIHsKICAgIHdyaXRlU2FtcGxlUmF0ZShhc2MsIGNvbmZpZy0+c2FtcGxpbmdSYXRlKTsKICB9CgogIC8qIFRyeSB0byBndWVzcyBhIHJlYXNvbmFibGUgY2hhbm5lbCBtb2RlIGlmIG5vdCBnaXZlbiAqLwogIGlmIChjb25maWctPmNoYW5uZWxNb2RlID09IE1PREVfSU5WQUxJRCkgewogICAgY29uZmlnLT5jaGFubmVsTW9kZSA9IHRyYW5zcG9ydEVuY19HZXRDaGFubmVsTW9kZShjb25maWctPm5vQ2hhbm5lbHMpOwogICAgaWYgKGNvbmZpZy0+Y2hhbm5lbE1vZGUgPT0gTU9ERV9JTlZBTElEKQogICAgICByZXR1cm4gLTE7CiAgfQoKICBGREt3cml0ZUJpdHMoIGFzYywgZ2V0Q2hhbm5lbENvbmZpZyhjb25maWctPmNoYW5uZWxNb2RlKSwgNCApOwoKICBpZiAoY29uZmlnLT5zYnJTaWduYWxpbmc9PVNJR19FWFBMSUNJVF9ISUVSQVJDSElDQUwgJiYgY29uZmlnLT5zYnJQcmVzZW50KSB7CiAgICB3cml0ZVNhbXBsZVJhdGUoYXNjLCBjb25maWctPmV4dFNhbXBsaW5nUmF0ZSk7CiAgICB3cml0ZUFvdChhc2MsIGNvbmZpZy0+YW90KTsKICB9CgogIHN3aXRjaCAoY29uZmlnLT5hb3QpIHsKI2lmZGVmIFRQX0dBX0VOQUJMRQogICAgY2FzZSBBT1RfQUFDX01BSU46CiAgICBjYXNlIEFPVF9BQUNfTEM6CiAgICBjYXNlIEFPVF9BQUNfU1NSOgogICAgY2FzZSBBT1RfQUFDX0xUUDoKICAgIGNhc2UgQU9UX0FBQ19TQ0FMOgogICAgY2FzZSBBT1RfVFdJTl9WUToKICAgIGNhc2UgQU9UX0VSX0FBQ19MQzoKICAgIGNhc2UgQU9UX0VSX0FBQ19MVFA6CiAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKICAgIGNhc2UgQU9UX0VSX1RXSU5fVlE6CiAgICBjYXNlIEFPVF9FUl9CU0FDOgogICAgY2FzZSBBT1RfRVJfQUFDX0xEOgogICAgICBlcnIgPSB0cmFuc3BvcnRFbmNfd3JpdGVHQVNwZWNpZmljQ29uZmlnKGFzYywgY29uZmlnLCBleHRGbGFnLCBhbGlnbkFuY2hvcik7CiAgICAgIGlmIChlcnIpCiAgICAgICAgcmV0dXJuIGVycjsKICAgICAgYnJlYWs7CiNlbmRpZiAvKiBUUF9HQV9FTkFCTEUgKi8KI2lmZGVmIFRQX0VMRF9FTkFCTEUKICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CiAgICAgIGVyciA9IHRyYW5zcG9ydEVuY193cml0ZUVMRFNwZWNpZmljQ29uZmlnKGFzYywgY29uZmlnLCBlcENvbmZpZywgY2IpOwogICAgICBpZiAoZXJyKQogICAgICAgIHJldHVybiBlcnI7CiAgICAgIGJyZWFrOwojZW5kaWYgLyogVFBfRUxEX0VOQUJMRSAqLwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIC0xOwogIH0KCiAgc3dpdGNoIChjb25maWctPmFvdCkgewogICAgY2FzZSBBT1RfRVJfQUFDX0xDOgogICAgY2FzZSBBT1RfRVJfQUFDX0xUUDoKICAgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgogICAgY2FzZSBBT1RfRVJfVFdJTl9WUToKICAgIGNhc2UgQU9UX0VSX0JTQUM6CiAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CiAgICBjYXNlIEFPVF9FUl9DRUxQOgogICAgY2FzZSBBT1RfRVJfSFZYQzoKICAgIGNhc2UgQU9UX0VSX0hJTE46CiAgICBjYXNlIEFPVF9FUl9QQVJBOgogICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIDAsIDIgKTsgLyogZXBjb25maWcgMCAqLwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGJyZWFrOwogIH0KCiAgLyogYmFja3dhcmQgY29tcGF0aWJsZSBleHBsaWNpdCBzaWduYWxpbmcgb2YgZXh0ZW5zaW9uIEFPVCAqLwogIGlmIChjb25maWctPnNiclNpZ25hbGluZz09U0lHX0VYUExJQ0lUX0JXX0NPTVBBVElCTEUpCiAgewogICAgVFBfQVNDX0VYVEVOU0lPTl9JRCBhc2NFeHRJZCA9IEFTQ0VYVF9VTktPV047CgogICAgaWYgKGNvbmZpZy0+c2JyUHJlc2VudCkgewogICAgICBhc2NFeHRJZD1BU0NFWFRfU0JSOwogICAgICBGREt3cml0ZUJpdHMoIGFzYywgYXNjRXh0SWQsIDExICk7CiAgICAgIHdyaXRlQW90KGFzYywgY29uZmlnLT5leHRBT1QpOwogICAgICBGREt3cml0ZUJpdHMoIGFzYywgMSwgMSApOyAvKiBzYnJQcmVzZW50RmxhZz0xICovCiAgICAgIHdyaXRlU2FtcGxlUmF0ZShhc2MsIGNvbmZpZy0+ZXh0U2FtcGxpbmdSYXRlKTsKICAgICAgaWYgKGNvbmZpZy0+cHNQcmVzZW50KSB7CiAgICAgICAgYXNjRXh0SWQ9QVNDRVhUX1BTOwogICAgICAgIEZES3dyaXRlQml0cyggYXNjLCBhc2NFeHRJZCwgMTEgKTsKICAgICAgICBGREt3cml0ZUJpdHMoIGFzYywgMSwgMSApOyAvKiBwc1ByZXNlbnRGbGFnPTEgKi8KICAgICAgfQogICAgfQoKICB9CgogIC8qIE1ha2Ugc3VyZSBhbGwgYml0cyBhcmUgc3luYydlZCAqLwogIEZES3N5bmNDYWNoZSggYXNjICk7CgogIHJldHVybiAwOwp9Cg==