Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBUcmFuc3BvcnQgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogTWFudWVsIEphbmRlcgogICBEZXNjcmlwdGlvbjogTVBFRyBUcmFuc3BvcnQgZGVjb2RlcgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBfX1RQREVDX0xJQl9IX18KI2RlZmluZSBfX1RQREVDX0xJQl9IX18KCiNpbmNsdWRlICJ0cF9kYXRhLmgiCgojaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgoKI2RlZmluZSBUUkFOU1BPUlRERUNfSU5CVUZfU0laRSAgKCA4MTkyICkgICAvKiE8IFNpemUgaXMgaW4gYnl0ZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIHRyYW5zcG9ydCBpbnB1dCBidWZmZXIgc2l6ZSBjYXJlZnVsbHkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1cmUgdGhhdCBpdCBmdWxmaWxscyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIHRyYW5zcG9ydCBmb3JtYXQocykuICAgICAgICAgICAgICAgICAgICAqLwoKdHlwZWRlZiBlbnVtIHsKICBUUkFOU1BPUlRERUNfT0sgPSAwLCAgICAgICAgICAgICAvKiE8IEFsbCBmaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgLyogU3luY2hyb25pemF0aW9uIGVycm9ycy4gV2FpdCBmb3IgbmV3IGlucHV0IGRhdGEgYW5kIHRyeSBhZ2Fpbi4gKi8KICB0cGRlY19zeW5jX2Vycm9yX3N0YXJ0ICAgPSAweDEwMCwKICBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTLCAgICAvKiE8IE91dCBvZiBiaXRzLiBQcm92aWRlIG1vcmUgYml0cyBhbmQgdHJ5IGFnYWluLiAgICAgICAgICAgICAgKi8KICBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUiwgICAgICAgICAvKiE8IE5vIHN5bmMgd2FzIGZvdW5kIG9yIHN5bmMgZ290IGxvc3QuIEtlZXAgdHJ5aW5nLiAgICAgICAgICAgKi8KICB0cGRlY19zeW5jX2Vycm9yX2VuZCwKCiAgLyogRGVjb2RlIGVycm9ycy4gTW9zdGx5IGNhdXNlZCBkdWUgdG8gYml0IGVycm9ycy4gKi8KICB0cGRlY19kZWNvZGVfZXJyb3Jfc3RhcnQgPSAweDQwMCwKICBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1IsICAgICAgICAvKiE8IEJpdHN0cmVhbSBkYXRhIHNob3dlZCBpbmNvbnNpc3RlbmNpZXMgKHdyb25nIHN5bnRheCkuICAgICAgKi8KICBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFULCAvKiE8IFVuc3VwcG9ydGVkIGZvcm1hdCBvciBmZWF0dXJlIGZvdW5kIGluIHRoZSBiaXRzdHJlYW0gZGF0YS4gKi8KICBUUkFOU1BPUlRERUNfQ1JDX0VSUk9SLCAgICAgICAgICAvKiE8IENSQyBlcnJvciBlbmNvdW50ZXJlZCBpbiBiaXRzdHJlYW0gZGF0YS4gICAgICAgICAgICAgICAgICAgKi8KICB0cGRlY19kZWNvZGVfZXJyb3JfZW5kLAoKICAvKiBGYXRhbCBlcnJvcnMuIFN0b3AgaW1tZWRpYXRlbHkgb24gb25lIG9mIHRoZXNlIGVycm9ycyEgKi8KICB0cGRlY19mYXRhbF9lcnJvcl9zdGFydCAgPSAweDIwMCwKICBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SLCAgICAgICAvKiE8IEFuIHVua25vd24gZXJyb3Igb2NjdXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBUUkFOU1BPUlRERUNfSU5WQUxJRF9QQVJBTUVURVIsICAvKiE8IEFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQgdG8gYSBmdW5jdGlvbi4gICAgICAgICAgICAgKi8KICBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJULCAgICAvKiE8IFRoZSBkZWNvZGVyIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCwgc2luY2UgdGhlIHJlcXVpZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBjaGFuZ2UgY2Fubm90IGJlIHBlcmZvcm1lZC4gICAgICAgICAgICAgICAgICAqLwogIHRwZGVjX2ZhdGFsX2Vycm9yX2VuZAoKfSBUUkFOU1BPUlRERUNfRVJST1I7CgoKLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGRlY29kZSBlcnJvcnMuICovCiNkZWZpbmUgVFBERUNfSVNfREVDT0RFX0VSUk9SKGVycikgKCAoKGVycj49dHBkZWNfZGVjb2RlX2Vycm9yX3N0YXJ0KSAmJiAoZXJyPD10cGRlY19kZWNvZGVfZXJyb3JfZW5kKSkgPyAxIDogMCkKLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGZhdGFsIGVycm9ycy4gKi8KI2RlZmluZSBUUERFQ19JU19GQVRBTF9FUlJPUihlcnIpICAoICgoZXJyPj10cGRlY19mYXRhbF9lcnJvcl9zdGFydCkgICYmIChlcnI8PXRwZGVjX2ZhdGFsX2Vycm9yX2VuZCkpICA/IDEgOiAwKQoKCi8qKgogKiBcYnJpZWYgUGFyYW1ldGVyIGlkZW50aWZpZXJzIGZvciB0cmFuc3BvcnREZWNfU2V0UGFyYW0oKQogKi8KdHlwZWRlZiBlbnVtIHsKICBUUERFQ19QQVJBTV9NSU5JTUlaRV9ERUxBWSA9IDEsICAgICAgICAvKiogRGVsYXkgbWluaW1pemF0aW9uIHN0cmF0ZWd5LiAwOiBub25lLCAxOiBkaXNjYXJkIGFzIG1hbnkgZnJhbWVzIGFzIHBvc3NpYmxlLiAqLwogIFRQREVDX1BBUkFNX0VBUkxZX0NPTkZJRywgICAgICAgICAgICAgIC8qKiBFbmFibGUgZWFybHkgY29uZmlnIGRpc2NvdmVyeS4gKi8KICBUUERFQ19QQVJBTV9JR05PUkVfQlVGRkVSRlVMTE5FU1MsICAgICAvKiogSWdub3JlIGJ1ZmZlciBmdWxsbmVzcy4gKi8KICBUUERFQ19QQVJBTV9TRVRfQklUUkFURSwgICAgICAgICAgICAgICAvKiogU2V0IGF2ZXJhZ2UgYml0IHJhdGUgZm9yIGJpdCBzdHJlYW0gaW50ZXJydXB0aW9uIGZyYW1lIG1pc3NlcyBlc3RpbWF0aW9uLiAqLwogIFRQREVDX1BBUkFNX1JFU0VULCAgICAgICAgICAgICAgICAgICAgIC8qKiBSZXNldCB0cmFuc3BvcnQgZGVjb2RlciBpbnN0YW5jZSBzdGF0dXMuICovCiAgVFBERUNfUEFSQU1fQlVSU1RfUEVSSU9EICAgICAgICAgICAgICAgLyoqIFNldCBkYXRhIHJlY2VwdGlvbiBidXJzdCBwZXJpb2QgaW4gbWlsaSBzZWNvbmRzLiAqLwp9IFRQREVDX1BBUkFNOwoKLyogSVNPL0lFQyAxNDQ5Ni0zIDQuNC4xLjEgVGFibGUgNC4yIFByb2dyYW0gY29uZmlnIGVsZW1lbnQgKi8KI2RlZmluZSBQQ19GU0JfQ0hBTk5FTFNfTUFYIDE2IC8qIEZyb250L1NpZGUvQmFjayBjaGFubmVscyAqLwojZGVmaW5lIFBDX0xGRV9DSEFOTkVMU19NQVggNAojZGVmaW5lIFBDX0FTU09DREFUQV9NQVggICAgOAojZGVmaW5lIFBDX0NDRUxfTUFYICAgICAgICAgMTYgLyogQ0MgZWxlbWVudHMgKi8KI2RlZmluZSBQQ19DT01NRU5UTEVOR1RIICAgIDI1NgojZGVmaW5lIFBDX05VTV9IRUlHSFRfTEFZRVIgMwoKCi8qIQogIFxicmllZiAgICAgICAgICAgICAgIFJlc2V0IFByb2dyYW0gQ29uZmlnIEVsZW1lbnQuCiAgXHBhcmFtIHBQY2UgICAgICAgICAgUHJvZ3JhbSBDb25maWcgRWxlbWVudCBzdHJ1Y3R1cmUuCiAgXHJldHVybiAgICAgICAgICAgICAgdm9pZAoqLwp2b2lkICBDUHJvZ3JhbUNvbmZpZ19SZXNldCAoIENQcm9ncmFtQ29uZmlnICpwUGNlICk7CgovKiEKICBcYnJpZWYgICAgICAgICAgICAgICBJbml0aWFsaXplIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQuCiAgXHBhcmFtIHBQY2UgICAgICAgICAgUHJvZ3JhbSBDb25maWcgRWxlbWVudCBzdHJ1Y3R1cmUuCiAgXHJldHVybiAgICAgICAgICAgICAgdm9pZAoqLwp2b2lkICBDUHJvZ3JhbUNvbmZpZ19Jbml0ICggQ1Byb2dyYW1Db25maWcgKnBQY2UgKTsKCi8qIQogIFxicmllZiAgICAgICAgICAgICAgIElucXVpcmUgc3RhdGUgb2YgcHJlc2VudCBQcm9ncmFtIENvbmZpZyBFbGVtZW50IHN0cnVjdHVyZS4KICBccGFyYW0gcFBjZSAgICAgICAgICBQcm9ncmFtIENvbmZpZyBFbGVtZW50IHN0cnVjdHVyZS4KICBccmV0dXJuICAgICAgICAgICAgICAxIGlmIHRoZSBQQ0Ugc3RydWN0dXJlIGlzIGZpbGxlZCBjb3JyZWN0LAogICAgICAgICAgICAgICAgICAgICAgIDAgaWYgbm8gdmFsaWQgUENFIHByZXNlbnQuCiovCmludCAgQ1Byb2dyYW1Db25maWdfSXNWYWxpZCAoIGNvbnN0IENQcm9ncmFtQ29uZmlnICpwUGNlICk7CgojaWZkZWYgVFBfUENFX0VOQUJMRQovKiEKICBcYnJpZWYgICAgICAgICAgICAgICBSZWFkIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQuCiAgXHBhcmFtIHBQY2UgICAgICAgICAgUHJvZ3JhbSBDb25maWcgRWxlbWVudCBzdHJ1Y3R1cmUuCiAgXHBhcmFtIGJzICAgICAgICAgICAgQml0c3RyZWFtIGJ1ZmZlciB0byByZWFkIGZyb20uCiAgXHBhcmFtIGFsaWduQW5jaG9yICAgQWxpZ24gYml0c3RyZWFtIHRvIGFsaWduQW5jaG9yIGJpdHMgYWZ0ZXIgYWxsIHJlYWQgb3BlcmF0aW9ucy4KICBccmV0dXJuICAgICAgICAgICAgICB2b2lkCiovCnZvaWQgIENQcm9ncmFtQ29uZmlnX1JlYWQgKCBDUHJvZ3JhbUNvbmZpZyAgICAgICAqcFBjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICBhbGlnbkFuY2hvciApOwoKLyohCiAgXGJyaWVmICAgICAgICAgICAgICAgQ29tcGFyZSB0d28gUHJvZ3JhbSBDb25maWcgRWxlbWVudHMuCiAgXHBhcmFtIHBQY2UxICAgICAgICAgUG9pbnRlciB0byBmaXJzdCBQcm9ncmFtIENvbmZpZyBFbGVtZW50IHN0cnVjdHVyZS4KICBccGFyYW0gcFBjZTIgICAgICAgICBQb2ludGVyIHRvIHNlY29uZCBQcm9ncmFtIENvbmZpZyBFbGVtZW50IHN0cnVjdHVyZS4KICBccmV0dXJuICAgICAgICAgICAgICAtMSBpZiBQQ0VzIGFyZSBjb21wbGV0ZWx5IGRpZmZlcmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgMCBpZiBQQ0VzIGFyZSBjb21wbGV0ZWx5IGVxdWFsLAogICAgICAgICAgICAgICAgICAgICAgICAxIGlmIFBDRXMgYXJlIGRpZmZlcmVudCBidXQgaGF2ZSB0aGUgc2FtZSBjaGFubmVsIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgMiBpZiBQQ0VzIGhhdmUgZGlmZmVyZW50IGNoYW5uZWwgY29uZmlnIGJ1dCBzYW1lIG51bWJlciBvZiBjaGFubmVscy4KKi8KaW50IENQcm9ncmFtQ29uZmlnX0NvbXBhcmUgKCBjb25zdCBDUHJvZ3JhbUNvbmZpZyAqIGNvbnN0IHBQY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQcm9ncmFtQ29uZmlnICogY29uc3QgcFBjZTIgKTsKCi8qIQogIFxicmllZiAgICAgICAgICAgICAgIEdldCBhIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBwcmVkZWZpbmVkIE1QRUctNCBjaGFubmVsIGNvbmZpZ3VyYXRpb25zIDEtMTQuCiAgXHBhcmFtIHBQY2UgICAgICAgICAgUHJvZ3JhbSBDb25maWcgRWxlbWVudCBzdHJ1Y3R1cmUuCiAgXHBhcmFtIGNoYW5uZWxDb25maWcgTVBFRy00IGNoYW5uZWwgY29uZmlndXJhdGlvbi4KICBccmV0dXJuICAgICAgICAgICAgICB2b2lkCiovCnZvaWQgQ1Byb2dyYW1Db25maWdfR2V0RGVmYXVsdCAoIENQcm9ncmFtQ29uZmlnICpwUGNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNoYW5uZWxDb25maWcgKTsKI2VuZGlmIC8qIFRQX1BDRV9FTkFCTEUgKi8KCi8qKgogKiBcYnJpZWYgTG9va3VwIGFuZCB2ZXJpZnkgYSBnaXZlbiBlbGVtZW50LiBUaGUgZGVjb2RlciBjYWxscyB0aGlzCiAqICAgICAgICBtZXRob2Qgd2l0aCBldmVyeSBuZXcgZWxlbWVudCBJRCBmb3VuZCBpbiB0aGUgYml0c3RyZWFtLgogKgogKiBccGFyYW0gcFBjZSAgICAgICAgQSB2YWxpZCBQcm9ncmFtIGNvbmZpZyBzdHJ1Y3R1cmUuCiAqIFxwYXJhbSB0YWcgICAgICAgICBUYWcgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCB0byBiZSBsb29rZWQgdXAuCiAqIFxwYXJhbSBjaGFubmVsSWR4ICBUaGUgY3VycmVudCBjaGFubmVsIGNvdW50IG9mIHRoZSBkZWNvZGVyIHBhcnNlci4KICogXHBhcmFtIGNoTWFwcGluZyAgIEFycmF5IHRvIHN0b3JlIHRoZSBjYW5vbmljYWwgY2hhbm5lbCBtYXBwaW5nIGluZGV4ZXMuCiAqIFxwYXJhbSBjaFR5cGUgICAgICBBcnJheSB0byBzdG9yZSB0aGUgYXVkaW8gY2hhbm5lbCB0eXBlLgogKiBccGFyYW0gY2hJbmRleCAgICAgQXJyYXkgdG8gc3RvcmUgdGhlIGluZGl2aWR1YWwgYXVkaW8gY2hhbm5lbCB0eXBlIGluZGV4LgogKiBccGFyYW0gZWxNYXBwaW5nICAgUG9pbnRlciB3aGVyZSB0aGUgY2Fub25pY2FsIGVsZW1lbnQgaW5kZXggaXMgc3RvcmVkLgogKiBccGFyYW0gZWxUeXBlICAgICAgVGhlIGVsZW1lbnQgaWQgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCB0byBiZSBsb29rZWQgdXAuCiAqCiAqIFxyZXR1cm4gICAgICAgICAgICBOb24temVybyBpZiB0aGUgZWxlbWVudCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IHByb2dyYW0sIHplcm8KICogICAgICAgICAgICAgICAgICAgIGlmIGl0IGRvZXMgbm90LgogKi8KaW50IENQcm9ncmFtQ29uZmlnX0xvb2t1cEVsZW1lbnQoCiAgICAgICAgQ1Byb2dyYW1Db25maWcgKnBQY2UsCiAgICAgICAgVUlOVCAgICAgICAgICAgIGNoYW5uZWxDb25maWcsCiAgICAgICAgY29uc3QgVUlOVCAgICAgIHRhZywKICAgICAgICBjb25zdCBVSU5UICAgICAgY2hhbm5lbElkeCwKICAgICAgICBVQ0hBUiAgICAgICAgICAgY2hNYXBwaW5nW10sCiAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoVHlwZVtdLAogICAgICAgIFVDSEFSICAgICAgICAgICBjaEluZGV4W10sCiAgICAgICAgVUNIQVIgICAgICAgICAgKmVsTWFwcGluZywKICAgICAgICBNUDRfRUxFTUVOVF9JRCAgZWxMaXN0W10sCiAgICAgICAgTVA0X0VMRU1FTlRfSUQgIGVsVHlwZQogICAgICAgICk7CgovKioKICogXGJyaWVmICAgICAgICAgICAgIEdldCB0YWJsZSBvZiBlbGVtZW50cyBpbiBjYW5vbmljYWwgb3JkZXIgZnJvbSBhCiAqICAgICAgICAgICAgICAgICAgICBnaXZlIHByb2dyYW0gY29uZmlnIGZpZWxkLgogKiBccGFyYW0gcFBjZSAgICAgICAgQSB2YWxpZCBwcm9ncmFtIGNvbmZpZyBzdHJ1Y3R1cmUuCiAqIFxwYXJhbSB0YWJsZSAgICAgICBBbiBhcnJheSB3aGVyZSB0aGUgZWxlbWVudCBJRHMgYXJlIHN0b3JlZC4KICogXHBhcmFtIGVsTGlzdFNpemUgIFRoZSBsZW5ndGggb2YgdGhlIHRhYmxlIGFycmF5LgogKiBccGFyYW0gcENoTWFwSWR4ICAgUG9pbnRlciB0byBhIGZpZWxkIHJlY2VpdmluZyB0aGUgY29ycmVzcG9uZGluZwogKiAgICAgICAgICAgICAgICAgICAgaW1wbGljaXQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4IG9mIHRoZSBnaXZlbgogKiAgICAgICAgICAgICAgICAgICAgUENFLiBJZiBub25lIGNhbiBiZSBmb3VuZCBpdCByZWNlaXZlcyB0aGUgdmFsdWUgMC4KICogXHJldHVybiAgICAgICAgICAgIFRvdGFsIGVsZW1lbnQgY291bnQgaW5jbHVkaW5nIGFsbCBTQ0UsIENQRSBhbmQgTEZFLgogKi8KaW50IENQcm9ncmFtQ29uZmlnX0dldEVsZW1lbnRUYWJsZSggY29uc3QgQ1Byb2dyYW1Db25maWcgKnBQY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QNF9FTEVNRU5UX0lEICB0YWJsZVtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZWxMaXN0U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBDaE1hcElkeCApOwoKLyoqCiAqIFxicmllZiAgICAgICBJbml0aWFsaXplIGEgZ2l2ZW4gQXVkaW9TcGVjaWZpY0NvbmZpZyBzdHJ1Y3R1cmUuCiAqIFxwYXJhbSBwQXNjICBBIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIENTQXVkaW9TcGVjaWZpY0NvbmZpZyBzdHJ1Y3QuCiAqIFxyZXR1cm4gICAgICB2b2lkCiAqLwp2b2lkIEF1ZGlvU3BlY2lmaWNDb25maWdfSW5pdChDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MpOwoKLyoqCiAqIFxicmllZiAgIFBhcnNlIGEgQXVkaW9TcGVjaWZpY0NvbmZpZyBmcm9tIGEgZ2l2ZW4gYml0c3RyZWFtIGhhbmRsZS4KICoKICogXHBhcmFtIHBBc2MgICAgICAgICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBDU0F1ZGlvU3BlY2lmaWNDb25maWcgc3RydWN0LgogKiBccGFyYW0gaEJzICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW0gaGFuZGxlLgogKiBccGFyYW0gZkV4cGxpY2l0QmFja3dhcmRDb21wYXRpYmxlICBEbyBleHBsaWNpdCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHBhcnNpbmcgaWYgc2V0IChmbGFnKS4KICogXHBhcmFtIGNiIHBvaW50ZXIgdG8gc3RydWN0dXJlIGhvbGRpbmcgY2FsbGJhY2sgaW5mb3JtYXRpb24KICoKICogXHJldHVybiAgVG90YWwgZWxlbWVudCBjb3VudCBpbmNsdWRpbmcgYWxsIFNDRSwgQ1BFIGFuZCBMRkUuCiAqLwpUUkFOU1BPUlRERUNfRVJST1IgQXVkaW9TcGVjaWZpY0NvbmZpZ19QYXJzZSgKICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCiAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAogICAgICAgIGludCBmRXhwbGljaXRCYWNrd2FyZENvbXBhdGlibGUsCiAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IKICAgICAgICApOwoKLyogQ0VMUCBzdHVmZiAqLwplbnVtIHsKICBNUEUgICAgID0gMCwKICBSUEUgICAgID0gMSwKICBmczhLSHogID0gMCwKICBmczE2S0h6ID0gMQp9OwoKLyogRGVmaW50aW9uIG9mIGZsYWdzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0cmFuc3BvcnREZWNPcGVuKCkgKi8KI2RlZmluZSBUUF9GTEFHX01QRUc0IDEKCi8qIENhcGFiaWxpdHkgZmxhZ3MgKi8KI2RlZmluZSBDQVBGX1RQREVDX0FESUYgICAgICAgIDB4MDAwMDEwMDAgIC8qKjwgRmxhZyBpbmRpY2F0aW5nIHN1cHBvcnQgZm9yIEFESUYgdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICovCiNkZWZpbmUgQ0FQRl9UUERFQ19BRFRTICAgICAgICAweDAwMDAyMDAwICAvKio8IEZsYWcgaW5kaWNhdGluZyBzdXBwb3J0IGZvciBBRFRTIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLwojZGVmaW5lIENBUEZfVFBERUNfTE9BUyAgICAgICAgMHgwMDAwNDAwMCAgLyoqPCBGbGFnIGluZGljYXRpbmcgc3VwcG9ydCBmb3IgTE9BUyB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KI2RlZmluZSBDQVBGX1RQREVDX0xBVE0gICAgICAgIDB4MDAwMDgwMDAgIC8qKjwgRmxhZyBpbmRpY2F0aW5nIHN1cHBvcnQgZm9yIExBVE0gdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICovCiNkZWZpbmUgQ0FQRl9UUERFQ19SQVdQQUNLRVRTICAweDAwMDEwMDAwICAvKio8IEZsYWcgaW5kaWNhdGluZyBzdXBwb3J0IGZvciByYXcgcGFja2V0cyB0cmFuc3BvcnQgZm9ybWF0LiAqLwoKdHlwZWRlZiBzdHJ1Y3QgVFJBTlNQT1JUREVDICpIQU5ETEVfVFJBTlNQT1JUREVDOwoKCi8qKgogKiBcYnJpZWYgQ29uZmlndXJlIFRyYW5zcG9ydCBEZWNvZGVyIHZpYSBhIGJpbmFyeSBjb2RlZCBBdWRpb1NwZWNpZmljQ29uZmlnIG9yIFN0cmVhbU11eENvbmZpZy4KICogICAgICAgIFRoZSBwcmV2aW91c2x5IHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGFzIHdlbGwuIFRoZSBidWZmZXIgY29uZgogKiAgICAgICAgbXVzdCBjb250YWludCBhIFNNQyBpbiBjYXNlIG9mIExPQVMvTEFUTSB0cmFuc3BvcnQgZm9ybWF0LCBhbmQgYW4gQVNDIGVsc2V3YXlzLgogKgogKiBccGFyYW0gaFRwICAgICBIYW5kbGUgb2YgYSB0cmFuc3BvcnQgZGVjb2Rlci4KICogXHBhcmFtIGNvbmYgICAgVUNIQVIgYnVmZmVyIG9mIHRoZSBiaW5hcnkgY29kZWQgY29uZmlnIChBU0Mgb3IgU01DKS4KICogXHBhcmFtIGxlbmd0aCAgVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY29uZiBidWZmZXIuCiAqCiAqIFxyZXR1cm4gICAgICAgIEVycm9yIGNvZGUuCiAqLwpUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX091dE9mQmFuZENvbmZpZyggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgKmNvbmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgIGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgbGF5ZXIgKTsKCi8qKgogKiBcYnJpZWYgT3BlbiBUcmFuc3BvcnQgbWVkaXVtIGZvciByZWFkaW5nLgogKgogKiBccGFyYW0gdHJhbnNwb3J0RGVjRm10IEZvcm1hdCBvZiB0aGUgdHJhbnNwb3J0IGRlY29kZXIgbWVkaXVtIHRvIGJlIGFjY2Vzc2VkLgogKiBccGFyYW0gZmxhZ3MgICAgICAgICAgIFRyYW5zcG9ydCBkZWNvZGVyIGZsYWdzLiBDdXJyZW50bHkgb25seSBUUF9GTEFHX01QRUc0LCB3aGljaCBzaWduYWxzIGEKICogICAgICAgICAgICAgICAgICAgICAgICBNUEVHNCBjYXBhYmxlIGRlY29kZXIgKHJlbGV2YW50IGZvciBBRFRTIG9ubHkpLgogKgogKiBccmV0dXJuICAgQSBwb2ludGVyIHRvIGEgdmFsaWQgYW5kIGFsbG9jYXRlZCBIQU5ETEVfVFJBTlNQT1JUREVDIG9yIGEgbnVsbCBwb2ludGVyIG9uIGZhaWx1cmUuCiAqLwpIQU5ETEVfVFJBTlNQT1JUREVDIHRyYW5zcG9ydERlY19PcGVuKCBUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnREZWNGbXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MgKTsKCi8qKgogKiBcYnJpZWYgICAgICAgICAgICAgICAgUmVnaXN0ZXIgY29uZmlndXJhdGlvbiBjaGFuZ2UgY2FsbGJhY2suCiAqIFxwYXJhbSBoVHAgICAgICAgICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0IGRlY29kZXIuCiAqIFxwYXJhbSBjYlVwZGF0ZUNvbmZpZyBQb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGF1ZGlvIGNvbmZpZyBjaGFuZ2VzLgogKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcyBmaXJzdCBwYXJhbWV0ZXIuCiAqIFxyZXR1cm4gICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MuCiAqLwppbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyQXNjQ2FsbGJhY2sgKAogICAgICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAogICAgICAgIGNvbnN0IGNiVXBkYXRlQ29uZmlnX3QgY2JVcGRhdGVDb25maWcsCiAgICAgICAgdm9pZCogdXNlcl9kYXRhICk7CgovKioKICogXGJyaWVmICAgICAgICAgICAgICAgIFJlZ2lzdGVyIFNTQyBwYXJzZXIgY2FsbGJhY2suCiAqIFxwYXJhbSBoVHAgICAgICAgICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0IGRlY29kZXIuCiAqIFxwYXJhbSBjYlVwZGF0ZUNvbmZpZyBQb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIFNTQyBwYXJzaW5nLgogKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcyBmaXJzdCBwYXJhbWV0ZXIuCiAqIFxyZXR1cm4gICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MuCiAqLwppbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyU3NjQ2FsbGJhY2sgKAogICAgICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAogICAgICAgIGNvbnN0IGNiU3NjX3QgY2JTc2NQYXJzZSwKICAgICAgICB2b2lkKiB1c2VyX2RhdGEgKTsKCi8qKgogKiBcYnJpZWYgICAgICAgICAgICAgICAgUmVnaXN0ZXIgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suCiAqIFxwYXJhbSBoVHAgICAgICAgICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0IGRlY29kZXIuCiAqIFxwYXJhbSBjYlVwZGF0ZUNvbmZpZyBQb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIFNCUiBoZWFkZXIgcGFyc2luZy4KICogXHBhcmFtIHVzZXJfZGF0YSAgICAgIHZvaWQgcG9pbnRlciBmb3IgdXNlciBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMgZmlyc3QgcGFyYW1ldGVyLgogKiBccmV0dXJuICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLiAKICovCmludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTYnJDYWxsYmFjayggSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsIGNvbnN0IGNiU2JyX3QgY2JTYnIsIHZvaWQqIHVzZXJfZGF0YSk7CgovKioKICogXGJyaWVmIEZpbGwgaW50ZXJuYWwgaW5wdXQgYnVmZmVyIHdpdGggYml0c3RyZWFtIGRhdGEgZnJvbSB0aGUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLgogKiAgVGhlIGZ1bmN0aW9uIG9ubHkgY29waWVzIHN1Y2ggZGF0YSBhcyBsb25nIGFzIHRoZSBkZWNvZGVyLWludGVybmFsIGlucHV0IGJ1ZmZlciBpcyBub3QgZnVsbC4KICogIFNvIGl0IGdyYWJzIHdoYXRldmVyIGl0IGNhbiBmcm9tIHBCdWZmZXIgYW5kIHJldHVybnMgaW5mb3JtYXRpb24gKGJ5dGVzVmFsaWQpIHNvIHRoYXQgYXQgYQogKiAgc3Vic2VxdWVudCBjYWxsIG9mICV0cmFuc3BvcnREZWNfRmlsbERhdGEoKSwgdGhlIHJpZ2h0IHBvc2l0aW9uIGluIHBCdWZmZXIgY2FuIGJlIGRldGVybWluZWQgdG8KICogIGdyYWIgdGhlIG5leHQgZGF0YS4KICoKICogXHBhcmFtIGhUcCAgICAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnREZWMuCiAqIFxwYXJhbSBwQnVmZmVyICAgICBQb2ludGVyIHRvIGV4dGVybmFsIGlucHV0IGJ1ZmZlci4KICogXHBhcmFtIGJ1ZmZlclNpemUgIFNpemUgb2YgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLiBUaGlzIGFyZ3VtZW50IGlzIHJlcXVpcmVkIGJlY2F1c2UgZGVjb2Rlci1pbnRlcm5hbGx5CiAqICAgICAgICAgICAgICAgICAgICB3ZSBuZWVkIHRoZSBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCB0byBwQnVmZmVyLCB3aGVyZSB0aGUgbmV4dAogKiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIGRhdGEgaXMsIHdoaWNoIGlzIHRoZW4gZmVkIGludG8gdGhlIGRlY29kZXItaW50ZXJuYWwgYnVmZmVyIChhcyBtdWNoCiAqICAgICAgICAgICAgICAgICAgICBhcyBwb3NzaWJsZSkuIE91ciBleGFtcGxlIGZyYW1ld29yayBpbXBsZW1lbnRhdGlvbiBmaWxscyB0aGUgYnVmZmVyIGF0IHBCdWZmZXIKICogICAgICAgICAgICAgICAgICAgIGFnYWluLCBvbmNlIGl0IGNvbnRhaW5zIG5vIGF2YWlsYWJsZSB2YWxpZCBieXRlcyBhbnltb3JlIChtZWFuaW5nIGJ5dGVzVmFsaWQgZXF1YWwgMCkuCiAqIFxwYXJhbSBieXRlc1ZhbGlkICBOdW1iZXIgb2YgYml0c3RyZWFtIGJ5dGVzIGluIHRoZSBleHRlcm5hbCBiaXRzdHJlYW0gYnVmZmVyIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4KICogICAgICAgICAgICAgICAgICAgIGNvcGllZCBpbnRvIHRoZSBkZWNvZGVyJ3MgaW50ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCiAqICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgaXMgdXBkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGFtb3VudCBvZiBuZXdseSBjb3BpZWQgYnl0ZXMuCiAqIFxwYXJhbSBsYXllciAgICAgICBUaGUgbGF5ZXIgdGhlIGJpdHN0cmVhbSBiZWxvbmdzIHRvLgogKiBccmV0dXJuICAgICAgICAgICAgRXJyb3IgY29kZS4KICovClRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfRmlsbERhdGEoCiAgICAgICAgY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyAgaFRwLAogICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgKnBCdWZmZXIsCiAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwKICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICpwQnl0ZXNWYWxpZCwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBsYXllciApOwoKLyoqCiAqIFxicmllZiAgICAgIEdldCB0cmFuc3BvcnREZWMgYml0c3RyZWFtIGhhbmRsZS4KICogXHBhcmFtIGhUcCAgUG9pbnRlciB0byBhIHRyYW5zcG9ydCBkZWNvZGVyIGhhbmRsZS4KICogXHJldHVybiAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYml0c3RyZWFtIGhhbmRsZS4KICovCkhBTkRMRV9GREtfQklUU1RSRUFNIHRyYW5zcG9ydERlY19HZXRCaXRzdHJlYW0gKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgY29uc3QgVUlOVCBsYXllciApOwoKLyoqCiAqIFxicmllZiAgICAgIEdldCB0cmFuc3BvcnQgZm9ybWF0LgogKiBccGFyYW0gaFRwICBQb2ludGVyIHRvIGEgdHJhbnNwb3J0IGRlY29kZXIgaGFuZGxlLgogKiBccmV0dXJuICAgICBUaGUgdHJhbnNwb3J0IGZvcm1hdC4KICovClRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydERlY19HZXRGb3JtYXQgKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCApOwoKLyoqCiAqIFxicmllZiBHZXQgdGhlIGN1cnJlbnQgYnVmZmVyIGZ1bGxuZXNzIHZhbHVlLgogKgogKiBccGFyYW0gaFRwICAgICBIYW5kbGUgb2YgYSB0cmFuc3BvcnQgZGVjb2Rlci4KICoKICogXHJldHVybiAgICAgICAgQnVmZmVyIGZ1bGxuZXNzCiAqLwpJTlQgdHJhbnNwb3J0RGVjX0dldEJ1ZmZlckZ1bGxuZXNzKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCApOwoKLyoqCiAqIFxicmllZiAgICAgICBDbG9zZSBhbmQgZGVhbGxvY2F0ZSB0cmFuc3BvcnREZWMuCiAqIFxwYXJhbSBwaFRwICBQb2ludGVyIHRvIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgdHJhbnNwb3J0IGRlY29kZXIgaGFuZGxlLgogKiBccmV0dXJuICAgICAgdm9pZAogKi8Kdm9pZCB0cmFuc3BvcnREZWNfQ2xvc2UgKCBIQU5ETEVfVFJBTlNQT1JUREVDICpwaFRwICk7CgovKioKICogXGJyaWVmICAgICAgICAgUmVhZCBvbmUgYWNjZXNzIHVuaXQgZnJvbSB0aGUgdHJhbnNwb3J0RGVjIG1lZGl1bS4KICogXHBhcmFtIGhUcCAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydERlYy4KICogXHBhcmFtIGxlbmd0aCAgT24gcmV0dXJuLCB0aGlzIHZhbHVlIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIGFjdHVhbCBhY2Nlc3MgdW5pdCBsZW5ndGggaW4gYml0cy4KICogICAgICAgICAgICAgICAgU2V0IHRvIC0xIGlmIGxlbmd0aCBpcyB1bmtub3duLgogKiBccmV0dXJuICAgICAgICBFcnJvciBjb2RlLgogKi8KVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19SZWFkQWNjZXNzVW5pdCAoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLCBjb25zdCBVSU5UIGxheWVyICk7CgovKioKICogXGJyaWVmIEdldCB0aGUgcmVtYWluaW5nIGFtb3VudCBvZiBiaXRzIG9mIHRoZSBjdXJyZW50IGFjY2VzcyB1bml0LiBUaGUgcmVzdWx0CiAqICAgICAgICBjYW4gYmUgYmVsb3cgemVybywgbWVhbmluZyB0aGF0IHRvbyBtYW55IGJpdHMgaGF2ZSBiZWVuIHJlYWQuCiAqIFxwYXJhbSBoVHAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnREZWMuCiAqIFxyZXR1cm4gYW1vdW50IG9mIHJlbWFpbmluZyBiaXRzLgogKi8KSU5UIHRyYW5zcG9ydERlY19HZXRBdUJpdHNSZW1haW5pbmcoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLCBjb25zdCBVSU5UIGxheWVyICk7CgovKioKICogXGJyaWVmIEdldCB0aGUgdG90YWwgYW1vdW50IG9mIGJpdHMgb2YgdGhlIGN1cnJlbnQgYWNjZXNzIHVuaXQuCiAqIFxwYXJhbSBoVHAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnREZWMuCiAqIFxyZXR1cm4gYW1vdW50IG9mIHRvdGFsIGJpdHMuCiAqLwpJTlQgdHJhbnNwb3J0RGVjX0dldEF1Qml0c1RvdGFsKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgY29uc3QgVUlOVCBsYXllciApOwoKLyoqCiAqIFxicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGRlY29kZXIgaGFzIGZpbmlzaGVkIHBhcnNpbmcKICogICAgICAgICAgICAgb25lIEFjY2VzcyBVbml0IGZvciBiaXRzdHJlYW0gaG91c2VrZWVwaW5nLgogKiBccGFyYW0gaFRwICBUcmFuc3BvcnQgSGFuZGxlLgogKiBccmV0dXJuICAgICBFcnJvciBjb2RlLgogKi8KVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19FbmRBY2Nlc3NVbml0ICggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAgKTsKCi8qKgogKiBcYnJpZWYgICAgICBPYnRhaW4gdGhlIGFtb3VudCBvZiBtaXNzaW5nIGFjY2VzcyB1bml0cyBpZiBhcHBsaWNhYmxlIGluIGNhc2Ugb2YgCiAqICAgICAgICAgICAgIGEgYml0IHN0cmVhbSBzeW5jaHJvbml6YXRpb24gZXJyb3IuIEVhY2ggdGltZSB0cmFuc3BvcnREZWNfUmVhZEFjY2Vzc1VuaXQoKQogKiAgICAgICAgICAgICByZXR1cm5zIFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB0byByZXRyaWV2ZSBhbiBlc3RpbWF0ZQogKiAgICAgICAgICAgICBvZiB0aGUgYW1vdW50IG9mIG1pc3NpbmcgYWNjZXNzIHVuaXRzLiBUaGlzIHdvcmtzIG9ubHkgaW4gY2FzZSBvZiBjb25zdGFudCBhdmVyYWdlCiAqICAgICAgICAgICAgIGJpdCByYXRlIChoYXMgdG8gYmUga25vd24pIGFuZCBpZiB0aGUgcGFyYW1ldGVyIFRQREVDX1BBUkFNX1NFVF9CSVRSQVRFIGhhcyBiZWVuIHNldAogKiAgICAgICAgICAgICBhY2NvcmRpbmdseS4KICogXHBhcmFtIGhUcCAgVHJhbnNwb3J0IEhhbmRsZS4KICogXHBhcmFtIHBOQWNjZXNzVW5pdHMgcG9pbnRlciB0byBhIG1lbW9yeSBsb2NhdGlvbiB3aGVyZSB0aGUgZXN0aW1hdGVkIGxvc3QgZnJhbWUgY291bnQgd2lsbCBiZSBzdG9yZWQgaW50by4gICAgICAKICogXHJldHVybiAgICAgRXJyb3IgY29kZS4KICovClRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfR2V0TWlzc2luZ0FjY2Vzc1VuaXRDb3VudCAoIElOVCAqcE5BY2Nlc3NVbml0cywgSEFORExFX1RSQU5TUE9SVERFQyBoVHAgKTsKCgovKioKICogXGJyaWVmICAgICAgICBTZXQgYSBnaXZlbiBzZXR0aW5nLgogKiBccGFyYW0gaFRwICAgIFRyYW5zcG9ydCBIYW5kbGUuCiAqIFxwYXJhbSBwYXJhbSAgSWRlbnRpZmllciBvZiB0aGUgcGFyYW1ldGVyIHRvIGJlIGNoYW5nZWQuCiAqIFxwYXJhbSB2YWx1ZSAgVmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIgdG8gYmUgY2hhbmdlZC4KICogXHJldHVybiAgICAgICBFcnJvciBjb2RlLgogKi8KVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19TZXRQYXJhbSAoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFBERUNfUEFSQU0gICAgICAgICBwYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgdmFsdWUgKTsKCi8qKgogKiBcYnJpZWYgICAgICAgIEdldCBudW1iZXIgb2Ygc3ViZnJhbWVzIChmb3IgTEFUTSBvciBBRFRTKQogKiBccGFyYW0gaFRwICAgIFRyYW5zcG9ydCBIYW5kbGUuCiAqIFxyZXR1cm4gICAgICAgTnVtYmVyIG9mIEFEVFMvTEFUTSBzdWJmcmFtZXMgKHJldHVybiAxIGZvciBhbGwgb3RoZXIgdHJhbnNwb3J0IHR5cGVzKS4KICovClVJTlQgdHJhbnNwb3J0RGVjX0dldE5yT2ZTdWJGcmFtZXMoSEFORExFX1RSQU5TUE9SVERFQyBoVHApOwoKCi8qKgogKiBcYnJpZWYgICAgICAgR2V0IGluZm8gc3RydWN0dXJlIG9mIHRyYW5zcG9ydCBkZWNvZGVyIGxpYnJhcnkuCiAqIFxwYXJhbSBpbmZvICBBIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdC4KICogXHJldHVybiAgICAgIEVycm9yIGNvZGUuCiAqLwpUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0dldExpYkluZm8oIExJQl9JTkZPICppbmZvICk7CgovKiBBRFRTIENSQyBzdXBwb3J0ICovCgovKioKICogXGJyaWVmICAgICAgICBTZXQgY3VycmVudCBiaXRzdHJlYW0gcG9zaXRpb24gYXMgc3RhcnQgb2YgYSBuZXcgZGF0YSByZWdpb24uCiAqIFxwYXJhbSBoVHAgICAgVHJhbnNwb3J0IGhhbmRsZS4KICogXHBhcmFtIG1CaXRzICBTaXplIGluIGJpdHMgb2YgdGhlIGRhdGEgcmVnaW9uLiBTZXQgdG8gMCBpZiBpdCBzaG91bGQgbm90IGJlIG9mIGEgZml4ZWQgc2l6ZS4KICogXHJldHVybiAgICAgICBEYXRhIHJlZ2lvbiBJRCwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBjYWxsaW5nIHRyYW5zcG9ydERlY19DcmNFbmRSZWcoKS4KICovCmludCB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcgKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBtQml0cyApOwoKLyoqCiAqIFxicmllZiAgICAgICAgU2V0IGVuZCBvZiBkYXRhIHJlZ2lvbi4KICogXHBhcmFtIGhUcCAgICBUcmFuc3BvcnQgaGFuZGxlLgogKiBccGFyYW0gcmVnICAgIERhdGEgcmVnaW9uIElELCBvcGJ0YWluZWQgZnJvbSB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcoKS4KICogXHJldHVybiAgICAgICB2b2lkCiAqLwp2b2lkIHRyYW5zcG9ydERlY19DcmNFbmRSZWcgKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHJlZyApOwoKLyoqCiAqIFxicmllZiAgICAgIENhbGN1bGF0ZSBBRFRTIGNyYyBhbmQgY2hlY2sgaWYgaXQgaXMgY29ycmVjdC4gVGhlIEFEVFMgY2hlY2tzdW0gaXMgaGVsZCBpbnRlcm5hbGx5LgogKiBccGFyYW0gaFRwICBUcmFuc3BvcnQgaGFuZGxlLgogKiBccmV0dXJuICAgICBSZXR1cm4gVFJBTlNQT1JUREVDX09LIGlmIHRoZSBDUkMgaXMgb2ssIG9yIGVycm9yIGlmIENSQyBpcyBub3QgY29ycmVjdC4KICovClRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfQ3JjQ2hlY2sgKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCApOwoKCiNlbmRpZiAvKiAjaWZuZGVmIF9fVFBERUNfTElCX0hfXyAqLwo=