Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBFcmljIEFsbGFtYW5jaGUKICAgRGVzY3JpcHRpb246IGEgcnVkaW1lbnRhcnkgd2F2IGZpbGUgaW50ZXJmYWNlCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKCiNpbmNsdWRlICJ3YXZfZmlsZS5oIgojaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKCgpzdGF0aWMgSU5UX1BDTSB1bGF3MnBjbSAoVUNIQVIgdWxhd2J5dGUpOwoKLyohCiAqCiAqICBcYnJpZWYgUmVhZCBoZWFkZXIgZnJvbSBhIFdBVkVmaWxlLiBIb3N0IGVuZGlhbmVzcyBpcyBoYW5kbGVkIGFjY29yZGluZ2x5LgogKiAgXHdhdi0+ZnAgZmlsZXBvaW50ZXIgb2YgdHlwZSBGSUxFKi4KICogIFx3YXZpbmZvIFNXYXZJbmZvIHN0cnVjdCB3aGVyZSB0aGUgZGVjb2RlZCBoZWFkZXIgaW5mbyBpcyBzdG9yZWQgaW50by4KICogIFxyZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCBub24temVybyBvbiBmYWlsdXJlLgogKgogKi8KSU5UIFdBVl9JbnB1dE9wZW4gKEhBTkRMRV9XQVYgKnBXYXYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQp7CiAgICBIQU5ETEVfV0FWIHdhdiA9IChIQU5ETEVfV0FWKUZES2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IFdBVikpOwogICAgSU5UIG9mZnNldDsKCiAgICBpZiAod2F2ID09IE5VTEwpIHsKICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IFVuYWJsZSB0byBhbGxvY2F0ZSBXQVYgc3RydWN0LlxuIik7CiAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgd2F2LT5mcCA9IEZES2ZvcGVuKGZpbGVuYW1lLCAicmIiKTsKICAgIGlmICh3YXYtPmZwID09IE5VTEwpIHsKICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IFVuYWJsZSB0byBvcGVuIHdhdiBmaWxlLiAlc1xuIiwgZmlsZW5hbWUpOwogICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIC8qIHJlYWQgUklGRi1jaHVuayAqLwogICAgaWYgKEZES2ZyZWFkKCYod2F2LT5oZWFkZXIucmlmZlR5cGUpLCAxLCA0LCB3YXYtPmZwKSAhPSA0KSB7CiAgICAgIEZES3ByaW50ZkVycigiV0FWX0lucHV0T3BlbigpOiBjb3VsZG4ndCByZWFkIFJJRkZfSURcbiIpOwogICAgICBnb3RvIGVycm9yOyAgLyogYmFkIGVycm9yICJjb3VsZG4ndCByZWFkIFJJRkZfSUQiICovCiAgICB9CiAgICBpZiAoRkRLc3RybmNtcCgiUklGRiIsIHdhdi0+aGVhZGVyLnJpZmZUeXBlLCA0KSkgewogICAgICBGREtwcmludGZFcnIoIldBVl9JbnB1dE9wZW4oKTogUklGRiBkZXNjcmlwdG9yIG5vdCBmb3VuZC5cbiIpIDsKICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICAvKiBSZWFkIFJJRkYgc2l6ZS4gSWdub3JlZC4gKi8KICAgIEZES2ZyZWFkX0VMKCYod2F2LT5oZWFkZXIucmlmZlNpemUpLCA0LCAxLCB3YXYtPmZwKTsKCiAgICAvKiByZWFkIFdBVkUtY2h1bmsgKi8KICAgIGlmIChGREtmcmVhZCgmd2F2LT5oZWFkZXIud2F2ZVR5cGUsIDEsIDQsIHdhdi0+ZnApICE9NCkgewogICAgICBGREtwcmludGZFcnIoIldBVl9JbnB1dE9wZW4oKTogY291bGRuJ3QgcmVhZCBmb3JtYXRcbiIpOwogICAgICBnb3RvIGVycm9yOyAgLyogYmFkIGVycm9yICJjb3VsZG4ndCByZWFkIGZvcm1hdCIgKi8KICAgIH0KICAgIGlmIChGREtzdHJuY21wKCJXQVZFIiwgd2F2LT5oZWFkZXIud2F2ZVR5cGUsIDQpKSB7CiAgICAgIEZES3ByaW50ZkVycigiV0FWX0lucHV0T3BlbigpOiBXQVZFIGNodW5rIElEIG5vdCBmb3VuZC5cbiIpIDsKICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICAvKiByZWFkIGZvcm1hdC1jaHVuayAqLwogICAgaWYgKEZES2ZyZWFkKCYod2F2LT5oZWFkZXIuZm9ybWF0VHlwZSksIDEsIDQsIHdhdi0+ZnApICE9IDQpIHsKICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IGNvdWxkbid0IHJlYWQgZm9ybWF0X0lEXG4iKTsKICAgICAgZ290byBlcnJvcjsgIC8qIGJhZCBlcnJvciAiY291bGRuJ3QgcmVhZCBmb3JtYXRfSUQiICovCiAgICB9CiAgICBpZiAoRkRLc3RybmNtcCgiZm10Iiwgd2F2LT5oZWFkZXIuZm9ybWF0VHlwZSwgMykpIHsKICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IGZtdCBjaHVuayBmb3JtYXQgbm90IGZvdW5kLlxuIikgOwogICAgIGdvdG8gZXJyb3I7CiAgICB9CgoKICAgIEZES2ZyZWFkX0VMKCZ3YXYtPmhlYWRlci5mb3JtYXRTaXplLCA0LCAxLCB3YXYtPmZwKTsgICAvKiBzaG91bGQgYmUgMTYgZm9yIFBDTS1mb3JtYXQgKHVuY29tcHJlc3NlZCkgKi8KCgogICAgLyogcmVhZCAgaW5mbyAqLwogICAgRkRLZnJlYWRfRUwoJih3YXYtPmhlYWRlci5jb21wcmVzc2lvbkNvZGUpLCAyLCAxLCB3YXYtPmZwKTsKICAgIEZES2ZyZWFkX0VMKCYod2F2LT5oZWFkZXIubnVtQ2hhbm5lbHMpLCAyLCAxLCB3YXYtPmZwKTsKICAgIEZES2ZyZWFkX0VMKCYod2F2LT5oZWFkZXIuc2FtcGxlUmF0ZSksIDQsIDEsIHdhdi0+ZnApOwogICAgRkRLZnJlYWRfRUwoJih3YXYtPmhlYWRlci5ieXRlc1BlclNlY29uZCksIDQsIDEsIHdhdi0+ZnApOwogICAgRkRLZnJlYWRfRUwoJih3YXYtPmhlYWRlci5ibG9ja0FsaWduKSwgMiwgMSwgd2F2LT5mcCk7CiAgICBGREtmcmVhZF9FTCgmKHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUpLCAyLCAxLCB3YXYtPmZwKTsKCiAgICBvZmZzZXQgPSB3YXYtPmhlYWRlci5mb3JtYXRTaXplIC0gMTY7CgogICAgLyogV2F2ZSBmb3JtYXQgZXh0ZW5zaWJsZSAqLwogICAgaWYgKHdhdi0+aGVhZGVyLmNvbXByZXNzaW9uQ29kZSA9PSAweEZGRkUpIHsKICAgICAgc3RhdGljIGNvbnN0IFVDSEFSIGd1aWRQQ01bMTZdID0gewogICAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwKICAgICAgICAgIDB4ODAsIDB4MDAsIDB4MDAsIDB4YWEsIDB4MDAsIDB4MzgsIDB4OWIsIDB4NzEKICAgICAgfTsKICAgICAgVVNIT1JUIGV4dHJhRm9ybWF0Qnl0ZXMsIHZhbGlkQml0c1BlclNhbXBsZTsKICAgICAgVUNIQVIgZ3VpZFsxNl07CiAgICAgIElOVCBpOwoKICAgICAgLyogcmVhZCBleHRyYSBieXRlcyAqLwogICAgICBGREtmcmVhZF9FTCgmKGV4dHJhRm9ybWF0Qnl0ZXMpLCAyLCAxLCB3YXYtPmZwKTsKICAgICAgb2Zmc2V0IC09IDI7CgogICAgICBpZiAoZXh0cmFGb3JtYXRCeXRlcyA+PSAyMikgewogICAgICAgIEZES2ZyZWFkX0VMKCYodmFsaWRCaXRzUGVyU2FtcGxlKSwgMiwgMSwgd2F2LT5mcCk7CiAgICAgICAgRkRLZnJlYWRfRUwoJih3YXYtPmNoYW5uZWxNYXNrKSwgNCwgMSwgd2F2LT5mcCk7CiAgICAgICAgRkRLZnJlYWRfRUwoJihndWlkKSwgMTYsIDEsIHdhdi0+ZnApOwoKICAgICAgICAvKiBjaGVjayBmb3IgUENNIEdVSUQgKi8KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgaWYgKGd1aWRbaV0gIT0gZ3VpZFBDTVtpXSkgYnJlYWs7CiAgICAgICAgaWYgKGkgPT0gMTYpIHdhdi0+aGVhZGVyLmNvbXByZXNzaW9uQ29kZSA9IDB4MDE7CgogICAgICAgIG9mZnNldCAtPSAyMjsKICAgICAgfQogICAgfQoKICAgIC8qIFNraXAgcmVzdCBvZiBmbXQgaGVhZGVyIGlmIGFueS4gKi8KICAgIGZvciAoO29mZnNldCA+IDA7IG9mZnNldC0tKSB7CiAgICAgIEZES2ZyZWFkKCZ3YXYtPmhlYWRlci5mb3JtYXRTaXplLCAxLCAxLCB3YXYtPmZwKTsKICAgIH0KCiAgICBkbyB7CiAgICAgIC8qIFJlYWQgZGF0YSBjaHVuayBJRCAqLwogICAgICBpZiAoRkRLZnJlYWQod2F2LT5oZWFkZXIuZGF0YVR5cGUsIDEsIDQsIHdhdi0+ZnApICE9IDQpIHsKICAgICAgICBGREtwcmludGZFcnIoIldBVl9JbnB1dE9wZW4oKTogVW5hYmxlIHRvIHJlYWQgZGF0YSBjaHVuayBJRC5cbiIpOwogICAgICAgIEZES2ZyZWUod2F2KTsKICAgICAgICBnb3RvIGVycm9yOwogICAgICB9CgogICAgICAvKiBSZWFkIGNodW5rIGxlbmd0aC4gKi8KICAgICAgRkRLZnJlYWRfRUwoJm9mZnNldCwgNCwgMSwgd2F2LT5mcCk7CgogICAgICAvKiBDaGVjayBmb3IgZGF0YSBjaHVuayBzaWduYXR1cmUuICovCiAgICAgIGlmIChGREtzdHJuY21wKCJkYXRhIiwgd2F2LT5oZWFkZXIuZGF0YVR5cGUsIDQpID09IDApIHsKICAgICAgICB3YXYtPmhlYWRlci5kYXRhU2l6ZSA9IG9mZnNldDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICAvKiBKdW1wIG92ZXIgbm9uIGRhdGEgY2h1bmsuICovCiAgICAgIGZvciAoO29mZnNldCA+IDA7IG9mZnNldC0tKSB7CiAgICAgICAgRkRLZnJlYWQoJih3YXYtPmhlYWRlci5kYXRhU2l6ZSksIDEsIDEsIHdhdi0+ZnApOwogICAgICB9CiAgICB9IHdoaWxlICghRkRLZmVvZih3YXYtPmZwKSk7CgogICAgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KICAgICpwV2F2ID0gd2F2OwogICAgcmV0dXJuIDA7CgogICAgLyogRXJyb3IgcGF0aCAqLwplcnJvcjoKCiAgICBpZiAod2F2KSB7CiAgICAgIGlmICh3YXYtPmZwKSB7CiAgICAgICAgRkRLZmNsb3NlKHdhdi0+ZnApOwogICAgICAgIHdhdi0+ZnAgPSBOVUxMOwogICAgICB9CiAgICAgIEZES2ZyZWUod2F2KTsKICAgIH0KCiAgICAqcFdhdiA9IE5VTEw7CgogICAgcmV0dXJuIC0xOwp9CgovKiEKICoKICogIFxicmllZiBSZWFkIHNhbXBsZXMgZnJvbSBhIFdBVkVmaWxlLiBUaGUgc2FtcGxlcyBhcmUgYXV0b21hdGljYWxseSByZW9yZGVyIHRvIHRoZSBuYXRpdmUKICogICAgaG9zdCBlbmRpYW5lc3MgYW5kIHNjYWxlZCB0byBmdWxsIHNjYWxlIG9mIHRoZSBJTlRfUENNIHR5cGUsIGZyb20gd2hhdGV2ZXIgYnBzIHRoZSBXQVZFZmlsZQogKiAgICBoYWQgc3BlY2lmaWVkIGluIGl0cyBoYWFkZXIgZGF0YS4KICoKICogIFx3YXYgSEFORExFX1dBViBvZiB0aGUgd2F2IGZpbGUuCiAqICBcYnVmZmVyIFBvaW50ZXIgdG8gc3RvcmUgcmVhZCBkYXRhLgogKiAgXG51bVNhbXBsZXMgRGVzaXJlZCBudW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkLgogKiAgXG5CaXRzIHNhbXBsZSBzaXplIGluIGJpdHMgdG8gYmUgdXNlZCBmb3IgdGhlIGJ1ZmZlcgogKgogKiAgXHJldHVybiBOdW1iZXIgb2Ygc2FtcGxlcyBhY3R1YWxseSByZWFkLgogKgogKi8KCklOVCBXQVZfSW5wdXRSZWFkIChIQU5ETEVfV0FWIHdhdiwgdm9pZCAqYnVmZmVyLCBVSU5UIG51bVNhbXBsZXMsIGludCBuQml0cykKewogIFVJTlQgcmVzdWx0ID0gMCA7CiAgVUlOVCBpOwogIFNDSEFSICpicHRyID0gKFNDSEFSKilidWZmZXI7CiAgTE9ORyAgKmxwdHIgPSAoTE9ORyopYnVmZmVyOwogIFNIT1JUICpzcHRyID0gKFNIT1JUKilidWZmZXI7CgogIHN3aXRjaCAod2F2LT5oZWFkZXIuY29tcHJlc3Npb25Db2RlKQogIHsKICAgIGNhc2UgMHgwMTogIC8qIFBDTSB1bmNvbXByZXNzZWQgKi8KICAgICAgaWYgKG5CaXRzID09IHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUpIHsKICAgICAgICByZXN1bHQgPSBGREtmcmVhZF9FTChidWZmZXIsIHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUgPj4gMywgbnVtU2FtcGxlcywgd2F2LT5mcCkgOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdCA9IDA7CiAgICAgICAgZm9yIChpPTA7IGk8bnVtU2FtcGxlczsgaSsrKQogICAgICAgIHsKICAgICAgICAgIExPTkcgdG1wID0gMDsKICAgICAgICAgIHJlc3VsdCArPSBGREtmcmVhZF9FTCgmdG1wLCB3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlID4+IDMsIDEsIHdhdi0+ZnApIDsKCiAgICAgICAgICAvKiBNb3ZlIHJlYWQgYml0cyB0byBsb3dlciBiaXRzIG9mIExPTkcuICovCiAgICAgICAgICBpZiAoICFJU19MSVRUTEVfRU5ESUFOKCkgJiYgd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSAhPSAyNCAmJiB3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlIDwgMzIpIHsKICAgICAgICAgICAgdG1wID4+PSAoMzItd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSk7CiAgICAgICAgICB9CgogICAgICAgICAgLyogRnVsbCBzY2FsZSAqLwogICAgICAgICAgaWYgKHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUgPiBuQml0cykKICAgICAgICAgICAgdG1wID4+PSAod2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZS1uQml0cyk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHRtcCA8PD0gKG5CaXRzLXdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUpOwogICAgICAgICAgICAKICAgICAgICAgIGlmIChuQml0cyA9PSA4KQogICAgICAgICAgICAqYnB0cisrID0gKFNDSEFSKSB0bXA7CiAgICAgICAgICBpZiAobkJpdHMgPT0gMTYpCiAgICAgICAgICAgICpzcHRyKysgPSAoU0hPUlQpIHRtcDsKICAgICAgICAgIGlmIChuQml0cyA9PSAzMikKICAgICAgICAgICAgKmxwdHIrKyA9IChMT05HKSB0bXA7CiAgICAgICAgfQogICAgICB9CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwNzogIC8qIHUtTGF3IGNvbXByZXNzaW9uICovCiAgICAgIGZvciAoaT0wOyBpPG51bVNhbXBsZXM7IGkrKykgewogICAgICAgIHJlc3VsdCArPSBGREtmcmVhZCgmKGJwdHJbaTw8MV0pLCAxLCAxLCB3YXYtPmZwKSA7CiAgICAgICAgc3B0cltpXSA9IHVsYXcycGNtKGJwdHJbaTw8MV0pIDsKICAgICAgfQogICAgICBicmVhayA7CgogICAgZGVmYXVsdDoKICAgICAgRkRLcHJpbnRmKCJXQVZfSW5wdXRSZWFkKCk6IHVuc3VwcG9ydGVkIGRhdGEtY29tcHJlc3Npb24hISIpIDsKICAgICAgYnJlYWsgOwogIH0KICByZXR1cm4gcmVzdWx0IDsKfQoKdm9pZCBXQVZfSW5wdXRDbG9zZShIQU5ETEVfV0FWICpwV2F2KQp7CiAgSEFORExFX1dBViB3YXYgPSAqcFdhdjsKCiAgaWYgKHdhdiAhPSBOVUxMKSB7CiAgICBpZiAod2F2LT5mcCAhPSBOVUxMKSB7CiAgICAgICBGREtmY2xvc2Uod2F2LT5mcCk7CiAgICAgICB3YXYtPmZwID0gTlVMTDsKICAgIH0KICAgIGlmICh3YXYpIHsKICAgICAgIEZES2ZyZWUod2F2KTsKICAgIH0KICB9CiAgKnBXYXYgPSBOVUxMOwp9CgovKiBjb252ZXJzaW9uIG9mIHUtbGF3IHRvIGxpbmVhciBjb2RpbmcgKi8Kc3RhdGljIElOVF9QQ00gdWxhdzJwY20gKFVDSEFSIHVsYXdieXRlKQp7CiAgc3RhdGljIGNvbnN0IElOVCBleHBfbHV0WzhdID0geyAwLCAxMzIsIDM5NiwgOTI0LCAxOTgwLCA0MDkyLCA4MzE2LCAxNjc2NCB9IDsKICBJTlQgc2lnbiwgZXhwb25lbnQsIG1hbnRpc3NhLCBzYW1wbGUgOwoKICB1bGF3Ynl0ZSA9IChVQ0hBUil+dWxhd2J5dGUgOwogIHNpZ24gPSAodWxhd2J5dGUgJiAweDgwKSA7CiAgZXhwb25lbnQgPSAodWxhd2J5dGUgPj4gNCkgJiAweDA3IDsKICBtYW50aXNzYSA9IHVsYXdieXRlICYgMHgwRiA7CgogIHNhbXBsZSA9IGV4cF9sdXRbZXhwb25lbnRdICsgKG1hbnRpc3NhIDw8IChleHBvbmVudCArIDMpKSA7CiAgaWYgKHNpZ24gIT0gMCkKICAgIHNhbXBsZSA9IC1zYW1wbGUgOwoKICByZXR1cm4gKElOVF9QQ00pc2FtcGxlIDsKfQoKLyoqKioqKioqKioqKioqIFdyaXRlciAqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBVSU5UIExpdHRsZUVuZGlhbjMyKFVJTlQgdikKewogICAgaWYgKElTX0xJVFRMRV9FTkRJQU4oKSkKICAgICAgICByZXR1cm4gdiA7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuICh2ICYgMHgwMDAwMDBGRikgPDwgMjQgfCAodiAmIDB4MDAwMEZGMDApIDw8ICA4IHwgKHYgJiAweDAwRkYwMDAwKSA+PiAgOCB8ICh2ICYgMHhGRjAwMDAwMCkgPj4gMjQ7Cn0KCnN0YXRpYyBTSE9SVCBMaXR0bGVFbmRpYW4xNihTSE9SVCB2KQp7CiAgICBpZiAoSVNfTElUVExFX0VORElBTigpKQogICAgICAgIHJldHVybiB2OwogICAgZWxzZQogICAgICAgIHJldHVybiAoU0hPUlQpKCgodiA8PCA4KSAmIDB4RkYwMCkgfCAoKHYgPj4gOCkgJiAweDAwRkYpKTsKfQoKc3RhdGljIFVTSE9SVCBVbnBhY2soVVNIT1JUIHYpCnsKICAgIGlmIChJU19MSVRUTEVfRU5ESUFOKCkpCiAgICAgIHJldHVybiB2OwogICAgZWxzZQogICAgICByZXR1cm4gKFNIT1JUKSgoKHYgPDwgOCkgJiAweEZGMDApIHwgKCh2ID4+IDgpICYgMHgwMEZGKSk7Cn0KCi8qKgogKiBXQVZfT3V0cHV0T3BlbgogKiBcYnJpZWYgT3BlbiBXQVYgb3V0cHV0L3dyaXRlciBoYW5kbGUKICogXHBhcmFtIHBXYXYgcG9pbnRlciB0byBXQVYgaGFuZGxlIHRvIGJlIHJldHVybmVkCiAqIFxwYXJhbSBzYW1wbGVSYXRlIGRlc2lyZWQgc2FtcGxlcmF0ZSBvZiB0aGUgcmVzdWx0aW5nIFdBViBmaWxlCiAqIFxwYXJhbSBudW1DaGFubmVscyBkZXNpcmVkIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyBvZiB0aGUgcmVzdWx0aW5nIFdBViBmaWxlCiAqIFxwYXJhbSBiaXRzUGVyU2FtcGxlIGRlc2lyZWQgbnVtYmVyIG9mIGJpdHMgcGVyIGF1ZGlvIHNhbXBsZSBvZiB0aGUgcmVzdWx0aW5nIFdBViBmaWxlCiAqCiAqIFxyZXR1cm4gdmFsdWU6ICAgMDogb2sKICogICAgICAgICAgICAgICAgIC0xOiBlcnJvcgogKi8KSU5UIFdBVl9PdXRwdXRPcGVuKEhBTkRMRV9XQVYgKnBXYXYsIGNvbnN0IGNoYXIgKm91dHB1dEZpbGVuYW1lLCBJTlQgc2FtcGxlUmF0ZSwgSU5UIG51bUNoYW5uZWxzLCBJTlQgYml0c1BlclNhbXBsZSkKewogIEhBTkRMRV9XQVYgd2F2ID0gKEhBTkRMRV9XQVYpRkRLY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgV0FWKSk7CiAgVUlOVCBzaXplID0gMDsKCiAgaWYgKHdhdiA9PSBOVUxMKSB7CiAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRPcGVuKCk6IFVuYWJsZSB0byBhbGxvY2F0ZSBXQVYgc3RydWN0LlxuIik7CiAgICBnb3RvIGJhaWw7CiAgfQoKICBpZiAoYml0c1BlclNhbXBsZSAhPSAxNiAmJiBiaXRzUGVyU2FtcGxlICE9IDI0ICYmIGJpdHNQZXJTYW1wbGUgIT0gMzIpCiAgewogICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRPcGVuKCk6IEludmFsaWQgYXJndW1lbnQgKGJpdHNQZXJTYW1wbGUpLlxuIik7CiAgICAgIGdvdG8gYmFpbDsKICB9CgogIHdhdi0+ZnAgPSBGREtmb3BlbihvdXRwdXRGaWxlbmFtZSwgIndiIik7CiAgaWYgKHdhdi0+ZnAgPT0gTlVMTCkKICB7CiAgICAgIEZES3ByaW50ZkVycigiV0FWX091dHB1dE9wZW4oKTogdW5hYmxlIHRvIGNyZWF0ZSBmaWxlICVzXG4iLCBvdXRwdXRGaWxlbmFtZSk7CiAgICAgIGdvdG8gYmFpbDsKICB9CgogIEZES3N0cmNweSh3YXYtPmhlYWRlci5yaWZmVHlwZSwgIlJJRkYiKTsKICB3YXYtPmhlYWRlci5yaWZmU2l6ZSA9IExpdHRsZUVuZGlhbjMyKDB4N2ZmZmZmZmYpOyAgLyogaW4gY2FzZSBmc2VlaygpIGRvZXNuJ3Qgd29yayBsYXRlciBpbiBXQVZfT3V0cHV0Q2xvc2UoKSAqLwogIEZES3N0cmNweSh3YXYtPmhlYWRlci53YXZlVHlwZSwgIldBVkUiKTsKCiAgRkRLc3RyY3B5KHdhdi0+aGVhZGVyLmZvcm1hdFR5cGUsICJmbXQgIik7CiAgd2F2LT5oZWFkZXIuZm9ybWF0U2l6ZSA9IExpdHRsZUVuZGlhbjMyKDE2KTsKCiAgd2F2LT5oZWFkZXIuY29tcHJlc3Npb25Db2RlID0gTGl0dGxlRW5kaWFuMTYoMHgwMSk7CiAgd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSAgID0gTGl0dGxlRW5kaWFuMTYoKFNIT1JUKWJpdHNQZXJTYW1wbGUpOwogIHdhdi0+aGVhZGVyLm51bUNoYW5uZWxzICAgICA9IExpdHRsZUVuZGlhbjE2KChTSE9SVCludW1DaGFubmVscyk7CiAgd2F2LT5oZWFkZXIuYmxvY2tBbGlnbiAgICAgID0gTGl0dGxlRW5kaWFuMTYoKFNIT1JUKShudW1DaGFubmVscyAqIChiaXRzUGVyU2FtcGxlID4+IDMpKSk7CiAgd2F2LT5oZWFkZXIuc2FtcGxlUmF0ZSAgICAgID0gTGl0dGxlRW5kaWFuMzIoc2FtcGxlUmF0ZSk7CiAgd2F2LT5oZWFkZXIuYnl0ZXNQZXJTZWNvbmQgID0gTGl0dGxlRW5kaWFuMzIoc2FtcGxlUmF0ZSAqIHdhdi0+aGVhZGVyLmJsb2NrQWxpZ24pOwogIEZES3N0cmNweSh3YXYtPmhlYWRlci5kYXRhVHlwZSwgImRhdGEiKTsKICB3YXYtPmhlYWRlci5kYXRhU2l6ZSAgICAgICAgPSBMaXR0bGVFbmRpYW4zMigweDdmZmZmZmZmIC0gMzYpOwoKCiAgc2l6ZSA9IHNpemVvZihXQVZfSEVBREVSKTsKICBpZiAoRkRLZndyaXRlKCZ3YXYtPmhlYWRlciwgMSwgc2l6ZSwgd2F2LT5mcCkgIT0gc2l6ZSkKICB7CiAgICAgIEZES3ByaW50ZkVycigiV0FWX091dHB1dE9wZW4oKTogZXJyb3Igd3JpdGluZyB0byBvdXRwdXQgZmlsZSAlc1xuIiwgb3V0cHV0RmlsZW5hbWUpOwogICAgICBnb3RvIGJhaWw7CiAgfQoKCiAgd2F2LT5oZWFkZXIuZGF0YVNpemUgPSB3YXYtPmhlYWRlci5yaWZmU2l6ZSA9IDA7CgogICpwV2F2ID0gd2F2OwoKICByZXR1cm4gMDsKCmJhaWw6CiAgaWYgKHdhdikgewogICAgaWYgKHdhdi0+ZnApIHsKICAgICAgRkRLZmNsb3NlKHdhdi0+ZnApOwogICAgfQogICAgRkRLZnJlZSh3YXYpOwogIH0KCiAgcFdhdiA9IE5VTEw7CgogIHJldHVybiAtMTsKfQoKCi8qKgogKiBXQVZfT3V0cHV0V3JpdGUKICogXGJyaWVmIFdyaXRlIGRhdGEgdG8gV0FWIGZpbGUgYXNvY2lhdGVkIHRvIFdBViBoYW5kbGUKICoKICogXHBhcmFtIHdhdiBoYW5kbGUgb2Ygd2F2ZSBmaWxlCiAqIFxwYXJhbSBzYW1wbGVCdWZmZXIgcG9pbnRlciB0byBhdWRpbyBzYW1wbGVzLCByaWdodCBqdXN0aWZpZWQgaW50ZWdlciB2YWx1ZXMKICogXHBhcmFtIG5CdWZCaXRzIHNpemUgaW4gYml0cyBvZiBlYWNoIGF1ZGlvIHNhbXBsZSBpbiBzYW1wbGVCdWZmZXIKICogXHBhcmFtIG5TaWdCaXRzIGFtb3VudCBvZiBzaWduaWZpY2FudCBiaXRzIG9mIGVhY2ggbkJ1ZkJpdHMgaW4gc2FtcGxlQnVmZmVyCiAqCiAqIFxyZXR1cm4gdmFsdWU6ICAgIDA6IG9rCiAqICAgICAgICAgICAgICAgICAgLTE6IGVycm9yCiAqLwpJTlQgV0FWX091dHB1dFdyaXRlKEhBTkRMRV9XQVYgd2F2LCB2b2lkICpzYW1wbGVCdWZmZXIsIFVJTlQgbnVtYmVyT2ZTYW1wbGVzLCBpbnQgbkJ1ZkJpdHMsIGludCBuU2lnQml0cykKewogICAgU0NIQVIgKmJwdHIgPSAoU0NIQVIqKXNhbXBsZUJ1ZmZlcjsKICAgIFNIT1JUICpzcHRyID0gKFNIT1JUKilzYW1wbGVCdWZmZXI7CiAgICBMT05HICAqbHB0ciA9IChMT05HKilzYW1wbGVCdWZmZXI7CiAgICBMT05HIHRtcDsKICAgIAogICAgaW50IGJwcyA9IFVucGFjayh3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlKTsKICAgIFVJTlQgaTsKCiAgICAvKiBQYWNrIHNhbXBsZXMgaWYgcmVxdWlyZWQgKi8KICAgIGlmIChicHMgPT0gbkJ1ZkJpdHMgJiYgYnBzID09IG5TaWdCaXRzKSB7CiAgICAgIGlmIChGREtmd3JpdGVfRUwoc2FtcGxlQnVmZmVyLCAoYnBzPj4zKSwgbnVtYmVyT2ZTYW1wbGVzLCB3YXYtPmZwKSAhPSBudW1iZXJPZlNhbXBsZXMpCiAgICAgIHsKICAgICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRXcml0ZSgpOiBlcnJvcjogdW5hYmxlIHRvIHdyaXRlIHRvIGZpbGUgJWRcbiIsIHdhdi0+ZnApOwogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgfSBlbHNlICB7CiAgICAgIGZvciAoaT0wOyBpPG51bWJlck9mU2FtcGxlczsgaSsrKQogICAgICB7CiAgICAgICAgaW50IHJlc3VsdDsKICAgICAgICBpbnQgc2hpZnQ7CiAgICAgICAgCiAgICAgICAgc3dpdGNoIChuQnVmQml0cykgewogICAgICAgICAgY2FzZSA4OiAgdG1wID0gKmJwdHIrKzsgYnJlYWs7CiAgICAgICAgICBjYXNlIDE2OiB0bXAgPSAqc3B0cisrOyBicmVhazsKICAgICAgICAgIGNhc2UgMzI6IHRtcCA9ICpscHRyKys7IGJyZWFrOwogICAgICAgICAgZGVmYXVsdDogcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICAvKiBBZGFwdCBzYW1wbGUgc2l6ZSAqLwogICAgICAgIHNoaWZ0ID0gKG5CdWZCaXRzLW5TaWdCaXRzKS0oMzItYnBzKTsKCiAgICAgICAgLyogQ29ycmVjdCBhbGlnbm1lbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIDMyIGJpdCBkYXRhIGJ1ZmZlciAidG1wIiBhbmQgMjQgYml0cyB0byBiZSB3cml0dGVuLiAqLwogICAgICAgIGlmICggIUlTX0xJVFRMRV9FTkRJQU4oKSAmJiBicHMgPT0gMjQpIHsKICAgICAgICAgIHNoaWZ0ICs9IDg7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2hpZnQgPCAwKQogICAgICAgICAgdG1wID4+PSAtc2hpZnQ7CiAgICAgICAgZWxzZQogICAgICAgICAgdG1wIDw8PSBzaGlmdDsKCiAgICAgICAgLyogV3JpdGUgc2FtcGxlICovICAgICAgICAKICAgICAgICByZXN1bHQ9RkRLZndyaXRlX0VMKCZ0bXAsIGJwcz4+MywgMSwgd2F2LT5mcCk7CiAgICAgICAgaWYgKHJlc3VsdCA8PSAwKSB7CiAgICAgICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRXcml0ZSgpOiBlcnJvcjogdW5hYmxlIHRvIHdyaXRlIHRvIGZpbGUgJWRcbiIsIHdhdi0+ZnApOwogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgfQogICAgfSAKCiAgICB3YXYtPmhlYWRlci5kYXRhU2l6ZSArPSAobnVtYmVyT2ZTYW1wbGVzICogKGJwcz4+MykpOwogICAgcmV0dXJuIDA7Cn0KCgovKioKICogV0FWX091dHB1dENsb3NlCiAqIFxicmllZiBDbG9zZSBXQVYgT3V0cHV0IGhhbmRsZQogKiBccGFyYW0gcFdhdiBwb2ludGVyIHRvIFdBViBoYW5kbGUuICpwV2F2IGlzIHNldCB0byBOVUxMLgogKi8Kdm9pZCBXQVZfT3V0cHV0Q2xvc2UoSEFORExFX1dBViAqcFdhdikKewogIEhBTkRMRV9XQVYgd2F2ID0gKnBXYXY7CiAgVUlOVCBzaXplID0gMDsKCiAgaWYgKCB3YXYgPT0gTlVMTCApIHsKICAgICAgcmV0dXJuOwogIH0KCiAgd2F2LT5oZWFkZXIuZGF0YVNpemUgPSBMaXR0bGVFbmRpYW4zMih3YXYtPmhlYWRlci5kYXRhU2l6ZSk7CiAgd2F2LT5oZWFkZXIucmlmZlNpemUgPSBMaXR0bGVFbmRpYW4zMih3YXYtPmhlYWRlci5kYXRhU2l6ZSArIDM2KTsKCiAgaWYgKHdhdi0+ZnAgIT0gTlVMTCkKICB7CiAgICBpZiAoRkRLZnNlZWsod2F2LT5mcCwgMCwgRkRLU0VFS19TRVQpKSB7CiAgICAgICBGREtwcmludGYoIldBVl9PdXRwdXRDbG9zZSgpOiBmc2VlaygpIGZhaWxlZC5cbiIpOwogICAgfQoKICBzaXplID0gc2l6ZW9mKFdBVl9IRUFERVIpOwogICAgaWYgKEZES2Z3cml0ZSgmd2F2LT5oZWFkZXIucmlmZlR5cGUsIDEsIHNpemUsIHdhdi0+ZnApICE9IHNpemUpCiAgICB7CiAgICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfT3V0cHV0Q2xvc2UoKTogdW5hYmxlIHRvIHdyaXRlIGhlYWRlclxuIik7Cgl9CgogICAgaWYgKEZES2ZjbG9zZSh3YXYtPmZwKSkKICAgIHsKICAgICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRDbG9zZSgpOiB1bmFibGUgdG8gY2xvc2Ugd2F2IGZpbGVcbiIpOwogICAgfQogICAgd2F2LT5mcCA9IE5VTEw7CiAgfQoKICBGREtmcmVlKHdhdik7CiAgKnBXYXYgPSBOVUxMOwp9Cgo=