Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyAqKioqKioqKioqKioqKioqKioqKioqKgoKICAgQXV0aG9yKHMpOgogICBEZXNjcmlwdGlvbjogU0JSIGVuY29kZXIgdG9wIGxldmVsIHByb2Nlc3NpbmcgcHJvdG90eXBlCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWZuZGVmIF9fU0JSX0VOQ09ERVJfSAojZGVmaW5lIF9fU0JSX0VOQ09ERVJfSAoKI2luY2x1ZGUgImNvbW1vbl9maXguaCIKI2luY2x1ZGUgIkZES19hdWRpby5oIgoKI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKCi8qIGNvcmUgY29kZXIgaGVscGVycyAqLwojZGVmaW5lIE1BWF9UUkFOU19GQUMgICAgICAgICA4CiNkZWZpbmUgTUFYX0NPREVDX0ZSQU1FX1JBVElPIDIKI2RlZmluZSBNQVhfUEFZTE9BRF9TSVpFICAgIDI1NgoKdHlwZWRlZiBlbnVtIGNvZGVjVHlwZQp7CiAgQ09ERUNfQUFDPTAsCiAgQ09ERUNfQUFDTEQ9MSwKICBDT0RFQ19VTlNQRUNJRklFRD05OQp9IENPREVDX1RZUEU7CgoKdHlwZWRlZiBzdHJ1Y3QKewogIElOVCBiaXRSYXRlOwogIElOVCBuQ2hhbm5lbHM7CiAgSU5UIHNhbXBsZUZyZXE7CiAgSU5UIHRyYW5zRmFjOwogIElOVCBzdGFuZGFyZEJpdHJhdGU7Cn0gQ09ERUNfUEFSQU07Cgp0eXBlZGVmIGVudW0KewogIFNCUl9NT05PLAogIFNCUl9MRUZUX1JJR0hULAogIFNCUl9DT1VQTElORywKICBTQlJfU1dJVENIX0xSQwp9IFNCUl9TVEVSRU9fTU9ERTsKCi8qIGJpdHN0cmVhbSBzeW50YXggZmxhZ3MgKi8KZW51bQp7CiAgU0JSX1NZTlRBWF9MT1dfREVMQVkgPSAweDAwMDEsCiAgU0JSX1NZTlRBWF9TQ0FMQUJMRSAgPSAweDAwMDIsCiAgU0JSX1NZTlRBWF9DUkMgICAgICAgPSAweDAwMDQsCiAgU0JSX1NZTlRBWF9EUk1fQ1JDICAgPSAweDAwMDgKfTsKCnR5cGVkZWYgc3RydWN0CnsKICBDT0RFQ19UWVBFICAgICAgIGNvcmVDb2RlcjsgICAgICAgIC8qITwgTEMgb3IgRUxEICovCiAgVUlOVCAgICAgICAgICAgICBiaXRyYXRlRnJvbTsgICAgICAvKiE8IGluY2x1c2l2ZSAqLwogIFVJTlQgICAgICAgICAgICAgYml0cmF0ZVRvOyAgICAgICAgLyohPCBleGNsdXNpdmUgKi8KCiAgVUlOVCAgICAgICAgICAgICBzYW1wbGVSYXRlOyAgICAgICAvKiE8ICAgKi8KICBVQ0hBUiAgICAgICAgICAgIG51bUNoYW5uZWxzOyAgICAgIC8qITwgICAqLwoKICBVQ0hBUiAgICAgICAgICAgIHN0YXJ0RnJlcTsgICAgICAgIC8qITwgYnNfc3RhcnRfZnJlcSAqLwogIFVDSEFSICAgICAgICAgICAgc3RhcnRGcmVxU3BlZWNoOyAgLyohPCBic19zdGFydF9mcmVxIGZvciBzcGVlY2ggY29uZmlnIGZsYWcgKi8KICBVQ0hBUiAgICAgICAgICAgIHN0b3BGcmVxOyAgICAgICAgIC8qITwgYnNfc3RvcF9mcmVxICovCiAgVUNIQVIgICAgICAgICAgICBzdG9wRnJlcVNwZWVjaDsgICAvKiE8IGJzX3N0b3BfZnJlcSBmb3Igc3BlZWNoIGNvbmZpZyBmbGFnICovCgogIFVDSEFSICAgICAgICAgICAgbnVtTm9pc2VCYW5kczsgICAgLyohPCAgICovCiAgVUNIQVIgICAgICAgICAgICBub2lzZUZsb29yT2Zmc2V0OyAvKiE8ICAgKi8KICBTQ0hBUiAgICAgICAgICAgIG5vaXNlTWF4TGV2ZWw7ICAgIC8qITwgICAqLwogIFNCUl9TVEVSRU9fTU9ERSAgc3RlcmVvTW9kZTsgICAgICAgLyohPCAgICovCiAgVUNIQVIgICAgICAgICAgICBmcmVxU2NhbGU7ICAgICAgICAvKiE8ICAgKi8KfSBzYnJUdW5pbmdUYWJsZV90OwoKdHlwZWRlZiBzdHJ1Y3Qgc2JyQ29uZmlndXJhdGlvbgp7CiAgLyoKICAgICBjb3JlIGNvZGVyIGRlcGVuZGVudCBjb25maWd1cmF0aW9ucwogICovCiAgQ09ERUNfUEFSQU0gY29kZWNTZXR0aW5nczsgIC8qITwgQ29yZSBjb2RlciBzZXR0aW5ncy4gVG8gYmUgc2V0IGZyb20gY29yZSBjb2Rlci4gKi8KICBJTlQgU2VuZEhlYWRlckRhdGFUaW1lOyAgICAgLyohPCBTQlIgaGVhZGVyIHNlbmQgdXBkYXRlIGZyZXF1ZW5jeSBpbiBtcy4gKi8KICBJTlQgdXNlV2F2ZUNvZGluZzsgICAgICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiB3YXZlY29kaW5nIHRvb2wuICovCiAgSU5UIGNyY1NicjsgICAgICAgICAgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2YgU0JSLUNSQy4gKi8KICBJTlQgZHluQndTdXBwb3J0ZWQ7ICAgICAgICAgLyohPCBGbGFnOiBzdXBwb3J0IGZvciBkeW5hbWljIGJhbmR3aWR0aCBpbiB0aGlzIGNvbWJpbmF0aW9uLiAqLwogIElOVCBwYXJhbWV0cmljQ29kaW5nOyAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIHBhcmFtZXRyaWMgY29kaW5nIHRvb2wuICovCiAgSU5UIGRvd25TYW1wbGVGYWN0b3I7ICAgICAgIC8qITwgU2FtcGxpbmcgcmF0ZSByZWxhdGlvbiBiZXR3ZWVuIHRoZSBTQlIgYW5kIHRoZSBjb3JlIGVuY29kZXIuICovCiAgaW50IGZyZXFfcmVzX2ZpeGZpeFszXTsgICAgIC8qITwgRnJlcXVlbmN5IHJlc29sdXRpb24gb2YgZW52ZWxvcGVzIGluIGZyYW1lIGNsYXNzIEZJWEZJWAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPTEgRW52OyAxPTIgRW52OyAyPTQgRW52OyAqLwogIC8qCiAgICAgY29yZSBjb2RlciBkZXBlbmRlbnQgdHVuaW5nIHBhcmFtZXRlcnMKICAqLwogIElOVCB0cmFuX3RocjsgICAgICAgICAgICAgLyohPCBTQlIgdHJhbnNpZW50IGRldGVjdG9yIHRocmVzaG9sZCAoKiAxMDApLiAqLwogIElOVCBub2lzZUZsb29yT2Zmc2V0OyAgICAgLyohPCBOb2lzZSBmbG9vciBvZmZzZXQuICAgICAgKi8KICBVSU5UIHVzZVNwZWVjaENvbmZpZzsgICAgIC8qITwgRmxhZzogYWRhcHQgdHVuaW5nIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHNwZWVjaC4gKi8KCgoKICAvKgogICAgIGNvcmUgY29kZXIgaW5kZXBlbmRlbnQgY29uZmlndXJhdGlvbnMKICAqLwogIElOVCBzYnJGcmFtZVNpemU7ICAgICAgICAgICAvKiE8IFNCUiBmcmFtZSBzaXplIGluIHNhbXBsZXMuIFdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIGNvcmUgY29kZXIgc2V0dGluZ3MuICovCiAgSU5UIHNicl9kYXRhX2V4dHJhOyAgICAgICAgIC8qITwgRmxhZyB1c2FnZSBvZiBkYXRhIGV4dHJhLiAqLwogIElOVCBhbXBfcmVzOyAgICAgICAgICAgICAgICAvKiE8IEFtcGxpdHVkZSByZXNvbHV0aW9uLiAqLwogIElOVCBhbmFfbWF4X2xldmVsOyAgICAgICAgICAvKiE8IE5vaXNlIGluc2VydGlvbiBtYXhpbXVtIGxldmVsLiAqLwogIElOVCB0cmFuX2ZjOyAgICAgICAgICAgICAgICAvKiE8IFRyYW5zaWVudCBkZXRlY3RvciBzdGFydCBmcmVxdWVuY3kuICovCiAgSU5UIHRyYW5fZGV0X21vZGU7ICAgICAgICAgIC8qITwgVHJhbnNpZW50IGRldGVjdG9yIG1vZGUuICovCiAgSU5UIHNwcmVhZDsgICAgICAgICAgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2YgU0JSIHNwcmVhZC4gKi8KICBJTlQgc3RhdDsgICAgICAgICAgICAgICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiBzdGF0aWMgZnJhbWluZy4gKi8KICBJTlQgZTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZW52ZWxvcGVzIHdoZW4gc3RhdGljIGZyYW1pbmcgaXMgY2hvc2VuLiAqLwogIFNCUl9TVEVSRU9fTU9ERSBzdGVyZW9Nb2RlOyAvKiE8IFNCUiBzdGVyZW8gbW9kZS4gKi8KICBJTlQgZGVsdGFUQWNyb3NzRnJhbWVzOyAgICAgLyohPCBGbGFnOiBhbGxvdyB0aW1lLWRlbHRhIGNvZGluZy4gKi8KICBGSVhQX0RCTCBkRl9lZGdlXzFzdEVudjsgICAgLyohPCBFeHRyYSBmcmFjdGlvbiBkZWx0YS1GIGNvZGluZyBpcyBhbGxvd2VkIHRvIGJlIG1vcmUgZXhwZW5zaXZlLiAqLwogIEZJWFBfREJMIGRGX2VkZ2VfaW5jcjsgICAgICAvKiE8IEluY3JlbWVudCBkRl9lZGdlXzFzdEVudiB0aGlzIG11Y2ggaWYgZFQtY29kaW5nIHdhcyB1c2VkIHRoaXMgZnJhbWUuICovCiAgSU5UIHNicl9pbnZmX21vZGU7ICAgICAgICAgIC8qITwgSW52ZXJzZSBmaWx0ZXJpbmcgbW9kZS4gKi8KICBJTlQgc2JyX3hwb3NfbW9kZTsgICAgICAgICAgLyohPCBUcmFuc3Bvc2VyIG1vZGUuICovCiAgSU5UIHNicl94cG9zX2N0cmw7ICAgICAgICAgIC8qITwgVHJhbnNwb3NlciBjb250cm9sLiAqLwogIElOVCBzYnJfeHBvc19sZXZlbDsgICAgICAgICAvKiE8IFRyYW5zcG9zZXIgM3JkIG9yZGVyIGxldmVsLiAqLwogIElOVCBzdGFydEZyZXE7ICAgICAgICAgICAgICAvKiE8IFRoZSBzdGFydCBmcmVxdWVuY3kgdGFibGUgaW5kZXguICovCiAgSU5UIHN0b3BGcmVxOyAgICAgICAgICAgICAgIC8qITwgVGhlIHN0b3AgZnJlcXVlbmN5IHRhYmxlIGluZGV4LiAqLwogIElOVCB1c2VTYVBhbjsgICAgICAgICAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIFNBUEFOIHN0ZXJlby4gKi8KICBJTlQgZHluQndFbmFibGVkOyAgICAgICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiBkeW5hbWljIGJhbmR3aWR0aC4gKi8KICBJTlQgYlBhcmFtZXRyaWNTdGVyZW87ICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiBwYXJhbWV0cmljIHN0ZXJlbyBjb2RpbmcgdG9vbC4gKi8KCiAgLyoKICAgICBoZWFkZXJfZXh0cmExIGNvbmZpZ3VyYXRpb24KICAqLwogIFVDSEFSIGZyZXFTY2FsZTsgICAgICAgICAgICAvKiE8IEZyZXF1ZW5jeSBncm91cGluZy4gKi8KICBJTlQgYWx0ZXJTY2FsZTsgICAgICAgICAgICAgLyohPCBTY2FsZSByZXNvbHV0aW9uLiAqLwogIElOVCBzYnJfbm9pc2VfYmFuZHM7ICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcy4gKi8KCgogIC8qCiAgICAgaGVhZGVyX2V4dHJhMiBjb25maWd1cmF0aW9uCiAgKi8KICBJTlQgc2JyX2xpbWl0ZXJfYmFuZHM7ICAgICAgLyohPCBOdW1iZXIgb2YgbGltaXRlciBiYW5kcy4gKi8KICBJTlQgc2JyX2xpbWl0ZXJfZ2FpbnM7ICAgICAgLyohPCBHYWluIG9mIGxpbWl0ZXIuICovCiAgSU5UIHNicl9pbnRlcnBvbF9mcmVxOyAgICAgIC8qITwgRmxhZzogdXNlIGludGVycG9sYXRpb24gaW4gZnJlcS4gZGlyZWN0aW9uLiAqLwogIElOVCBzYnJfc21vb3RoaW5nX2xlbmd0aDsgICAvKiE8IEZsYWc6IGNob29zZSBsZW5ndGggNCBvciAwICg9b24sIG9mZikuICovCiAgVUNIQVIgaW5pdF9hbXBfcmVzX0ZGOwp9IHNickNvbmZpZ3VyYXRpb24sICpzYnJDb25maWd1cmF0aW9uUHRyIDsKCnR5cGVkZWYgc3RydWN0IFNCUl9DT05GSUdfREFUQQp7CiAgVUlOVCBzYnJTeW50YXhGbGFnczsgICAgICAgICAgICAgICAgICAvKio8IFNCUiBzeW50YXggZmxhZ3MgZGVyaXZlZCBmcm9tIEFPVC4gKi8KICBJTlQgbkNoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzLiAgKi8KCiAgSU5UIG5TZmJbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBTQlIgc2NhbGVmYWN0b3IgYmFuZHMgZm9yIExPX1JFUyBhbmQgSElfUkVTICg/KSAqLwogIElOVCBudW1fTWFzdGVyOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdl9rX21hc3Rlci4gKi8KICBJTlQgc2FtcGxlRnJlcTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU0JSIHNhbXBsaW5nIGZyZXF1ZW5jeS4gKi8KICBJTlQgZnJhbWVTaXplOwogIElOVCB4T3ZlckZyZXE7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgU0JSIHN0YXJ0IGZyZXF1ZW5jeS4gKi8KICBJTlQgZHluWE92ZXJGcmVxOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXNlZCBjcm9zc292ZXIgZnJlcXVlbmN5IHdoZW4gZHluYW1pYyBiYW5kd2lkdGggaXMgZW5hYmxlZC4gKi8KICBJTlQgbm9RbWZCYW5kczsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFFNRiBmcmVxdWVuY3kgYmFuZHMuICovCiAgSU5UIG5vUW1mU2xvdHM7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBRTUYgc2xvdHMuICovCgogIFVDSEFSICpmcmVxQmFuZFRhYmxlWzJdOyAgICAgICAgICAgICAgLyoqPCBGcmVxdWVuY3kgdGFibGUgZm9yIGxvdyBhbmQgaGlyZXMsIG9ubHkgTUFYX0ZSRVFfQ09FRkZTLzIgKzEgY29lZWZzIGFjdHVhbGx5IG5lZWRlZCBmb3IgbG93cmVzLiAqLwogIFVDSEFSICp2X2tfbWFzdGVyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXN0ZXIgQmFuZFRhYmxlIHdoZXJlIGZyZXFCYW5kVGFibGUgaXMgZGVyaXZlZCBmcm9tLiAqLwoKCiAgU0JSX1NURVJFT19NT0RFIHN0ZXJlb01vZGU7CiAgSU5UIG5vRW52Q2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnZlbG9wZSBjaGFubmVscy4gKi8KCiAgSU5UIHVzZVdhdmVDb2Rpbmc7ICAgICAgICAgICAgICAgICAgICAvKio8IEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHdhdmUgY29kaW5nIGF0IGFsbC4gICAgICAqLwogIElOVCB1c2VQYXJhbWV0cmljQ29kaW5nOyAgICAgICAgICAgICAgLyoqPCBGbGFnIGluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSBwYXJhIGNvZGluZyBhdCBhbGwuICAgICAgKi8KICBJTlQgeHBvc0N0cmxTd2l0Y2g7ICAgICAgICAgICAgICAgICAgIC8qKjwgRmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0byBzd2l0Y2ggeHBvcyBjdHJsIG9uIHRoZSBmbHkuICovCiAgSU5UIHN3aXRjaFRyYW5zcG9zZXJzOyAgICAgICAgICAgICAgICAvKio8IEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc3dpdGNoIHhwb3Mgb24gdGhlIGZseSAuICAgICAqLwogIFVDSEFSIGluaXRBbXBSZXNGRjsKfSBTQlJfQ09ORklHX0RBVEEsICpIQU5ETEVfU0JSX0NPTkZJR19EQVRBOwoKdHlwZWRlZiBzdHJ1Y3QgewogIE1QNF9FTEVNRU5UX0lEIGVsVHlwZTsKICBJTlQgYml0UmF0ZTsKICBpbnQgaW5zdGFuY2VUYWc7CiAgVUNIQVIgZlBhcmFtZXRyaWNTdGVyZW87CiAgVUNIQVIgbkNoYW5uZWxzSW5FbDsKICBVQ0hBUiBDaGFubmVsSW5kZXhbMl07Cn0gU0JSX0VMRU1FTlRfSU5GTzsKCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHsKI2VuZGlmCgp0eXBlZGVmIHN0cnVjdCBTQlJfRU5DT0RFUiAqSEFORExFX1NCUl9FTkNPREVSOwoKLyoqCiAqIFxicmllZiAgR2V0IHRoZSBtYXggcmVxdWlyZWQgaW5wdXQgYnVmZmVyIHNpemUgaW5jbHVkaW5nIGRlbGF5IGJhbGFuY2luZyBzcGFjZQogKiAgICAgICAgIGZvciBOIGF1ZGlvIGNoYW5uZWxzLgogKiBccGFyYW0gbm9DaGFubmVscyAgTnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLgogKiBccmV0dXJuICAgICAgICAgICAgTWF4IHJlcXVpcmVkIGlucHV0IGJ1ZmZlciBzaXplIGluIGJ5dGVzLgogKi8KSU5UIHNickVuY29kZXJfR2V0SW5CdWZmZXJTaXplKGludCBub0NoYW5uZWxzKTsKCklOVCBzYnJFbmNvZGVyX09wZW4oCiAgICAgICAgSEFORExFX1NCUl9FTkNPREVSICAqcGhTYnJFbmNvZGVyLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgIG5FbGVtZW50cywKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgc3VwcG9ydFBTCiAgICAgICAgKTsKCi8qKgogKiBcYnJpZWYgICAgICAgICAgICAgICAgIEdldCBjbG9zZXN0IHdvcmtpbmcgYml0cmF0ZSB0byBzcGVjaWZpZWQgZGVzaXJlZAogKiAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGUgZm9yIGEgc2luZ2xlIFNCUiBlbGVtZW50LgogKiBccGFyYW0gYml0UmF0ZSAgICAgICAgIFRoZSBkZXNpcmVkIHRhcmdldCBiaXQgcmF0ZQogKiBccGFyYW0gbnVtQ2hhbm5lbHMgICAgIFRoZSBhbW91bnQgb2YgYXVkaW8gY2hhbm5lbHMKICogXHBhcmFtIGNvcmVTYW1wbGVSYXRlICBUaGUgc2FtcGxlIHJhdGUgb2YgdGhlIGNvcmUgY29kZXIKICogXHBhcmFtIGFvdCAgICAgICAgICAgICBUaGUgY3VycmVudCBBdWRpbyBPYmplY3QgVHlwZQogKiBccmV0dXJuICAgICAgICAgICAgICAgIENsb3Nlc3Qgd29ya2luZyBiaXQgcmF0ZSB0byBiaXRSYXRlIHZhbHVlCiAqLwpVSU5UIHNickVuY29kZXJfTGltaXRCaXRSYXRlKFVJTlQgYml0UmF0ZSwgVUlOVCBudW1DaGFubmVscywgVUlOVCBjb3JlU2FtcGxlUmF0ZSwgQVVESU9fT0JKRUNUX1RZUEUgYW90KTsKCgovKioKICogXGJyaWVmICAgICAgICAgICAgICAgIENoZWNrIHdoZXRoZXIgZG93bnNhbXBsZWQgU0JSIHNpbmdsZSByYXRlIGlzIHBvc3NpYmxlCiAqICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGdpdmVuIGF1ZGlvIG9iamVjdCB0eXBlLgogKiBccGFyYW0gYW90ICAgICAgICAgICAgVGhlIEF1ZGlvIG9iamVjdCB0eXBlLgogKiBccmV0dXJuICAgICAgICAgICAgICAgMCB3aGVuIGRvd25zYW1wbGVkIFNCUiBpcyBub3QgcG9zc2libGUsCiAqICAgICAgICAgICAgICAgICAgICAgICAxIHdoZW4gZG93bnNhbXBsZWQgU0JSIGlzIHBvc3NpYmxlLgogKi8KVUlOVCBzYnJFbmNvZGVyX0lzU2luZ2xlUmF0ZVBvc3NpYmxlKEFVRElPX09CSkVDVF9UWVBFIGFvdCk7CgovKioKICogXGJyaWVmICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6ZSBTQlIgRW5jb2RlciBpbnN0YW5jZS4KICogXHBhcmFtIHBoU2JyRW5jb2RlciAgICAgUG9pbnRlciB0byBhIFNCUiBFbmNvZGVyIGluc3RhbmNlLgogKiBccGFyYW0gZWxJbmZvICAgICAgICAgICBTdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZXMgdGhlIGVsZW1lbnQvY2hhbm5lbCBhcnJhbmdlbWVudC4KICogXHBhcmFtIG5vRWxlbWVudHMgICAgICAgQW1vdW50IG9mIGVsZW1lbnRzIGRlc2NyaWJlZCBpbiBlbEluZm8uCiAqIFxwYXJhbSBpbnB1dEJ1ZmZlciAgICAgIFBvaW50ZXIgdG8gdGhlIGVuY29kZXIgYXVkaW8gYnVmZmVyCiAqIFxwYXJhbSBiYW5kd2lkdGggICAgICAgIFJldHVybnMgdGhlIGNvcmUgYXVkaW8gZW5jb2RlciBiYW5kd2lkdGggKG91dHB1dCkKICogXHBhcmFtIGJ1ZmZlck9mZnNldCAgICAgUmV0dXJucyB0aGUgb2Zmc2V0IGZvciB0aGUgYXVkaW8gaW5wdXQgZGF0YSBpbiBvcmRlciB0byBkbyBkZWxheSBiYWxhbmNpbmcuCiAqIFxwYXJhbSBudW1DaGFubmVscyAgICAgIElucHV0OiBFbmNvZGVyIGlucHV0IGNoYW5uZWxzLiBvdXRwdXQ6IGNvcmUgZW5jb2RlciBjaGFubmVscy4KICogXHBhcmFtIHNhbXBsZVJhdGUgICAgICAgSW5wdXQ6IEVuY29kZXIgc2FtcGxlcmF0ZS4gb3V0cHV0IGNvcmUgZW5jb2RlciBzYW1wbGVyYXRlLgogKiBccGFyYW0gZG93blNhbXBsZUZhY3RvciBJbnB1dDogUmVsYXRpb24gYmV0d2VlbiBTQlIgYW5kIGNvcmUgY29kZXIgc2FtcGxpbmcgcmF0ZTsKICogXHBhcmFtIGZyYW1lTGVuZ3RoICAgICAgSW5wdXQ6IEVuY29kZXIgZnJhbWVMZW5ndGguIG91dHB1dCBjb3JlIGVuY29kZXIgZnJhbWVMZW5ndGguCiAqIFxwYXJhbSBhb3QgICAgICAgICAgICAgIElucHV0OiBEZXNpcmVkIEFPVC4gb3V0cHV0IEFPVCB0byBiZSB1c2VkIGFmdGVyIHBhcmFtZXRlciBjaGVja2luZy4KICogXHBhcmFtIGRlbGF5ICAgICAgICAgICAgSW5wdXQ6IGNvcmUgZW5jb2RlciBkZWxheS4gT3V0cHV0OiB0b3RhbCBkZWxheSBiZWNhdXNlIG9mIFNCUi4KICogXHBhcmFtIHRyYW5zZm9ybUZhY3RvciAgVGhlIGNvcmUgZW5jb2RlciB0cmFuc2Zvcm0gZmFjdG9yIChibG9ja3N3aXRjaGluZykuCiAqIFxwYXJhbSBoZWFkZXJQZXJpb2QgICAgIFJlcGV0aXRpb24gcmF0ZSBvZiB0aGUgU0JSIGhlYWRlcjoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAtICgtMSkgbWVhbnMgaW50ZXJuIGNvbmZpZ3VyYXRpb24uCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoMS0xMCkgY29ycmVzcG9uZHMgdG8gaGVhZGVyIHJlcGV0aXRpb24gcmF0ZSBpbiBmcmFtZXMuCiAqIFxyZXR1cm4gICAgICAgICAgICAgICAgIDAgb24gc3VjY2VzcywgYW5kIG5vbi16ZXJvIGlmIGZhaWxlZC4KICovCklOVCBzYnJFbmNvZGVyX0luaXQoCiAgICAgICAgSEFORExFX1NCUl9FTkNPREVSICAgaFNickVuY29kZXIsCiAgICAgICAgU0JSX0VMRU1FTlRfSU5GTyAgICAgZWxJbmZvWyg4KV0sCiAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbm9FbGVtZW50cywKICAgICAgICBJTlRfUENNICAgICAgICAgICAgICppbnB1dEJ1ZmZlciwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpjb3JlQmFuZHdpZHRoLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgKmlucHV0QnVmZmVyT2Zmc2V0LAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgKm51bUNoYW5uZWxzLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUsCiAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAqZG93blNhbXBsZUZhY3RvciwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpmcmFtZUxlbmd0aCwKICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgICBhb3QsCiAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqZGVsYXksCiAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtRmFjdG9yLAogICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGhlYWRlclBlcmlvZCwKICAgICAgICBVTE9ORyAgICAgICAgICAgICAgICBzdGF0ZXNJbml0RmxhZwogICAgICAgICk7CgovKioKICogXGJyaWVmICAgICAgICAgICAgIERvIGRlbGF5IGxpbmUgYnVmZmVycyBob3VzZWtlZXBpbmcuIFRvIGJlIGNhbGxlZCBhZnRlciBlYWNoIGVuY29kZWQgYXVkaW8gZnJhbWUuCiAqIFxwYXJhbSBoRW52RW5jICAgICBTQlIgRW5jb2RlciBoYW5kbGUuCiAqIFxwYXJhbSB0aW1lQnVmZmVyICBQb2ludGVyIHRvIHRoZSBlbmNvZGVyIGF1ZGlvIGJ1ZmZlci4KICogXHJldHVybiAgICAgICAgICAgIDAgb24gc3VjY2VzcywgYW5kIG5vbi16ZXJvIGlmIGZhaWxlZC4KICovCklOVCBzYnJFbmNvZGVyX1VwZGF0ZUJ1ZmZlcnMoSEFORExFX1NCUl9FTkNPREVSIGhFbnZFbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqdGltZUJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCi8qKgogKiBcYnJpZWYgICAgICAgICAgICAgICBDbG9zZSBTQlIgZW5jb2RlciBpbnN0YW5jZS4KICogXHBhcmFtIHBoRWJyRW5jb2RlciAgSGFuZGxlIG9mIFNCUiBlbmNvZGVyIGluc3RhbmNlIHRvIGJlIGNsb3NlZC4KICogXHJldHVybiAgICAgICAgICAgICAgdm9pZAogKi8Kdm9pZCBzYnJFbmNvZGVyX0Nsb3NlKEhBTkRMRV9TQlJfRU5DT0RFUiAqcGhFYnJFbmNvZGVyKTsKCi8qKgogKiBcYnJpZWYgICAgICAgICAgICAgICBFbmNvZGUgU0JSIGRhdGEgb2Ygb25lIGNvbXBsZXRlIGF1ZGlvIGZyYW1lLgogKiBccGFyYW0gaEVudkVuY29kZXIgICBIYW5kbGUgb2YgU0JSIGVuY29kZXIgaW5zdGFuY2UuCiAqIFxwYXJhbSBzYW1wbGVzICAgICAgIFRpbWUgc2FtcGxlcywgYWx3YXlzIGludGVybGVhdmVkLgogKiBccGFyYW0gdGltZUluU3RyaWRlICBDaGFubmVsIHN0cmlkZSBmYWN0b3Igb2Ygc2FtcGxlcyBidWZmZXIuCiAqIFxwYXJhbSBzYnJEYXRhQml0cyAgIFNpemUgb2YgU0JSIHBheWxvYWQgaW4gYml0cy4KICogXHBhcmFtIHNickRhdGEgICAgICAgU0JSIHBheWxvYWQuCiAqIFxyZXR1cm4gICAgICAgICAgICAgIDAgb24gc3VjY2VzcywgYW5kIG5vbi16ZXJvIGlmIGZhaWxlZC4KICovCklOVCBzYnJFbmNvZGVyX0VuY29kZUZyYW1lKEhBTkRMRV9TQlJfRU5DT0RFUiAgaEVudkVuY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAgICAqc2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgc2JyRGF0YUJpdHNbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICBzYnJEYXRhWyg4KV1bTUFYX1BBWUxPQURfU0laRV0KICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKLyoqCiAqIFxicmllZiAgICAgICAgICAgICAgIFdyaXRlIFNCUiBoZWFkZXJzIG9mIG9uZSBTQlIgZWxlbWVudC4KICogXHBhcmFtIHNickVuY29kZXIgICAgSGFuZGxlIG9mIHRoZSBTQlIgZW5jb2RlciBpbnN0YW5jZS4KICogXHBhcmFtIGhCcyAgICAgICAgICAgSGFuZGxlIG9mIGJpdCBzdHJlYW0gaGFuZGxlIHRvIHdyaXRlIFNCUiBoZWFkZXIgdG8uCiAqIFxwYXJhbSBlbGVtZW50X2luZGV4IEluZGV4IG9mIHRoZSBTQlIgZWxlbWVudCB3aGljaCBoZWFkZXIgc2hvdWxkIGJlIHdyaXR0ZW4uCiAqIFxwYXJhbSBmU2VuZEhlYWRlcnMgIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBTQlIgZW5jb2RlciBzaG91bGQgc2VuZCBtb3JlIGhlYWRlcnMgaW4gdGhlIFNCUiBwYXlsb2FkIG9yIG5vdC4KICogXHJldHVybiAgICAgICAgICAgICAgdm9pZAogKi8Kdm9pZCBzYnJFbmNvZGVyX0dldEhlYWRlcihIQU5ETEVfU0JSX0VOQ09ERVIgICBzYnJFbmNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICBlbGVtZW50X2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGZTZW5kSGVhZGVycyk7CgovKioKICogXGJyaWVmICAgICAgICAgICAgICBTQlIgZW5jb2RlciBiaXRyYXRlIGVzdGltYXRpb24uCiAqIFxwYXJhbSBoU2JyRW5jb2RlciAgU0JSIGVuY29kZXIgaGFuZGxlLgogKiBccmV0dXJuICAgICAgICAgICAgIEVzdGltYXRlZCBiaXRyYXRlLgogKi8KSU5UIHNickVuY29kZXJfR2V0RXN0aW1hdGVCaXRyYXRlKEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2Rlcik7CgoKLyoqCiAqIFxicmllZiAgICAgICAgICAgICAgRGVsYXkgYmV0d2VlbiBpbnB1dCBkYXRhIGFuZCBkb3duc2FtcGxlZCBvdXRwdXQgZGF0YS4KICogXHBhcmFtIGhTYnJFbmNvZGVyICBTQlIgZW5jb2RlciBoYW5kbGUuCiAqIFxyZXR1cm4gICAgICAgICAgICAgRGVsYXkuCiAqLwpJTlQgc2JyRW5jb2Rlcl9HZXRJbnB1dERhdGFEZWxheShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpOwoKLyoqCiAqIFxicmllZiAgICAgICBHZXQgZGVjb2RlciBsaWJyYXJ5IHZlcnNpb24gaW5mby4KICogXHBhcmFtIGluZm8gIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdCwgd2hlcmUgbGlicmFyeSBpbmZvIGlzIHdyaXR0ZW4gdG8uCiAqIFxyZXR1cm4gICAgICAwIG9uIHN1Y2Vzcy4KICovCklOVCBzYnJFbmNvZGVyX0dldExpYkluZm8oTElCX0lORk8gKmluZm8pOwoKdm9pZCBzYnJQcmludFJBTSh2b2lkKTsKCnZvaWQgc2JyUHJpbnRST00odm9pZCk7CgojaWZkZWYgX19jcGx1c3BsdXMKICAgICAgICB9CiNlbmRpZgoKI2VuZGlmIC8qIGlmbmRlZiBfX1NCUl9NQUlOX0ggKi8K