Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogTWFudWVsIEphbmRlcgogICBEZXNjcmlwdGlvbjogTVBFRyBUcmFuc3BvcnQgZGF0YSB0YWJsZXMKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgX19UUF9EQVRBX0hfXwojZGVmaW5lIF9fVFBfREFUQV9IX18KCiNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKI2luY2x1ZGUgIkZES19hdWRpby5oIgojaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgoKLyoKICogQ29uZmlndXJhdGlvbgogKi8KI2RlZmluZSBUUF9HQV9FTkFCTEUKLyogI2RlZmluZSBUUF9DRUxQX0VOQUJMRSAqLwovKiAjZGVmaW5lIFRQX0hWWENfRU5BQkxFICovCi8qICNkZWZpbmUgVFBfU0xTX0VOQUJMRSAqLwojZGVmaW5lIFRQX0VMRF9FTkFCTEUKLyogI2RlZmluZSBUUF9VU0FDX0VOQUJMRSAqLwovKiAjZGVmaW5lIFRQX1JTVkQ1MF9FTkFCTEUgKi8KCiNpZiBkZWZpbmVkKFRQX0dBX0VOQUJMRSkgfHwgZGVmaW5lZChUUF9TTFNfRU5BQkxFKQojZGVmaW5lIFRQX1BDRV9FTkFCTEUgICAgICAgLyoqPCBFbmFibGUgZnVsbCBQQ0Ugc3VwcG9ydCAqLwojZW5kaWYKCi8qKgogKiBQcm9ncmFtQ29uZmlnIHN0cnVjdC4KICovCi8qIElTTy9JRUMgMTQ0OTYtMyA0LjQuMS4xIFRhYmxlIDQuMiBQcm9ncmFtIGNvbmZpZyBlbGVtZW50ICovCiNkZWZpbmUgUENfRlNCX0NIQU5ORUxTX01BWCAxNiAvKiBGcm9udC9TaWRlL0JhY2sgY2hhbm5lbHMgKi8KI2RlZmluZSBQQ19MRkVfQ0hBTk5FTFNfTUFYIDQKI2RlZmluZSBQQ19BU1NPQ0RBVEFfTUFYICAgIDgKI2RlZmluZSBQQ19DQ0VMX01BWCAgICAgICAgIDE2IC8qIENDIGVsZW1lbnRzICovCiNkZWZpbmUgUENfQ09NTUVOVExFTkdUSCAgICAyNTYKCnR5cGVkZWYgc3RydWN0CnsKI2lmZGVmIFRQX1BDRV9FTkFCTEUKICAvKiBQQ0UgYml0c3RyZWFtIGVsZW1lbnRzOiAqLwogIFVDSEFSIEVsZW1lbnRJbnN0YW5jZVRhZzsKICBVQ0hBUiBQcm9maWxlOwogIFVDSEFSIFNhbXBsaW5nRnJlcXVlbmN5SW5kZXg7CiAgVUNIQVIgTnVtRnJvbnRDaGFubmVsRWxlbWVudHM7CiAgVUNIQVIgTnVtU2lkZUNoYW5uZWxFbGVtZW50czsKICBVQ0hBUiBOdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOwogIFVDSEFSIE51bUxmZUNoYW5uZWxFbGVtZW50czsKICBVQ0hBUiBOdW1Bc3NvY0RhdGFFbGVtZW50czsKICBVQ0hBUiBOdW1WYWxpZENjRWxlbWVudHM7CgogIFVDSEFSIE1vbm9NaXhkb3duUHJlc2VudDsKICBVQ0hBUiBNb25vTWl4ZG93bkVsZW1lbnROdW1iZXI7CgogIFVDSEFSIFN0ZXJlb01peGRvd25QcmVzZW50OwogIFVDSEFSIFN0ZXJlb01peGRvd25FbGVtZW50TnVtYmVyOwoKICBVQ0hBUiBNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50OwogIFVDSEFSIE1hdHJpeE1peGRvd25JbmRleDsKICBVQ0hBUiBQc2V1ZG9TdXJyb3VuZEVuYWJsZTsKCiAgVUNIQVIgRnJvbnRFbGVtZW50SXNDcGVbUENfRlNCX0NIQU5ORUxTX01BWF07CiAgVUNIQVIgRnJvbnRFbGVtZW50VGFnU2VsZWN0W1BDX0ZTQl9DSEFOTkVMU19NQVhdOwogIFVDSEFSIEZyb250RWxlbWVudEhlaWdodEluZm9bUENfRlNCX0NIQU5ORUxTX01BWF07CgogIFVDSEFSIFNpZGVFbGVtZW50SXNDcGVbUENfRlNCX0NIQU5ORUxTX01BWF07CiAgVUNIQVIgU2lkZUVsZW1lbnRUYWdTZWxlY3RbUENfRlNCX0NIQU5ORUxTX01BWF07CiAgVUNIQVIgU2lkZUVsZW1lbnRIZWlnaHRJbmZvW1BDX0ZTQl9DSEFOTkVMU19NQVhdOwoKICBVQ0hBUiBCYWNrRWxlbWVudElzQ3BlW1BDX0ZTQl9DSEFOTkVMU19NQVhdOwogIFVDSEFSIEJhY2tFbGVtZW50VGFnU2VsZWN0W1BDX0ZTQl9DSEFOTkVMU19NQVhdOwogIFVDSEFSIEJhY2tFbGVtZW50SGVpZ2h0SW5mb1tQQ19GU0JfQ0hBTk5FTFNfTUFYXTsKCiAgVUNIQVIgTGZlRWxlbWVudFRhZ1NlbGVjdFtQQ19MRkVfQ0hBTk5FTFNfTUFYXTsKCiAgVUNIQVIgQXNzb2NEYXRhRWxlbWVudFRhZ1NlbGVjdFtQQ19BU1NPQ0RBVEFfTUFYXTsKCiAgVUNIQVIgQ2NFbGVtZW50SXNJbmRTd1tQQ19DQ0VMX01BWF07CiAgVUNIQVIgVmFsaWRDY0VsZW1lbnRUYWdTZWxlY3RbUENfQ0NFTF9NQVhdOwoKICBVQ0hBUiBDb21tZW50RmllbGRCeXRlczsKICBVQ0hBUiBDb21tZW50W1BDX0NPTU1FTlRMRU5HVEhdOwojZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLwoKICAvKiBIZWxwZXIgdmFyaWFibGVzIGZvciBhZG1pbmlzdHJhdGlvbjogKi8KICBVQ0hBUiBpc1ZhbGlkOyAgICAgICAgICAgICAgIC8qITwgRmxhZyBzaG93aW5nIGlmIFBDRSBoYXMgYmVlbiByZWFkIHN1Y2Nlc3NmdWxseS4gKi8KICBVQ0hBUiBOdW1DaGFubmVsczsgICAgICAgICAgIC8qITwgQW1vdW50IG9mIGF1ZGlvIGNoYW5uZWxzIHN1bW1pbmcgYWxsIGNoYW5uZWwgZWxlbWVudHMgaW5jbHVkaW5nIExGRXMgKi8KICBVQ0hBUiBOdW1FZmZlY3RpdmVDaGFubmVsczsgIC8qITwgQW1vdW50IG9mIGF1ZGlvIGNoYW5uZWxzIHN1bW1pbmcgb25seSBTQ0VzIGFuZCBDUEVzICovCiAgVUNIQVIgZWxDb3VudGVyOwoKfSBDUHJvZ3JhbUNvbmZpZzsKCnR5cGVkZWYgZW51bSB7CiAgQVNDRVhUX1VOS09XTiA9IC0xLAogIEFTQ0VYVF9TQlIgICAgPSAweDJiNywKICBBU0NFWFRfUFMgICAgID0gMHg1NDgsCiAgQVNDRVhUX01QUyAgICA9IDB4NzZhLAogIEFTQ0VYVF9TQU9DICAgPSAweDdjYiwKICBBU0NFWFRfTERNUFMgID0gMHg3Y2MKCn0gVFBfQVNDX0VYVEVOU0lPTl9JRDsKCiNpZmRlZiBUUF9HQV9FTkFCTEUKLyoqCiAqIEdhU3BlY2lmaWNDb25maWcgc3RydWN0CiAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgVUlOVCBtX2ZyYW1lTGVuZ3RoRmxhZyA7CiAgVUlOVCBtX2RlcGVuZHNPbkNvcmVDb2RlciA7CiAgVUlOVCBtX2NvcmVDb2RlckRlbGF5IDsKCiAgVUlOVCBtX2V4dGVuc2lvbkZsYWcgOwogIFVJTlQgbV9leHRlbnNpb25GbGFnMyA7CgogIFVJTlQgbV9sYXllcjsKICBVSU5UIG1fbnVtT2ZTdWJGcmFtZTsKICBVSU5UIG1fbGF5ZXJMZW5ndGg7Cgp9IENTR2FTcGVjaWZpY0NvbmZpZzsKI2VuZGlmIC8qIFRQX0dBX0VOQUJMRSAqLwoKCgoKI2lmZGVmIFRQX0VMRF9FTkFCTEUKCnR5cGVkZWYgZW51bSB7CiAgRUxERVhUX1RFUk0gID0gMHgwLCAgIC8qIFRlcm1pbmF0aW9uIHRhZyAqLwogIEVMREVYVF9TQU9DICA9IDB4MSwgICAvKiBTQU9DIGNvbmZpZyAqLwogIEVMREVYVF9MRFNBQyA9IDB4MiAgICAvKiBMRCBNUEVHIFN1cnJvdW5kIGNvbmZpZyAqLwogIC8qIHJlc2VydmVkICovCn0gQVNDX0VMRF9FWFRfVFlQRTsKCnR5cGVkZWYgc3RydWN0IHsKICBVQ0hBUiBtX2ZyYW1lTGVuZ3RoRmxhZzsKCiAgVUNIQVIgbV9zYnJQcmVzZW50RmxhZzsKICBVQ0hBUiBtX3VzZUxkUW1mVGltZUFsaWduOyAgLyogVXNlIExELU1QUyBRTUYgaW4gU0JSIHRvIGFjaGl2ZSB0aW1lIGFsaWdubWVudCAqLwogIFVDSEFSIG1fc2JyU2FtcGxpbmdSYXRlOwogIFVDSEFSIG1fc2JyQ3JjRmxhZzsKCn0gQ1NFbGRTcGVjaWZpY0NvbmZpZzsKI2VuZGlmIC8qIFRQX0VMRF9FTkFCTEUgKi8KCgoKCi8qKgogKiBBdWRpbyBjb25maWd1cmF0aW9uIHN0cnVjdCwgc3VpdGFibGUgZm9yIGVuY29kZXIgYW5kIGRlY29kZXIgY29uZmlndXJhdGlvbi4KICovCnR5cGVkZWYgc3RydWN0IHsKCiAgLyogWFlaIFNwZWNpZmljIERhdGEgKi8KICB1bmlvbiB7CiNpZmRlZiBUUF9HQV9FTkFCTEUKICAgIENTR2FTcGVjaWZpY0NvbmZpZyAgICBtX2dhU3BlY2lmaWNDb25maWc7ICAgICAgIC8qKjwgR2VuZXJhbCBhdWRpbyBzcGVjaWZpYyBjb25maWd1cmF0aW9uLiAgICAgICAgICovCiNlbmRpZiAvKiBUUF9HQV9FTkFCTEUgKi8KI2lmZGVmIFRQX0VMRF9FTkFCTEUKICAgIENTRWxkU3BlY2lmaWNDb25maWcgICBtX2VsZFNwZWNpZmljQ29uZmlnOyAgICAgIC8qKjwgRUxEIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICovCiNlbmRpZiAvKiBUUF9FTERfRU5BQkxFICovCiAgfSBtX3NjOwogIAogIC8qIENvbW1vbiBBU0MgcGFyYW1ldGVycyAqLwojaWZkZWYgVFBfUENFX0VOQUJMRQogIENQcm9ncmFtQ29uZmlnICAgICAgICBtX3Byb2dyQ29uZmlnRWxlbWVudDsgICAgIC8qKjwgUHJvZ3JhbSBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2VuZGlmIC8qIFRQX1BDRV9FTkFCTEUgKi8KCiAgQVVESU9fT0JKRUNUX1RZUEUgICAgIG1fYW90OyAgICAgICAgICAgICAgICAgICAgLyoqPCBBdWRpbyBPYmplY3QgVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIFVJTlQgICAgICAgICAgICAgICAgICBtX3NhbXBsaW5nRnJlcXVlbmN5OyAgICAgIC8qKjwgU2FtcGxlcmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBVSU5UICAgICAgICAgICAgICAgICAgbV9zYW1wbGVzUGVyRnJhbWU7ICAgICAgICAvKio8IEFtb3VudCBvZiBzYW1wbGVzIHBlciBmcmFtZS4gICAgICAgICAgICAgICAgICAgICovCiAgVUlOVCAgICAgICAgICAgICAgICAgIG1fZGlyZWN0TWFwcGluZzsgICAgICAgICAgLyoqPCBEb2N1bWVudCB0aGlzIHBsZWFzZSAhISAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICBBVURJT19PQkpFQ1RfVFlQRSAgICAgbV9leHRlbnNpb25BdWRpb09iamVjdFR5cGU7ICAgICAgICAvKio8IEF1ZGlvIG9iamVjdCB0eXBlICAgICAgICAgICAgICAgICAgICAgICovCiAgVUlOVCAgICAgICAgICAgICAgICAgIG1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3k7ICAgICAgLyoqPCBTYW1wbGVyYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgCgogIFNDSEFSICAgICAgICAgICAgICAgICBtX2NoYW5uZWxDb25maWd1cmF0aW9uOyAgIC8qKjwgQ2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4ICAgICAgICAgICAgICAgICAgICAgKi8KCiAgU0NIQVIgICAgICAgICAgICAgICAgIG1fZXBDb25maWc7ICAgICAgICAgICAgICAgLyoqPCBFcnJvciBwcm90ZWN0aW9uIGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBTQ0hBUiAgICAgICAgICAgICAgICAgbV92Y2IxMUZsYWc7ICAgICAgICAgICAgICAvKio8IGFhY1NlY3Rpb25EYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICAgICAqLwogIFNDSEFSICAgICAgICAgICAgICAgICBtX3J2bGNGbGFnOyAgICAgICAgICAgICAgIC8qKjwgYWFjU2NhbGVmYWN0b3JEYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICovCiAgU0NIQVIgICAgICAgICAgICAgICAgIG1faGNyRmxhZzsgICAgICAgICAgICAgICAgLyoqPCBhYWNTcGVjdHJhbERhdGFSZXNpbGllbmNlRmxhZyAgICAgICAgICAgICAgICAgICAgKi8KCiAgU0NIQVIgICAgICAgICAgICAgICAgIG1fc2JyUHJlc2VudEZsYWc7ICAgICAgICAgLyoqPCBGbGFnIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIFNCUiBkYXRhIGluIHRoZSBiaXRzdHJlYW0gICAgICAgICAgICAgICAqLwogIFNDSEFSICAgICAgICAgICAgICAgICBtX3BzUHJlc2VudEZsYWc7ICAgICAgICAgIC8qKjwgRmxhZyBpbmRpY2F0aW5nIHRoZSBwcmVzZW5jZSBvZiBwYXJhbWV0cmljIHN0ZXJlbyBkYXRhIGluIHRoZSBiaXRzdHJlYW0gKi8KICBVQ0hBUiAgICAgICAgICAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4OyAvKio8IFNhbXBsZXJhdGUgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIFVDSEFSICAgICAgICAgICAgICAgICBtX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5SW5kZXg7IC8qKjwgU2FtcGxlcmF0ZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICovCiAgU0NIQVIgICAgICAgICAgICAgICAgIG1fZXh0ZW5zaW9uQ2hhbm5lbENvbmZpZ3VyYXRpb247ICAgLyoqPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXggICAgICAgICAgICAgKi8KCn0gQ1NBdWRpb1NwZWNpZmljQ29uZmlnOwoKdHlwZWRlZiBJTlQgKCpjYlVwZGF0ZUNvbmZpZ190KSh2b2lkKiwgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnKik7CnR5cGVkZWYgSU5UICgqY2JTc2NfdCkoCiAgICAgICAgdm9pZCosIEhBTkRMRV9GREtfQklUU1RSRUFNLAogICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKICAgICAgICBjb25zdCBJTlQgc2FtcGxpbmdGcmVxdWVuY3ksCiAgICAgICAgY29uc3QgSU5UIG11eE1vZGUsCiAgICAgICAgY29uc3QgSU5UIGNvbmZpZ0J5dGVzCiAgICAgICAgKTsKdHlwZWRlZiBJTlQgKCpjYlNicl90KSgKICAgICAgICB2b2lkICogICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgIGhCcywKICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZUluLAogICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlT3V0LAogICAgICAgIGNvbnN0IElOVCBzYW1wbGVzUGVyRnJhbWUsCiAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAogICAgICAgIGNvbnN0IE1QNF9FTEVNRU5UX0lEICAgIGVsZW1lbnRJRCwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICBlbGVtZW50SW5kZXgKICAgICAgICApOwoKdHlwZWRlZiBzdHJ1Y3QgIHsKICBjYlVwZGF0ZUNvbmZpZ190IGNiVXBkYXRlQ29uZmlnOyAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIENvbmZpZyBjaGFuZ2Ugbm90aWZ5IGNhbGxiYWNrLiAgKi8KICB2b2lkICpjYlVwZGF0ZUNvbmZpZ0RhdGE7ICAgICAgICAvKiE8IFVzZXIgZGF0YSBwb2ludGVyIGZvciBDb25maWcgY2hhbmdlIG5vdGlmeSBjYWxsYmFjay4gKi8KICBjYlNzY190IGNiU3NjOyAgICAgICAgICAgICAgICAgICAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIFNTQyBwYXJzZXIgY2FsbGJhY2suICovCiAgdm9pZCAqY2JTc2NEYXRhOyAgICAgICAgICAgICAgICAgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgU1NDIHBhcnNlciBjYWxsYmFjay4gKi8KICBjYlNicl90IGNiU2JyOyAgICAgICAgICAgICAgICAgICAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIFNCUiBoZWFkZXIgcGFyc2VyIGNhbGxiYWNrLiAqLwogIHZvaWQgKmNiU2JyRGF0YTsgICAgICAgICAgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIFNCUiBoZWFkZXIgcGFyc2VyIGNhbGxiYWNrLiAqLwp9IENTVHBDYWxsQmFja3M7CgpzdGF0aWMgY29uc3QgVUlOVCBTYW1wbGluZ1JhdGVUYWJsZVtdID0gCnsgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLCA3MzUwLCAwLCAwLAogIDAKfTsKCnN0YXRpYyBpbmxpbmUKaW50IGdldFNhbXBsaW5nUmF0ZUluZGV4KCBVSU5UIHNhbXBsaW5nUmF0ZSApCnsKICBVSU5UIHNmX2luZGV4LCB0YWJsZVNpemU9c2l6ZW9mKFNhbXBsaW5nUmF0ZVRhYmxlKS9zaXplb2YoVUlOVCk7CgogIGZvciAoc2ZfaW5kZXg9MDsgc2ZfaW5kZXg8dGFibGVTaXplOyBzZl9pbmRleCsrKSB7CiAgICBpZiggU2FtcGxpbmdSYXRlVGFibGVbc2ZfaW5kZXhdID09IHNhbXBsaW5nUmF0ZSApIGJyZWFrOwogIH0KCiAgaWYgKHNmX2luZGV4PnRhYmxlU2l6ZS0xKSB7CiAgICByZXR1cm4gdGFibGVTaXplLTE7CiAgfQoKICByZXR1cm4gc2ZfaW5kZXg7Cn0KCi8qCiAqIEdldCBDaGFubmVsIGNvdW50IGZyb20gY2hhbm5lbCBjb25maWd1cmF0aW9uCiAqLwpzdGF0aWMgaW5saW5lIGludCBnZXROdW1iZXJPZlRvdGFsQ2hhbm5lbHMoaW50IGNoYW5uZWxDb25maWcpCnsKICBzd2l0Y2ggKGNoYW5uZWxDb25maWcpIHsKICBjYXNlIDE6IGNhc2UgMjogY2FzZSAzOgogIGNhc2UgNDogY2FzZSA1OiBjYXNlIDY6CiAgICByZXR1cm4gY2hhbm5lbENvbmZpZzsKICBjYXNlIDc6IGNhc2UgMTI6IGNhc2UgMTQ6CiAgICByZXR1cm4gODsKICBjYXNlIDExOgogICAgcmV0dXJuIDc7CiAgZGVmYXVsdDoKICAgIHJldHVybiAwOwogIH0KfQoKc3RhdGljIGlubGluZQppbnQgZ2V0TnVtYmVyT2ZFZmZlY3RpdmVDaGFubmVscyhjb25zdCBpbnQgY2hhbm5lbENvbmZpZykKeyAgICAgICAgLyogaW5kZXg6IDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUgKi8KICBjb25zdCBpbnQgbltdID0gezAsMSwyLDMsNCw1LDUsNywwLDAsIDAsIDYsIDcsIDAsIDcsIDB9OwogIHJldHVybiBuW2NoYW5uZWxDb25maWddOwp9CgojZW5kaWYgLyogX19UUF9EQVRBX0hfXyAqLwo=