Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyAqKioqKioqKioqKioqKioqKioqKioqKgoKICAgQXV0aG9yKHMpOgogICBEZXNjcmlwdGlvbjogU0JSIGVuY29kZXIgdG9wIGxldmVsIHByb2Nlc3NpbmcgcHJvdG90eXBlCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWZuZGVmIF9fU0JSX0VOQ09ERVJfSAojZGVmaW5lIF9fU0JSX0VOQ09ERVJfSAoKI2luY2x1ZGUgImNvbW1vbl9maXguaCIKI2luY2x1ZGUgIkZES19hdWRpby5oIgoKI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKCi8qIGNvcmUgY29kZXIgaGVscGVycyAqLwojZGVmaW5lIE1BWF9UUkFOU19GQUMgICAgICAgICA4CiNkZWZpbmUgTUFYX0NPREVDX0ZSQU1FX1JBVElPIDIKI2RlZmluZSBNQVhfUEFZTE9BRF9TSVpFICAgIDI1NgoKdHlwZWRlZiBlbnVtIGNvZGVjVHlwZQp7CiAgQ09ERUNfQUFDPTAsCiAgQ09ERUNfQUFDTEQ9MSwKICBDT0RFQ19VTlNQRUNJRklFRD05OQp9IENPREVDX1RZUEU7CgoKdHlwZWRlZiBzdHJ1Y3QKewogIElOVCBiaXRSYXRlOwogIElOVCBuQ2hhbm5lbHM7CiAgSU5UIHNhbXBsZUZyZXE7CiAgSU5UIHRyYW5zRmFjOwogIElOVCBzdGFuZGFyZEJpdHJhdGU7Cn0gQ09ERUNfUEFSQU07Cgp0eXBlZGVmIGVudW0KewogIFNCUl9NT05PLAogIFNCUl9MRUZUX1JJR0hULAogIFNCUl9DT1VQTElORywKICBTQlJfU1dJVENIX0xSQwp9IFNCUl9TVEVSRU9fTU9ERTsKCi8qIGJpdHN0cmVhbSBzeW50YXggZmxhZ3MgKi8KZW51bQp7CiAgU0JSX1NZTlRBWF9MT1dfREVMQVkgPSAweDAwMDEsCiAgU0JSX1NZTlRBWF9TQ0FMQUJMRSAgPSAweDAwMDIsCiAgU0JSX1NZTlRBWF9DUkMgICAgICAgPSAweDAwMDQsCiAgU0JSX1NZTlRBWF9EUk1fQ1JDICAgPSAweDAwMDgKfTsKCnR5cGVkZWYgZW51bQp7CiAgRlJFUV9SRVNfTE9XID0gMCwKICBGUkVRX1JFU19ISUdICn0gRlJFUV9SRVM7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgQ09ERUNfVFlQRSAgICAgICBjb3JlQ29kZXI7ICAgICAgICAvKiE8IExDIG9yIEVMRCAqLwogIFVJTlQgICAgICAgICAgICAgYml0cmF0ZUZyb207ICAgICAgLyohPCBpbmNsdXNpdmUgKi8KICBVSU5UICAgICAgICAgICAgIGJpdHJhdGVUbzsgICAgICAgIC8qITwgZXhjbHVzaXZlICovCgogIFVJTlQgICAgICAgICAgICAgc2FtcGxlUmF0ZTsgICAgICAgLyohPCAgICovCiAgVUNIQVIgICAgICAgICAgICBudW1DaGFubmVsczsgICAgICAvKiE8ICAgKi8KCiAgVUNIQVIgICAgICAgICAgICBzdGFydEZyZXE7ICAgICAgICAvKiE8IGJzX3N0YXJ0X2ZyZXEgKi8KICBVQ0hBUiAgICAgICAgICAgIHN0YXJ0RnJlcVNwZWVjaDsgIC8qITwgYnNfc3RhcnRfZnJlcSBmb3Igc3BlZWNoIGNvbmZpZyBmbGFnICovCiAgVUNIQVIgICAgICAgICAgICBzdG9wRnJlcTsgICAgICAgICAvKiE8IGJzX3N0b3BfZnJlcSAqLwogIFVDSEFSICAgICAgICAgICAgc3RvcEZyZXFTcGVlY2g7ICAgLyohPCBic19zdG9wX2ZyZXEgZm9yIHNwZWVjaCBjb25maWcgZmxhZyAqLwoKICBVQ0hBUiAgICAgICAgICAgIG51bU5vaXNlQmFuZHM7ICAgIC8qITwgICAqLwogIFVDSEFSICAgICAgICAgICAgbm9pc2VGbG9vck9mZnNldDsgLyohPCAgICovCiAgU0NIQVIgICAgICAgICAgICBub2lzZU1heExldmVsOyAgICAvKiE8ICAgKi8KICBTQlJfU1RFUkVPX01PREUgIHN0ZXJlb01vZGU7ICAgICAgIC8qITwgICAqLwogIFVDSEFSICAgICAgICAgICAgZnJlcVNjYWxlOyAgICAgICAgLyohPCAgICovCn0gc2JyVHVuaW5nVGFibGVfdDsKCnR5cGVkZWYgc3RydWN0IHNickNvbmZpZ3VyYXRpb24KewogIC8qCiAgICAgY29yZSBjb2RlciBkZXBlbmRlbnQgY29uZmlndXJhdGlvbnMKICAqLwogIENPREVDX1BBUkFNIGNvZGVjU2V0dGluZ3M7ICAvKiE8IENvcmUgY29kZXIgc2V0dGluZ3MuIFRvIGJlIHNldCBmcm9tIGNvcmUgY29kZXIuICovCiAgSU5UIFNlbmRIZWFkZXJEYXRhVGltZTsgICAgIC8qITwgU0JSIGhlYWRlciBzZW5kIHVwZGF0ZSBmcmVxdWVuY3kgaW4gbXMuICovCiAgSU5UIHVzZVdhdmVDb2Rpbmc7ICAgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2Ygd2F2ZWNvZGluZyB0b29sLiAqLwogIElOVCBjcmNTYnI7ICAgICAgICAgICAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIFNCUi1DUkMuICovCiAgSU5UIGR5bkJ3U3VwcG9ydGVkOyAgICAgICAgIC8qITwgRmxhZzogc3VwcG9ydCBmb3IgZHluYW1pYyBiYW5kd2lkdGggaW4gdGhpcyBjb21iaW5hdGlvbi4gKi8KICBJTlQgcGFyYW1ldHJpY0NvZGluZzsgICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiBwYXJhbWV0cmljIGNvZGluZyB0b29sLiAqLwogIElOVCBkb3duU2FtcGxlRmFjdG9yOyAgICAgICAvKiE8IFNhbXBsaW5nIHJhdGUgcmVsYXRpb24gYmV0d2VlbiB0aGUgU0JSIGFuZCB0aGUgY29yZSBlbmNvZGVyLiAqLwogIEZSRVFfUkVTIGZyZXFfcmVzX2ZpeGZpeFsyXTsvKiE8IEZyZXF1ZW5jeSByZXNvbHV0aW9uIG9mIGVudmVsb3BlcyBpbiBmcmFtZSBjbGFzcyBGSVhGSVgsIGZvciBub24tc3BsaXQgY2FzZSBhbmQgc3BsaXQgY2FzZSAqLwogIFVDSEFSIGZSZXNUcmFuc0lzTG93OyAgICAgICAvKiE8IEZyZXF1ZW5jeSByZXNvbHV0aW9uIG9mIGVudmVsb3BlcyBpbiB0cmFuc2llbnQgZnJhbWVzOiBsb3cgKDApIG9yIHZhcmlhYmxlICgxKSAqLwoKICAvKgogICAgIGNvcmUgY29kZXIgZGVwZW5kZW50IHR1bmluZyBwYXJhbWV0ZXJzCiAgKi8KICBJTlQgdHJhbl90aHI7ICAgICAgICAgICAgIC8qITwgU0JSIHRyYW5zaWVudCBkZXRlY3RvciB0aHJlc2hvbGQgKCogMTAwKS4gKi8KICBJTlQgbm9pc2VGbG9vck9mZnNldDsgICAgIC8qITwgTm9pc2UgZmxvb3Igb2Zmc2V0LiAgICAgICovCiAgVUlOVCB1c2VTcGVlY2hDb25maWc7ICAgICAvKiE8IEZsYWc6IGFkYXB0IHR1bmluZyBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBzcGVlY2guICovCgoKCiAgLyoKICAgICBjb3JlIGNvZGVyIGluZGVwZW5kZW50IGNvbmZpZ3VyYXRpb25zCiAgKi8KICBJTlQgc2JyRnJhbWVTaXplOyAgICAgICAgICAgLyohPCBTQlIgZnJhbWUgc2l6ZSBpbiBzYW1wbGVzLiBXaWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSBjb3JlIGNvZGVyIHNldHRpbmdzLiAqLwogIElOVCBzYnJfZGF0YV9leHRyYTsgICAgICAgICAvKiE8IEZsYWcgdXNhZ2Ugb2YgZGF0YSBleHRyYS4gKi8KICBJTlQgYW1wX3JlczsgICAgICAgICAgICAgICAgLyohPCBBbXBsaXR1ZGUgcmVzb2x1dGlvbi4gKi8KICBJTlQgYW5hX21heF9sZXZlbDsgICAgICAgICAgLyohPCBOb2lzZSBpbnNlcnRpb24gbWF4aW11bSBsZXZlbC4gKi8KICBJTlQgdHJhbl9mYzsgICAgICAgICAgICAgICAgLyohPCBUcmFuc2llbnQgZGV0ZWN0b3Igc3RhcnQgZnJlcXVlbmN5LiAqLwogIElOVCB0cmFuX2RldF9tb2RlOyAgICAgICAgICAvKiE8IFRyYW5zaWVudCBkZXRlY3RvciBtb2RlLiAqLwogIElOVCBzcHJlYWQ7ICAgICAgICAgICAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIFNCUiBzcHJlYWQuICovCiAgSU5UIHN0YXQ7ICAgICAgICAgICAgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2Ygc3RhdGljIGZyYW1pbmcuICovCiAgSU5UIGU7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVudmVsb3BlcyB3aGVuIHN0YXRpYyBmcmFtaW5nIGlzIGNob3Nlbi4gKi8KICBTQlJfU1RFUkVPX01PREUgc3RlcmVvTW9kZTsgLyohPCBTQlIgc3RlcmVvIG1vZGUuICovCiAgSU5UIGRlbHRhVEFjcm9zc0ZyYW1lczsgICAgIC8qITwgRmxhZzogYWxsb3cgdGltZS1kZWx0YSBjb2RpbmcuICovCiAgRklYUF9EQkwgZEZfZWRnZV8xc3RFbnY7ICAgIC8qITwgRXh0cmEgZnJhY3Rpb24gZGVsdGEtRiBjb2RpbmcgaXMgYWxsb3dlZCB0byBiZSBtb3JlIGV4cGVuc2l2ZS4gKi8KICBGSVhQX0RCTCBkRl9lZGdlX2luY3I7ICAgICAgLyohPCBJbmNyZW1lbnQgZEZfZWRnZV8xc3RFbnYgdGhpcyBtdWNoIGlmIGRULWNvZGluZyB3YXMgdXNlZCB0aGlzIGZyYW1lLiAqLwogIElOVCBzYnJfaW52Zl9tb2RlOyAgICAgICAgICAvKiE8IEludmVyc2UgZmlsdGVyaW5nIG1vZGUuICovCiAgSU5UIHNicl94cG9zX21vZGU7ICAgICAgICAgIC8qITwgVHJhbnNwb3NlciBtb2RlLiAqLwogIElOVCBzYnJfeHBvc19jdHJsOyAgICAgICAgICAvKiE8IFRyYW5zcG9zZXIgY29udHJvbC4gKi8KICBJTlQgc2JyX3hwb3NfbGV2ZWw7ICAgICAgICAgLyohPCBUcmFuc3Bvc2VyIDNyZCBvcmRlciBsZXZlbC4gKi8KICBJTlQgc3RhcnRGcmVxOyAgICAgICAgICAgICAgLyohPCBUaGUgc3RhcnQgZnJlcXVlbmN5IHRhYmxlIGluZGV4LiAqLwogIElOVCBzdG9wRnJlcTsgICAgICAgICAgICAgICAvKiE8IFRoZSBzdG9wIGZyZXF1ZW5jeSB0YWJsZSBpbmRleC4gKi8KICBJTlQgdXNlU2FQYW47ICAgICAgICAgICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiBTQVBBTiBzdGVyZW8uICovCiAgSU5UIGR5bkJ3RW5hYmxlZDsgICAgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2YgZHluYW1pYyBiYW5kd2lkdGguICovCiAgSU5UIGJQYXJhbWV0cmljU3RlcmVvOyAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2YgcGFyYW1ldHJpYyBzdGVyZW8gY29kaW5nIHRvb2wuICovCgogIC8qCiAgICAgaGVhZGVyX2V4dHJhMSBjb25maWd1cmF0aW9uCiAgKi8KICBVQ0hBUiBmcmVxU2NhbGU7ICAgICAgICAgICAgLyohPCBGcmVxdWVuY3kgZ3JvdXBpbmcuICovCiAgSU5UIGFsdGVyU2NhbGU7ICAgICAgICAgICAgIC8qITwgU2NhbGUgcmVzb2x1dGlvbi4gKi8KICBJTlQgc2JyX25vaXNlX2JhbmRzOyAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMuICovCgoKICAvKgogICAgIGhlYWRlcl9leHRyYTIgY29uZmlndXJhdGlvbgogICovCiAgSU5UIHNicl9saW1pdGVyX2JhbmRzOyAgICAgIC8qITwgTnVtYmVyIG9mIGxpbWl0ZXIgYmFuZHMuICovCiAgSU5UIHNicl9saW1pdGVyX2dhaW5zOyAgICAgIC8qITwgR2FpbiBvZiBsaW1pdGVyLiAqLwogIElOVCBzYnJfaW50ZXJwb2xfZnJlcTsgICAgICAvKiE8IEZsYWc6IHVzZSBpbnRlcnBvbGF0aW9uIGluIGZyZXEuIGRpcmVjdGlvbi4gKi8KICBJTlQgc2JyX3Ntb290aGluZ19sZW5ndGg7ICAgLyohPCBGbGFnOiBjaG9vc2UgbGVuZ3RoIDQgb3IgMCAoPW9uLCBvZmYpLiAqLwogIFVDSEFSIGluaXRfYW1wX3Jlc19GRjsKICBGSVhQX0RCTCB0aHJlc2hvbGRfQW1wUmVzX0ZGX207CiAgU0NIQVIgdGhyZXNob2xkX0FtcFJlc19GRl9lOwp9IHNickNvbmZpZ3VyYXRpb24sICpzYnJDb25maWd1cmF0aW9uUHRyIDsKCnR5cGVkZWYgc3RydWN0IFNCUl9DT05GSUdfREFUQQp7CiAgVUlOVCBzYnJTeW50YXhGbGFnczsgICAgICAgICAgICAgICAgICAvKio8IFNCUiBzeW50YXggZmxhZ3MgZGVyaXZlZCBmcm9tIEFPVC4gKi8KICBJTlQgbkNoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzLiAgKi8KCiAgSU5UIG5TZmJbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBTQlIgc2NhbGVmYWN0b3IgYmFuZHMgZm9yIExPX1JFUyBhbmQgSElfUkVTICg/KSAqLwogIElOVCBudW1fTWFzdGVyOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdl9rX21hc3Rlci4gKi8KICBJTlQgc2FtcGxlRnJlcTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU0JSIHNhbXBsaW5nIGZyZXF1ZW5jeS4gKi8KICBJTlQgZnJhbWVTaXplOwogIElOVCB4T3ZlckZyZXE7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgU0JSIHN0YXJ0IGZyZXF1ZW5jeS4gKi8KICBJTlQgZHluWE92ZXJGcmVxOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXNlZCBjcm9zc292ZXIgZnJlcXVlbmN5IHdoZW4gZHluYW1pYyBiYW5kd2lkdGggaXMgZW5hYmxlZC4gKi8KICBJTlQgbm9RbWZCYW5kczsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFFNRiBmcmVxdWVuY3kgYmFuZHMuICovCiAgSU5UIG5vUW1mU2xvdHM7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBRTUYgc2xvdHMuICovCgogIFVDSEFSICpmcmVxQmFuZFRhYmxlWzJdOyAgICAgICAgICAgICAgLyoqPCBGcmVxdWVuY3kgdGFibGUgZm9yIGxvdyBhbmQgaGlyZXMsIG9ubHkgTUFYX0ZSRVFfQ09FRkZTLzIgKzEgY29lZmZzIGFjdHVhbGx5IG5lZWRlZCBmb3IgbG93cmVzLiAqLwogIFVDSEFSICp2X2tfbWFzdGVyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXN0ZXIgQmFuZFRhYmxlIHdoZXJlIGZyZXFCYW5kVGFibGUgaXMgZGVyaXZlZCBmcm9tLiAqLwoKCiAgU0JSX1NURVJFT19NT0RFIHN0ZXJlb01vZGU7CiAgSU5UIG5vRW52Q2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnZlbG9wZSBjaGFubmVscy4gKi8KCiAgSU5UIHVzZVdhdmVDb2Rpbmc7ICAgICAgICAgICAgICAgICAgICAvKio8IEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHdhdmUgY29kaW5nIGF0IGFsbC4gICAgICAqLwogIElOVCB1c2VQYXJhbWV0cmljQ29kaW5nOyAgICAgICAgICAgICAgLyoqPCBGbGFnIGluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSBwYXJhIGNvZGluZyBhdCBhbGwuICAgICAgKi8KICBJTlQgeHBvc0N0cmxTd2l0Y2g7ICAgICAgICAgICAgICAgICAgIC8qKjwgRmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0byBzd2l0Y2ggeHBvcyBjdHJsIG9uIHRoZSBmbHkuICovCiAgSU5UIHN3aXRjaFRyYW5zcG9zZXJzOyAgICAgICAgICAgICAgICAvKio8IEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc3dpdGNoIHhwb3Mgb24gdGhlIGZseSAuICAgICAqLwogIFVDSEFSIGluaXRBbXBSZXNGRjsKICBGSVhQX0RCTCB0aHJlc2hvbGRBbXBSZXNGRl9tOwogIFNDSEFSIHRocmVzaG9sZEFtcFJlc0ZGX2U7Cn0gU0JSX0NPTkZJR19EQVRBLCAqSEFORExFX1NCUl9DT05GSUdfREFUQTsKCnR5cGVkZWYgc3RydWN0IHsKICBNUDRfRUxFTUVOVF9JRCBlbFR5cGU7CiAgSU5UIGJpdFJhdGU7CiAgaW50IGluc3RhbmNlVGFnOwogIFVDSEFSIGZQYXJhbWV0cmljU3RlcmVvOwogIFVDSEFSIG5DaGFubmVsc0luRWw7CiAgVUNIQVIgQ2hhbm5lbEluZGV4WzJdOwp9IFNCUl9FTEVNRU5UX0lORk87CgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZgoKdHlwZWRlZiBzdHJ1Y3QgU0JSX0VOQ09ERVIgKkhBTkRMRV9TQlJfRU5DT0RFUjsKCi8qKgogKiBcYnJpZWYgIEdldCB0aGUgbWF4IHJlcXVpcmVkIGlucHV0IGJ1ZmZlciBzaXplIGluY2x1ZGluZyBkZWxheSBiYWxhbmNpbmcgc3BhY2UKICogICAgICAgICBmb3IgTiBhdWRpbyBjaGFubmVscy4KICogXHBhcmFtIG5vQ2hhbm5lbHMgIE51bWJlciBvZiBhdWRpbyBjaGFubmVscy4KICogXHJldHVybiAgICAgICAgICAgIE1heCByZXF1aXJlZCBpbnB1dCBidWZmZXIgc2l6ZSBpbiBieXRlcy4KICovCklOVCBzYnJFbmNvZGVyX0dldEluQnVmZmVyU2l6ZShpbnQgbm9DaGFubmVscyk7CgpJTlQgc2JyRW5jb2Rlcl9PcGVuKAogICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiAgKnBoU2JyRW5jb2RlciwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBuRWxlbWVudHMsCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgIHN1cHBvcnRQUwogICAgICAgICk7CgovKioKICogXGJyaWVmICAgICAgICAgICAgICAgICBHZXQgY2xvc2VzdCB3b3JraW5nIGJpdHJhdGUgdG8gc3BlY2lmaWVkIGRlc2lyZWQKICogICAgICAgICAgICAgICAgICAgICAgICBiaXRyYXRlIGZvciBhIHNpbmdsZSBTQlIgZWxlbWVudC4KICogXHBhcmFtIGJpdFJhdGUgICAgICAgICBUaGUgZGVzaXJlZCB0YXJnZXQgYml0IHJhdGUKICogXHBhcmFtIG51bUNoYW5uZWxzICAgICBUaGUgYW1vdW50IG9mIGF1ZGlvIGNoYW5uZWxzCiAqIFxwYXJhbSBjb3JlU2FtcGxlUmF0ZSAgVGhlIHNhbXBsZSByYXRlIG9mIHRoZSBjb3JlIGNvZGVyCiAqIFxwYXJhbSBhb3QgICAgICAgICAgICAgVGhlIGN1cnJlbnQgQXVkaW8gT2JqZWN0IFR5cGUKICogXHJldHVybiAgICAgICAgICAgICAgICBDbG9zZXN0IHdvcmtpbmcgYml0IHJhdGUgdG8gYml0UmF0ZSB2YWx1ZQogKi8KVUlOVCBzYnJFbmNvZGVyX0xpbWl0Qml0UmF0ZShVSU5UIGJpdFJhdGUsIFVJTlQgbnVtQ2hhbm5lbHMsIFVJTlQgY29yZVNhbXBsZVJhdGUsIEFVRElPX09CSkVDVF9UWVBFIGFvdCk7CgoKLyoqCiAqIFxicmllZiAgICAgICAgICAgICAgICBDaGVjayB3aGV0aGVyIGRvd25zYW1wbGVkIFNCUiBzaW5nbGUgcmF0ZSBpcyBwb3NzaWJsZQogKiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBnaXZlbiBhdWRpbyBvYmplY3QgdHlwZS4KICogXHBhcmFtIGFvdCAgICAgICAgICAgIFRoZSBBdWRpbyBvYmplY3QgdHlwZS4KICogXHJldHVybiAgICAgICAgICAgICAgIDAgd2hlbiBkb3duc2FtcGxlZCBTQlIgaXMgbm90IHBvc3NpYmxlLAogKiAgICAgICAgICAgICAgICAgICAgICAgMSB3aGVuIGRvd25zYW1wbGVkIFNCUiBpcyBwb3NzaWJsZS4KICovClVJTlQgc2JyRW5jb2Rlcl9Jc1NpbmdsZVJhdGVQb3NzaWJsZShBVURJT19PQkpFQ1RfVFlQRSBhb3QpOwoKLyoqCiAqIFxicmllZiAgICAgICAgICAgICAgICAgIEluaXRpYWxpemUgU0JSIEVuY29kZXIgaW5zdGFuY2UuCiAqIFxwYXJhbSBwaFNickVuY29kZXIgICAgIFBvaW50ZXIgdG8gYSBTQlIgRW5jb2RlciBpbnN0YW5jZS4KICogXHBhcmFtIGVsSW5mbyAgICAgICAgICAgU3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIHRoZSBlbGVtZW50L2NoYW5uZWwgYXJyYW5nZW1lbnQuCiAqIFxwYXJhbSBub0VsZW1lbnRzICAgICAgIEFtb3VudCBvZiBlbGVtZW50cyBkZXNjcmliZWQgaW4gZWxJbmZvLgogKiBccGFyYW0gaW5wdXRCdWZmZXIgICAgICBQb2ludGVyIHRvIHRoZSBlbmNvZGVyIGF1ZGlvIGJ1ZmZlcgogKiBccGFyYW0gYmFuZHdpZHRoICAgICAgICBSZXR1cm5zIHRoZSBjb3JlIGF1ZGlvIGVuY29kZXIgYmFuZHdpZHRoIChvdXRwdXQpCiAqIFxwYXJhbSBidWZmZXJPZmZzZXQgICAgIFJldHVybnMgdGhlIG9mZnNldCBmb3IgdGhlIGF1ZGlvIGlucHV0IGRhdGEgaW4gb3JkZXIgdG8gZG8gZGVsYXkgYmFsYW5jaW5nLgogKiBccGFyYW0gbnVtQ2hhbm5lbHMgICAgICBJbnB1dDogRW5jb2RlciBpbnB1dCBjaGFubmVscy4gb3V0cHV0OiBjb3JlIGVuY29kZXIgY2hhbm5lbHMuCiAqIFxwYXJhbSBzYW1wbGVSYXRlICAgICAgIElucHV0OiBFbmNvZGVyIHNhbXBsZXJhdGUuIG91dHB1dCBjb3JlIGVuY29kZXIgc2FtcGxlcmF0ZS4KICogXHBhcmFtIGRvd25TYW1wbGVGYWN0b3IgSW5wdXQ6IFJlbGF0aW9uIGJldHdlZW4gU0JSIGFuZCBjb3JlIGNvZGVyIHNhbXBsaW5nIHJhdGU7CiAqIFxwYXJhbSBmcmFtZUxlbmd0aCAgICAgIElucHV0OiBFbmNvZGVyIGZyYW1lTGVuZ3RoLiBvdXRwdXQgY29yZSBlbmNvZGVyIGZyYW1lTGVuZ3RoLgogKiBccGFyYW0gYW90ICAgICAgICAgICAgICBJbnB1dDogRGVzaXJlZCBBT1QuIG91dHB1dCBBT1QgdG8gYmUgdXNlZCBhZnRlciBwYXJhbWV0ZXIgY2hlY2tpbmcuCiAqIFxwYXJhbSBkZWxheSAgICAgICAgICAgIElucHV0OiBjb3JlIGVuY29kZXIgZGVsYXkuIE91dHB1dDogdG90YWwgZGVsYXkgYmVjYXVzZSBvZiBTQlIuCiAqIFxwYXJhbSB0cmFuc2Zvcm1GYWN0b3IgIFRoZSBjb3JlIGVuY29kZXIgdHJhbnNmb3JtIGZhY3RvciAoYmxvY2tzd2l0Y2hpbmcpLgogKiBccGFyYW0gaGVhZGVyUGVyaW9kICAgICBSZXBldGl0aW9uIHJhdGUgb2YgdGhlIFNCUiBoZWFkZXI6CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoLTEpIG1lYW5zIGludGVybiBjb25maWd1cmF0aW9uLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKDEtMTApIGNvcnJlc3BvbmRzIHRvIGhlYWRlciByZXBldGl0aW9uIHJhdGUgaW4gZnJhbWVzLgogKiBccmV0dXJuICAgICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MsIGFuZCBub24temVybyBpZiBmYWlsZWQuCiAqLwpJTlQgc2JyRW5jb2Rlcl9Jbml0KAogICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiAgIGhTYnJFbmNvZGVyLAogICAgICAgIFNCUl9FTEVNRU5UX0lORk8gICAgIGVsSW5mb1soOCldLAogICAgICAgIGludCAgICAgICAgICAgICAgICAgIG5vRWxlbWVudHMsCiAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAqaW5wdXRCdWZmZXIsCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqY29yZUJhbmR3aWR0aCwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICppbnB1dEJ1ZmZlck9mZnNldCwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpudW1DaGFubmVscywKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlLAogICAgICAgIFVJTlQgICAgICAgICAgICAgICAgKmRvd25TYW1wbGVGYWN0b3IsCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqZnJhbWVMZW5ndGgsCiAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgICAgYW90LAogICAgICAgIGludCAgICAgICAgICAgICAgICAgKmRlbGF5LAogICAgICAgIGludCAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybUZhY3RvciwKICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICBoZWFkZXJQZXJpb2QsCiAgICAgICAgVUxPTkcgICAgICAgICAgICAgICAgc3RhdGVzSW5pdEZsYWcKICAgICAgICApOwoKLyoqCiAqIFxicmllZiAgICAgICAgICAgICBEbyBkZWxheSBsaW5lIGJ1ZmZlcnMgaG91c2VrZWVwaW5nLiBUbyBiZSBjYWxsZWQgYWZ0ZXIgZWFjaCBlbmNvZGVkIGF1ZGlvIGZyYW1lLgogKiBccGFyYW0gaEVudkVuYyAgICAgU0JSIEVuY29kZXIgaGFuZGxlLgogKiBccGFyYW0gdGltZUJ1ZmZlciAgUG9pbnRlciB0byB0aGUgZW5jb2RlciBhdWRpbyBidWZmZXIuCiAqIFxyZXR1cm4gICAgICAgICAgICAwIG9uIHN1Y2Nlc3MsIGFuZCBub24temVybyBpZiBmYWlsZWQuCiAqLwpJTlQgc2JyRW5jb2Rlcl9VcGRhdGVCdWZmZXJzKEhBTkRMRV9TQlJfRU5DT0RFUiBoRW52RW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKnRpbWVCdWZmZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgovKioKICogXGJyaWVmICAgICAgICAgICAgICAgQ2xvc2UgU0JSIGVuY29kZXIgaW5zdGFuY2UuCiAqIFxwYXJhbSBwaEVickVuY29kZXIgIEhhbmRsZSBvZiBTQlIgZW5jb2RlciBpbnN0YW5jZSB0byBiZSBjbG9zZWQuCiAqIFxyZXR1cm4gICAgICAgICAgICAgIHZvaWQKICovCnZvaWQgc2JyRW5jb2Rlcl9DbG9zZShIQU5ETEVfU0JSX0VOQ09ERVIgKnBoRWJyRW5jb2Rlcik7CgovKioKICogXGJyaWVmICAgICAgICAgICAgICAgRW5jb2RlIFNCUiBkYXRhIG9mIG9uZSBjb21wbGV0ZSBhdWRpbyBmcmFtZS4KICogXHBhcmFtIGhFbnZFbmNvZGVyICAgSGFuZGxlIG9mIFNCUiBlbmNvZGVyIGluc3RhbmNlLgogKiBccGFyYW0gc2FtcGxlcyAgICAgICBUaW1lIHNhbXBsZXMsIGFsd2F5cyBpbnRlcmxlYXZlZC4KICogXHBhcmFtIHRpbWVJblN0cmlkZSAgQ2hhbm5lbCBzdHJpZGUgZmFjdG9yIG9mIHNhbXBsZXMgYnVmZmVyLgogKiBccGFyYW0gc2JyRGF0YUJpdHMgICBTaXplIG9mIFNCUiBwYXlsb2FkIGluIGJpdHMuCiAqIFxwYXJhbSBzYnJEYXRhICAgICAgIFNCUiBwYXlsb2FkLgogKiBccmV0dXJuICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MsIGFuZCBub24temVybyBpZiBmYWlsZWQuCiAqLwpJTlQgc2JyRW5jb2Rlcl9FbmNvZGVGcmFtZShIQU5ETEVfU0JSX0VOQ09ERVIgIGhFbnZFbmNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICAgICAgICAgKnNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgIHNickRhdGFCaXRzWyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgc2JyRGF0YVsoOCldW01BWF9QQVlMT0FEX1NJWkVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCi8qKgogKiBcYnJpZWYgICAgICAgICAgICAgICBXcml0ZSBTQlIgaGVhZGVycyBvZiBvbmUgU0JSIGVsZW1lbnQuCiAqIFxwYXJhbSBzYnJFbmNvZGVyICAgIEhhbmRsZSBvZiB0aGUgU0JSIGVuY29kZXIgaW5zdGFuY2UuCiAqIFxwYXJhbSBoQnMgICAgICAgICAgIEhhbmRsZSBvZiBiaXQgc3RyZWFtIGhhbmRsZSB0byB3cml0ZSBTQlIgaGVhZGVyIHRvLgogKiBccGFyYW0gZWxlbWVudF9pbmRleCBJbmRleCBvZiB0aGUgU0JSIGVsZW1lbnQgd2hpY2ggaGVhZGVyIHNob3VsZCBiZSB3cml0dGVuLgogKiBccGFyYW0gZlNlbmRIZWFkZXJzICBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgU0JSIGVuY29kZXIgc2hvdWxkIHNlbmQgbW9yZSBoZWFkZXJzIGluIHRoZSBTQlIgcGF5bG9hZCBvciBub3QuCiAqIFxyZXR1cm4gICAgICAgICAgICAgIHZvaWQKICovCnZvaWQgc2JyRW5jb2Rlcl9HZXRIZWFkZXIoSEFORExFX1NCUl9FTkNPREVSICAgc2JyRW5jb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgZWxlbWVudF9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBmU2VuZEhlYWRlcnMpOwoKLyoqCiAqIFxicmllZiAgICAgICAgICAgICAgU0JSIGVuY29kZXIgYml0cmF0ZSBlc3RpbWF0aW9uLgogKiBccGFyYW0gaFNickVuY29kZXIgIFNCUiBlbmNvZGVyIGhhbmRsZS4KICogXHJldHVybiAgICAgICAgICAgICBFc3RpbWF0ZWQgYml0cmF0ZS4KICovCklOVCBzYnJFbmNvZGVyX0dldEVzdGltYXRlQml0cmF0ZShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpOwoKCi8qKgogKiBcYnJpZWYgICAgICAgICAgICAgIERlbGF5IGJldHdlZW4gaW5wdXQgZGF0YSBhbmQgZG93bnNhbXBsZWQgb3V0cHV0IGRhdGEuCiAqIFxwYXJhbSBoU2JyRW5jb2RlciAgU0JSIGVuY29kZXIgaGFuZGxlLgogKiBccmV0dXJuICAgICAgICAgICAgIERlbGF5LgogKi8KSU5UIHNickVuY29kZXJfR2V0SW5wdXREYXRhRGVsYXkoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKTsKCi8qKgogKiBcYnJpZWYgICAgICAgR2V0IGRlY29kZXIgbGlicmFyeSB2ZXJzaW9uIGluZm8uCiAqIFxwYXJhbSBpbmZvICBQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3QsIHdoZXJlIGxpYnJhcnkgaW5mbyBpcyB3cml0dGVuIHRvLgogKiBccmV0dXJuICAgICAgMCBvbiBzdWNlc3MuCiAqLwpJTlQgc2JyRW5jb2Rlcl9HZXRMaWJJbmZvKExJQl9JTkZPICppbmZvKTsKCnZvaWQgc2JyUHJpbnRSQU0odm9pZCk7Cgp2b2lkIHNiclByaW50Uk9NKHZvaWQpOwoKI2lmZGVmIF9fY3BsdXNwbHVzCiAgICAgICAgfQojZW5kaWYKCiNlbmRpZiAvKiBpZm5kZWYgX19TQlJfTUFJTl9IICovCg==