Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEyIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqICBGREsgUENNIHVwL2Rvd25taXhpbmcgbW9kdWxlICAqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR3JpZWJlbAogICBEZXNjcmlwdGlvbjogRGVjbGFyZXMgZnVuY3Rpb25zIHRvIGludGVyZmFjZSB3aXRoIHRoZSBQQ00gZG93bm1peCBwcm9jZXNzaW5nCiAgICAgICAgICAgICAgICBtb2R1bGUuCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBfUENNVVRJTFNfTElCX0hfCiNkZWZpbmUgX1BDTVVUSUxTX0xJQl9IXwoKI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgojaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgojaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgogKiAgICAgTU9EVUxFIFNFVFRJTkdTOiAgICAgKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogI2RlZmluZSBQQ01fVVBNSVhfRU5BQkxFICovICAgICAgIC8qITwgR2VuZXJhbGx5IGVuYWJsZSB1cCBtaXhpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBQQ01fRE9XTk1JWF9FTkFCTEUgICAgICAgICAgIC8qITwgR2VuZXJhbGx5IGVuYWJsZSBkb3duIG1peGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBEVkJfTUlYRE9XTl9FTkFCTEUgICAgICAgICAgIC8qITwgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCBEVkIgYW5jaWxsYXJ5IGRhdGEgZm9yIGVuY29kZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaXN0ZWQgZG93bm1peGluZyBvZiBNUEVHLTQgQUFDIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHLTEvMiBsYXllciAyIHN0cmVhbXMuIFBDTV9ET1dOTUlYX0VOQUJMRSBoYXMgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZW5hYmxlZCwgdG9vISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBNUEVHX1BDRV9NSVhET1dOX0VOQUJMRSAgICAgIC8qITwgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCBNUEVHIG1hdHJpeCBtaXhkb3duIHdpdGggYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZmljaWVudCBjYXJyaWVkIGluIHRoZSBQQ0UuIFBDTV9ET1dOTUlYX0VOQUJMRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgdG8gYmUgZW5hYmxlZCwgdG9vISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAjZGVmaW5lIEFSSUJfTUlYRE9XTl9FTkFCTEUgKi8gICAgLyohPCBFbmFibGUgbW9kaWZpY2F0aW9ucyB0byB0aGUgTVBFRyBQQ0UgbWl4ZG93biBtZXRob2QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZnVsZmlsbCBBUklCIHN0YW5kYXJkLiBNUEVHX1BDRV9NSVhET1dOX0VOQUJMRSBoYXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCiAqICAgICBFUlJPUiBDT0RFUzogICAgICAgICAqCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwp0eXBlZGVmIGVudW0KewogIFBDTURNWF9PSyAgICAgICAgICAgICAgPSAweDAsICAgIC8qITwgTm8gZXJyb3IgaGFwcGVuZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgUENNRE1YX09VVF9PRl9NRU1PUlkgICA9IDB4MiwgICAgLyohPCBOb3QgZW5vdWdoIG1lbW9yeSB0byBzZXQgdXAgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZS4gKi8KICBQQ01ETVhfVU5LTk9XTiAgICAgICAgID0gMHg1LCAgICAvKiE8IEVycm9yIGNvbmRpdGlvbiBpcyBvZiB1bmtub3duIHJlYXNvbiwgb3IgZnJvbSBhIHRoaXJkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnR5IG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBQQ01ETVhfSU5WQUxJRF9IQU5ETEUsICAgICAgICAgICAvKiE8IFRoZSBnaXZlbiBpbnN0YW5jZSBoYW5kbGUgaXMgbm90IHZhbGlkLiAgICAgICAgICAgICAgICAqLwogIFBDTURNWF9JTlZBTElEX0FSR1VNRU5ULCAgICAgICAgIC8qITwgT25lIG9mIHRoZSBwYXJhbWV0ZXJzIGhhbmRlZCBvdmVyIGlzIGludmFsaWQuICAgICAgICAgICovCiAgUENNRE1YX0lOVkFMSURfQ0hfQ09ORklHLCAgICAgICAgLyohPCBUaGUgZ2l2ZW4gY2hhbm5lbCBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodXMgbm8gcHJvY2Vzc2luZyB3YXMgcGVyZm9ybWVkLiAgICAgICAgICAgICAgICAgICAgKi8KICBQQ01ETVhfSU5WQUxJRF9NT0RFLCAgICAgICAgICAgICAvKiE8IFRoZSBzZXQgY29uZmlndXJhdGlvbi9tb2RlIGlzIG5vdCBhcHBsaWNhYmxlLiAgICAgICAgICAqLwogIFBDTURNWF9VTktOT1dOX1BBUkFNLCAgICAgICAgICAgIC8qITwgVGhlIGhhbmRlZCBwYXJhbWV0ZXIgaXMgbm90IGtub3duL3N1cHBvcnRlZC4gICAgICAgICAgICovCiAgUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0sICAgICAgLyohPCBVbmFibGUgdG8gc2V0IHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXIuIE1vc3QgcHJvYmFibHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIGlzdCBvdXQgb2YgcmFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBICAgICAgICAgIC8qITwgVGhlIHJlYWQgYW5jaWxsYXJ5IGRhdGEgd2FzIGNvcnJ1cHQuICAgICAgICAgICAgICAgICAgICovCgp9IFBDTURNWF9FUlJPUjsKCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgogKiAgICAgUlVOVElNRSBQQVJBTVM6ICAgICAgKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KdHlwZWRlZiBlbnVtCnsKICBETVhfQlNfREFUQV9FWFBJUllfRlJBTUUsICAgICAgICAgIC8qITwgVGhlIG51bWJlciBvZiBmcmFtZXMgd2l0aG91dCBuZXcgbWV0YWRhdGEgdGhhdCBoYXZlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28gYnkgYmVmb3JlIHRoZSBiaXRzdHJlYW0gZGF0YSBleHBpcmVzLiBUaGUgdmFsdWUgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVzIGV4cGlyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBETVhfQlNfREFUQV9ERUxBWSwgICAgICAgICAgICAgICAgIC8qITwgVGhlIG51bWJlciBvZiBkZWxheSBmcmFtZXMgb2YgdGhlIG91dHB1dCBzYW1wbGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZWQgdG8gdGhlIGJpdHN0cmVhbSBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAqLwogIE5VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMgLCAgICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAoZXF1YWxzIHRoZSBudW1iZXIgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyBwcm9jZXNzZWQgYnkgdGhlIGF1ZGlvIG91dHB1dCBzZXR1cCkuICAgICAgICovCiAgRFVBTF9DSEFOTkVMX0RPV05NSVhfTU9ERSAgICAgICAgICAvKiE8IERvd25taXggbW9kZSBmb3IgdHdvIGNoYW5uZWwgYXVkaW8gZGF0YS4gICAgICAgICAgICAgICAqLwoKfSBQQ01ETVhfUEFSQU07CgoKdHlwZWRlZiBlbnVtCnsKICBTVEVSRU9fTU9ERSA9IDB4MCwgICAgICAgICAgIC8qITwgTGVhdmUgc3RlcmVvIHNpZ25hbHMgYXMgdGhleSBhcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgQ0gxX01PREUgICAgPSAweDEsICAgICAgICAgICAvKiE8IENyZWF0ZSBhIGR1YWwgbW9ubyBvdXRwdXQgc2lnbmFsIGZyb20gY2hhbm5lbCAxLiAgICAgICAgICAgICAqLwogIENIMl9NT0RFICAgID0gMHgyLCAgICAgICAgICAgLyohPCBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBmcm9tIGNoYW5uZWwgMi4gICAgICAgICAgICAgKi8KICBNSVhFRF9NT0RFICA9IDB4MyAgICAgICAgICAgIC8qITwgQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgYnkgbWl4aW5nIHRoZSB0d28gY2hhbm5lbHMuICovCgp9IERVQUxfQ0hBTk5FTF9NT0RFOwoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCiAqICAgICBNT0RVTEVTIElOVEVSRkFDRTogICAqCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwp0eXBlZGVmIHN0cnVjdCBQQ01fRE1YX0lOU1RBTkNFICpIQU5ETEVfUENNX0RPV05NSVg7CgovKiBNb2R1bGVzIHJlc2V0IGZsYWdzICovCiNkZWZpbmUgUENNRE1YX1JFU0VUX1BBUkFNUyAgICggMSApCiNkZWZpbmUgUENNRE1YX1JFU0VUX0JTX0RBVEEgICggMiApCiNkZWZpbmUgUENNRE1YX1JFU0VUX0ZVTEwgICAgICggUENNRE1YX1JFU0VUX1BBUkFNUyB8IFBDTURNWF9SRVNFVF9CU19EQVRBICkKCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiCnsKI2VuZGlmCgovKiogT3BlbiBhbmQgaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlCiAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyB0aGUgaGFuZGxlIG9mIHRoZSBuZXcgaW5zdGFuY2UuCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X09wZW4gKAogICAgSEFORExFX1BDTV9ET1dOTUlYICpwU2VsZgogICk7CgovKiogU2V0IG9uZSBwYXJhbWV0ZXIgZm9yIG9uZSBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlLgogKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggaW5zdGFuY2UuCiAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB0byBiZSBzZXQuCiAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB2YWx1ZS4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfU2V0UGFyYW0gKAogICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAogICAgUENNRE1YX1BBUkFNICAgICAgICBwYXJhbSwKICAgIFVJTlQgICAgICAgICAgICAgICAgdmFsdWUKICApOwoKLyoqIFJlYWQgdGhlIGFuY2lsbGFyeSBkYXRhIHRyYW5zcG9ydGVkIGluIERTRXMgb2YgRFZCIHN0cmVhbXMgd2l0aCBNUEVHLTQgY29udGVudAogKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggaW5zdGFuY2UuCiAqIEBwYXJhbSBbaW5dIFBvaW50ZXIgdG8gYW5jaWxsYXJ5IGRhdGEgYnVmZmVyLgogKiBAcGFyYW0gW2luXSBTaXplIG9mIGFuY2lsbGFyeSBkYXRhLgogKiBAcGFyYW0gW2luXSBGbGFnIGluZGljYXRpbmcgd2hldGVyIHRoZSBhbmNpbGxhcnkgZGF0YSBpcyBmcm9tIGEgTVBFRy0xLzIgb3IgYW4gTVBFRy00IHN0cmVhbS4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfUmVhZER2YkFuY0RhdGEgKAogICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAogICAgVUNIQVIgKnBBbmNEYXRhQnVmLAogICAgVUlOVCAgIGFuY0RhdGFCeXRlcywKICAgIGludCAgICBpc01wZWcyCiAgKTsKCi8qKiBTZXQgdGhlIG1hdHJpeCBtaXhkb3duIGluZm9ybWF0aW9uIGV4dHJhY3RlZCBmcm9tIHRoZSBQQ0Ugb2YgYW4gQUFDIGJpdHN0cmVhbS4KICogIE5vdGU6IENhbGwgb25seSBpZiBtYXRyaXhfbWl4ZG93bl9pZHhfcHJlc2VudCBpcyB0cnVlLgogKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggaW5zdGFuY2UuCiAqIEBwYXJhbSBbaW5dIE1hdHJpeCBtaXhkb3duIGluZGV4IHByZXNlbnQgZmxhZyBleHRyYWN0ZWQgZnJvbSBQQ0UuCiAqIEBwYXJhbSBbaW5dIFRoZSAyIGJpdCBtYXRyaXggbWl4ZG93biBpbmRleCBleHRyYWN0ZWQgZnJvbSBQQ0UuCiAqIEBwYXJhbSBbaW5dIFRoZSBwc2V1ZG8gc3Vycm91bmQgZW5hYmxlIGZsYWcgZXh0cmFjdGVkIGZyb20gUENFLgogKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8KUENNRE1YX0VSUk9SIHBjbURteF9TZXRNYXRyaXhNaXhkb3duRnJvbVBjZSAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCiAgICBpbnQgICAgICAgICAgICAgICAgIG1hdHJpeE1peGRvd25QcmVzZW50LAogICAgaW50ICAgICAgICAgICAgICAgICBtYXRyaXhNaXhkb3duSWR4LAogICAgaW50ICAgICAgICAgICAgICAgICBwc2V1ZG9TdXJyb3VuZEVuYWJsZQogICk7CgovKiogUmVzZXQgdGhlIG1vZHVsZS4KICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IGluc3RhbmNlLgogKiBAcGFyYW0gW2luXSBGbGFncyB0ZWxsaW5nIHdoaWNoIHBhcnRzIG9mIHRoZSBtb2R1bGUgc2hhbGwgYmUgcmVzZXQuCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X1Jlc2V0ICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKICAgIFVJTlQgICAgICAgICAgICAgICAgZmxhZ3MKICApOwoKLyoqIEFwcGx5IGRvd24gb3IgdXAgbWl4aW5nLgogKgogKiBccGFyYW0gW2luXSAgICBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgogKiBccGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHRpbWUgYnVmZmVyIHdpdGggZGVjb2RlZCBQQ00gc2FtcGxlcy4KICogXHBhcmFtIFtpbl0gICAgUG9pbnRlciB3aGVyZSB0aGUgYW1vdW50IG9mIG91dHB1dCBzYW1wbGVzIGlzIHJldHVybmVkIGludG8uCiAqIFxwYXJhbSBbaW5vdXRdIFBvaW50ZXIgd2hlcmUgdGhlIGFtb3VudCBvZiBvdXRwdXQgY2hhbm5lbHMgaXMgcmV0dXJuZWQgaW50by4KICogXHBhcmFtIFtpbl0gICAgRmxhZyB3aGljaCBpbmRpY2F0ZXMgaWYgb3V0cHV0IHRpbWUgZGF0YSBhcmUgd3JpdHRlcm4gaW50ZXJsZWF2ZWQgb3IgYXMgc3Vic2VxdWVudCBibG9ja3MuCiAqIFxwYXJhbSBbaW5vdXRdIEFycmF5IHdlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGZvciBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsIGlzIHN0b3JlZCBpbnRvLgogKiBccGFyYW0gW2lub3V0XSBBcnJheSB3ZXJlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBpbmRleCBmb3IgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbCBpcyBzdG9yZWQgaW50by4KICogXHBhcmFtIFtpbl0gICAgQXJyYXkgY29udGFpbmluZyB0aGUgb3V0cHV0IGNoYW5uZWwgbWFwcGluZyB0byBiZSB1c2VkIChGcm9tIE1QRUcgUENFIG9yZGVyaW5nIHRvIHdoYXRldmVyIGlzIHJlcXVpcmVkKS4KICoKICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfQXBwbHlGcmFtZSAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggICAgICBzZWxmLAogICAgSU5UX1BDTSAgICAgICAgICAgICAgICAqcFBjbUJ1ZiwKICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSwKICAgIElOVCAgICAgICAgICAgICAgICAgICAgKm5DaGFubmVscywKCiAgICBpbnQgICAgICAgICAgICAgICAgICAgICBmSW50ZXJsZWF2ZWQsCiAgICBBVURJT19DSEFOTkVMX1RZUEUgICAgICBjaGFubmVsVHlwZVtdLAogICAgVUNIQVIgICAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbXSwKICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nW11bOF0KICApOwoKLyoqIENsb3NlIGFuIGluc3RhbmNlIG9mIHRoZSBQQ00gZG93bm1peCBtb2R1bGUuCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgaGFuZGxlIG9mIHRoZSBpbnN0YW5jZS4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfQ2xvc2UgKAogICAgSEFORExFX1BDTV9ET1dOTUlYICpwU2VsZgogICk7CgovKiogR2V0IGxpYnJhcnkgaW5mbyBmb3IgdGhpcyBtb2R1bGUuCiAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3R1cmUuCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICovClBDTURNWF9FUlJPUiBwY21EbXhfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKTsKCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAgLyogX1BDTVVUSUxTX0xJQl9IXyAqLwo=