Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIsIE0uIEdheWVyCiAgIERlc2NyaXB0aW9uOgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImZmdF9yYWQyLmgiCgojaW5jbHVkZSAic2NyYW1ibGUuaCIKCiNkZWZpbmUgX19GRlRfUkFEMl9DUFBfXwoKI2lmIGRlZmluZWQoX19hcm1fXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwojaW5jbHVkZSAiYXJtL2ZmdF9yYWQyX2FybS5jcHAiCgojZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKF9fbWlwc19kc3ApCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KI2luY2x1ZGUgIm1pcHMvZmZ0X3JhZDJfbWlwcy5jcHAiCgojZW5kaWYKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgZnVuY3Rpb25uYW1lOiBkaXRfZmZ0IChhbmFseXNpcykKICAgIGRlc2NyaXB0aW9uOiAgZGl0LXR1a2V5LWFsZ29yaXRobQogICAgICAgICAgICAgICAgICBzY3JhbWJsZXMgZGF0YSBhdCBlbnRyeQogICAgICAgICAgICAgICAgICBpLmUuIGxvb3AgaXMgbWFkZSB3aXRoIHNjcmFtYmxlZCBkYXRhCiAgICByZXR1cm5zOgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgRlVOQ1RJT05fZGl0X2ZmdAoKdm9pZCBkaXRfZmZ0KEZJWFBfREJMICp4LCBjb25zdCBJTlQgbGRuLCBjb25zdCBGSVhQX1NUUCAqdHJpZ2RhdGEsIGNvbnN0IElOVCB0cmlnRGF0YVNpemUpCnsKICAgIGNvbnN0IElOVCBuPTE8PGxkbjsKICAgIElOVCB0cmlnc3RlcCxpLGxkbTsKCiAgICBzY3JhbWJsZSh4LG4pOwogICAgLyoKICAgICAqIDErMiBzdGFnZSByYWRpeCA0CiAgICAgKi8KCiAgICBmb3IgKGk9MDtpPG4qMjtpKz04KQogICAgewogICAgICBGSVhQX0RCTCBhMDAsIGExMCwgYTIwLCBhMzA7CiAgICAgIGEwMCA9ICh4W2kgKyAwXSArIHhbaSArIDJdKT4+MTsgIC8qIFJlIEEgKyBSZSBCICovCiAgICAgIGExMCA9ICh4W2kgKyA0XSArIHhbaSArIDZdKT4+MTsgIC8qIFJlIEMgKyBSZSBEICovCiAgICAgIGEyMCA9ICh4W2kgKyAxXSArIHhbaSArIDNdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCiAgICAgIGEzMCA9ICh4W2kgKyA1XSArIHhbaSArIDddKT4+MTsgIC8qIEltIEMgKyBJbSBEICovCgogICAgICB4W2kgKyAwXSA9IGEwMCArIGExMDsgICAgICAgLyogUmUgQScgPSBSZSBBICsgUmUgQiArIFJlIEMgKyBSZSBEICovCiAgICAgIHhbaSArIDRdID0gYTAwIC0gYTEwOyAgICAgICAvKiBSZSBDJyA9IFJlIEEgKyBSZSBCIC0gUmUgQyAtIFJlIEQgKi8KICAgICAgeFtpICsgMV0gPSBhMjAgKyBhMzA7ICAgICAgIC8qIEltIEEnID0gSW0gQSArIEltIEIgKyBJbSBDICsgSW0gRCAqLwogICAgICB4W2kgKyA1XSA9IGEyMCAtIGEzMDsgICAgICAgLyogSW0gQycgPSBJbSBBICsgSW0gQiAtIEltIEMgLSBJbSBEICovCgogICAgICBhMDAgPSBhMDAgLSB4W2kgKyAyXTsgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KICAgICAgYTEwID0gYTEwIC0geFtpICsgNl07ICAgICAgIC8qIFJlIEMgLSBSZSBEICovCiAgICAgIGEyMCA9IGEyMCAtIHhbaSArIDNdOyAgICAgICAvKiBJbSBBIC0gSW0gQiAqLwogICAgICBhMzAgPSBhMzAgLSB4W2kgKyA3XTsgICAgICAgLyogSW0gQyAtIEltIEQgKi8KCiAgICAgIHhbaSArIDJdID0gYTAwICsgYTMwOyAgICAgICAvKiBSZSBCJyA9IFJlIEEgLSBSZSBCICsgSW0gQyAtIEltIEQgKi8KICAgICAgeFtpICsgNl0gPSBhMDAgLSBhMzA7ICAgICAgIC8qIFJlIEQnID0gUmUgQSAtIFJlIEIgLSBJbSBDICsgSW0gRCAqLwogICAgICB4W2kgKyAzXSA9IGEyMCAtIGExMDsgICAgICAgLyogSW0gQicgPSBJbSBBIC0gSW0gQiAtIFJlIEMgKyBSZSBEICovCiAgICAgIHhbaSArIDddID0gYTIwICsgYTEwOyAgICAgICAvKiBJbSBEJyA9IEltIEEgLSBJbSBCICsgUmUgQyAtIFJlIEQgKi8KICAgIH0KCiAgICBmb3IobGRtPTM7IGxkbTw9bGRuOyArK2xkbSkKICAgIHsKICAgICAgICBJTlQgbT0oMTw8bGRtKTsKICAgICAgICBJTlQgbWg9KG0+PjEpOwogICAgICAgIElOVCBqLHI7CgogICAgICAgIHRyaWdzdGVwPSgodHJpZ0RhdGFTaXplIDw8IDIpPj5sZG0pOwoKICAgICAgICBGREtfQVNTRVJUKHRyaWdzdGVwID4gMCk7CgogICAgICAgIC8qIERvIGZpcnN0IGl0ZXJhdGlvbiB3aXRoIGM9MS4wIGFuZCBzPTAuMCBzZXBhcmF0ZWx5IHRvIGF2b2lkIGxvb3NpbmcgdG8gbXVjaCBwcmVjaXNpb24uCiAgICAgICAgICAgQmV3YXJlOiBUaGUgaW1wYWN0IG9uIHRoZSBvdmVyYWwgRkZUIHByZWNpc2lvbiBpcyByYXRoZXIgbGFyZ2UuICovCiAgICAgICAgewogICAgICAgICAgICBqID0gMDsKCiAgICAgICAgICAgIGZvcihyPTA7IHI8bjsgcis9bSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgSU5UIHQxID0gKHIraik8PDE7CiAgICAgICAgICAgICAgICBJTlQgdDIgPSB0MSArIChtaDw8MSk7CiAgICAgICAgICAgICAgICBGSVhQX0RCTCB2cix2aSx1cix1aTsKCiAgICAgICAgICAgICAgICAvL2NwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0MisxXSwgeFt0Ml0sIChGSVhQX1NHTCkxLjAsIChGSVhQX1NHTCkwLjApOwogICAgICAgICAgICAgICAgdmkgPSB4W3QyKzFdPj4xOwogICAgICAgICAgICAgICAgdnIgPSB4W3QyXT4+MTsKCiAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwogICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOwoKICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1cit2cjsKICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aSt2aTsKCiAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXItdnI7CiAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWktdmk7CgogICAgICAgICAgICAgICAgdDEgKz0gbWg7CiAgICAgICAgICAgICAgICB0MiA9IHQxKyhtaDw8MSk7CgogICAgICAgICAgICAgICAgLy9jcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDIrMV0sIHhbdDJdLCAoRklYUF9TR0wpMS4wLCAoRklYUF9TR0wpMC4wKTsKICAgICAgICAgICAgICAgIHZyID0geFt0MisxXT4+MTsKICAgICAgICAgICAgICAgIHZpID0geFt0Ml0+PjE7CgogICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKCiAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7CiAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWktdmk7CgogICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOwogICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpK3ZpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcihqPTE7IGo8bWgvNDsgKytqKQogICAgICAgIHsKICAgICAgICAgICAgRklYUF9TVFAgY3M7CgogICAgICAgICAgICBjcyA9IHRyaWdkYXRhW2oqdHJpZ3N0ZXBdOwoKICAgICAgICAgICAgZm9yKHI9MDsgcjxuOyByKz1tKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBJTlQgdDEgPSAocitqKTw8MTsKICAgICAgICAgICAgICAgIElOVCB0MiA9IHQxICsgKG1oPDwxKTsKICAgICAgICAgICAgICAgIEZJWFBfREJMIHZyLHZpLHVyLHVpOwoKICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0MisxXSwgeFt0Ml0sIGNzKTsKCiAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwogICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOwoKICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1cit2cjsKICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aSt2aTsKCiAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXItdnI7CiAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWktdmk7CgogICAgICAgICAgICAgICAgdDEgKz0gbWg7CiAgICAgICAgICAgICAgICB0MiA9IHQxKyhtaDw8MSk7CgogICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4W3QyKzFdLCB4W3QyXSwgY3MpOwoKICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7CiAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7CgogICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyK3ZyOwogICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpLXZpOwoKICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1ci12cjsKICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aSt2aTsKCiAgICAgICAgICAgICAgICAvKiBTYW1lIGFzIGFib3ZlIGJ1dCBmb3IgdDEsdDIgd2l0aCBqPm1oLzQgYW5kIHRodXMgY3Mgc3dhcHBlZCAqLwogICAgICAgICAgICAgICAgdDEgPSAocittaC8yLWopPDwxOwogICAgICAgICAgICAgICAgdDIgPSB0MSArIChtaDw8MSk7CgogICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyXSwgeFt0MisxXSwgY3MpOwoKICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7CiAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7CgogICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyK3ZyOwogICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpLXZpOwoKICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1ci12cjsKICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aSt2aTsKCiAgICAgICAgICAgICAgICB0MSArPSBtaDsKICAgICAgICAgICAgICAgIHQyID0gdDErKG1oPDwxKTsKCiAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDJdLCB4W3QyKzFdLCBjcyk7CgogICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKCiAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXItdnI7CiAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWktdmk7CgogICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyK3ZyOwogICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpK3ZpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHsKICAgICAgICAgICAgaiA9IG1oLzQ7CgogICAgICAgICAgICBmb3Iocj0wOyByPG47IHIrPW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIElOVCB0MSA9IChyK2opPDwxOwogICAgICAgICAgICAgICAgSU5UIHQyID0gdDEgKyAobWg8PDEpOwogICAgICAgICAgICAgICAgRklYUF9EQkwgdnIsdmksdXIsdWk7CgogICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyKzFdLCB4W3QyXSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1YTgyNzk5YSkpOwoKICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7CiAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7CgogICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyK3ZyOwogICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpK3ZpOwoKICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1ci12cjsKICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aS12aTsKCiAgICAgICAgICAgICAgICB0MSArPSBtaDsKICAgICAgICAgICAgICAgIHQyID0gdDErKG1oPDwxKTsKCiAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDIrMV0sIHhbdDJdLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDVhODI3OTlhKSk7CgogICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKCiAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7CiAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWktdmk7CgogICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOwogICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpK3ZpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgIGZ1bmN0aW9ubmFtZTogZGl0X2lmZnQgKHN5bnRoZXNpcykKICAgIGRlc2NyaXB0aW9uOiAgZGl0LXR1a2V5LWFsZ29yaXRobQogICAgICAgICAgICAgICAgICBzY3JhbWJsZXMgZGF0YSBhdCBlbnRyeQogICAgICAgICAgICAgICAgICBpLmUuIGxvb3AgaXMgbWFkZSB3aXRoIHNjcmFtYmxlZCBkYXRhCiAgICByZXR1cm5zOgogICAgaW5wdXQ6CiAgICBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZiAhZGVmaW5lZChGVU5DVElPTl9kaXRfaWZmdCkKdm9pZCBkaXRfaWZmdChGSVhQX0RCTCAqeCwgY29uc3QgSU5UIGxkbiwgY29uc3QgRklYUF9TVFAgKnRyaWdkYXRhLCBjb25zdCBJTlQgdHJpZ0RhdGFTaXplKQp7CiAgICBjb25zdCBJTlQgbj0xPDxsZG47CiAgICBJTlQgdHJpZ3N0ZXAsaSxsZG07CgogICAgc2NyYW1ibGUoeCxuKTsKCiAgICAvKgogICAgICAxKzIgc3RhZ2UgcmFkaXggNAogICAgKi8KCiAgICBmb3IgKGk9MDtpPG4qMjtpKz04KQogICAgewogICAgICBGSVhQX0RCTCBhMCwgYTEsIGEyLCBhMywgYTAwLCBhMTAsIGEyMCwgYTMwOwoKICAgICAgYTAwID0gKHhbaSArIDBdICsgeFtpICsgMl0pPj4xOyAgIC8qIFJlIEEgKyBSZSBCICovCiAgICAgIGExMCA9ICh4W2kgKyA0XSArIHhbaSArIDZdKT4+MTsgICAvKiBSZSBDICsgUmUgRCAqLwogICAgICBhMjAgPSAoeFtpICsgMV0gKyB4W2kgKyAzXSk+PjE7ICAgLyogSW0gQSArIEltIEIgKi8KICAgICAgYTMwID0gKHhbaSArIDVdICsgeFtpICsgN10pPj4xOyAgIC8qIEltIEMgKyBJbSBEICovCiAgICAgIGEwICA9ICh4W2kgKyAwXSAtIHhbaSArIDJdKT4+MTsgICAvKiBSZSBBIC0gUmUgQiAqLwogICAgICBhMiAgPSAoeFtpICsgNF0gLSB4W2kgKyA2XSk+PjE7ICAgLyogUmUgQyAtIFJlIEQgKi8KICAgICAgYTMgID0gKHhbaSArIDFdIC0geFtpICsgM10pPj4xOyAgIC8qIEltIEEgLSBJbSBCICovCiAgICAgIGExICA9ICh4W2kgKyA1XSAtIHhbaSArIDddKT4+MTsgICAvKiBJbSBDIC0gSW0gRCAqLwoKICAgICAgeFtpICsgMF0gPSBhMDAgKyBhMTA7ICAgIC8qIFJlIEEnID0gUmUgQSArIFJlIEIgKyBSZSBDICsgUmUgRCAqLwogICAgICB4W2kgKyA0XSA9IGEwMCAtIGExMDsgICAgLyogUmUgQycgPSBSZSBBICsgUmUgQiAtIFJlIEMgLSBSZSBEICovCiAgICAgIHhbaSArIDFdID0gYTIwICsgYTMwOyAgICAvKiBJbSBBJyA9IEltIEEgKyBJbSBCICsgSW0gQyArIEltIEQgKi8KICAgICAgeFtpICsgNV0gPSBhMjAgLSBhMzA7ICAgIC8qIEltIEMnID0gSW0gQSArIEltIEIgLSBJbSBDIC0gSW0gRCAqLwogICAgICB4W2kgKyAyXSA9IGEwIC0gYTE7ICAgICAgLyogUmUgQicgPSBSZSBBIC0gUmUgQiAtIEltIEMgKyBJbSBEICovCiAgICAgIHhbaSArIDZdID0gYTAgKyBhMTsgICAgICAvKiBSZSBEJyA9IFJlIEEgLSBSZSBCICsgSW0gQyAtIEltIEQgKi8KICAgICAgeFtpICsgM10gPSBhMyArIGEyOyAgICAgIC8qIEltIEInID0gSW0gQSAtIEltIEIgKyBSZSBDIC0gUmUgRCAqLwogICAgICB4W2kgKyA3XSA9IGEzIC0gYTI7ICAgICAgLyogSW0gRCcgPSBJbSBBIC0gSW0gQiAtIFJlIEMgKyBSZSBEICovCiAgICB9CgogICAgZm9yKGxkbT0zOyBsZG08PWxkbjsgKytsZG0pCiAgICB7CiAgICAgICAgY29uc3QgSU5UIG09KDE8PGxkbSk7CiAgICAgICAgY29uc3QgSU5UIG1oPShtPj4xKTsKCiAgICAgICAgSU5UIGoscjsKCiAgICAgICAgdHJpZ3N0ZXA9KCh0cmlnRGF0YVNpemUgPDwgMik+PmxkbSk7CgogICAgICAgIHsKICAgICAgICAgICAgaiA9IDA7CgogICAgICAgICAgICBmb3Iocj0wOyByPG47IHIrPW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIElOVCB0MSA9IChyK2opPDwxOwogICAgICAgICAgICAgICAgSU5UIHQyID0gdDEgKyAobWg8PDEpOwogICAgICAgICAgICAgICAgRklYUF9EQkwgdnIsdmksdXIsdWk7CgogICAgICAgICAgICAgICAgLy9jcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDJdLCB4W3QyKzFdLCBGTDJGWENPTlNUX1NHTCgxLjApLCAoRklYUF9TR0wpMC4wKTsKICAgICAgICAgICAgICAgIHZpID0geFt0MisxXT4+MTsKICAgICAgICAgICAgICAgIHZyID0geFt0Ml0+PjE7CgogICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKCiAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7CiAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7CgogICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOwogICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOwoKICAgICAgICAgICAgICAgIHQxICs9IG1oOwogICAgICAgICAgICAgICAgdDIgPSB0MSsobWg8PDEpOwoKICAgICAgICAgICAgICAgIC8vY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyXSwgeFt0MisxXSwgRkwyRlhDT05TVF9TR0woMS4wKSwgRkwyRlhDT05TVF9TR0woMC4wKSk7CiAgICAgICAgICAgICAgICB2ciA9IHhbdDIrMV0+PjE7CiAgICAgICAgICAgICAgICB2aSA9IHhbdDJdPj4xOwoKICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7CiAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7CgogICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyLXZyOwogICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpK3ZpOwoKICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1cit2cjsKICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aS12aTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3Ioaj0xOyBqPG1oLzQ7ICsraikKICAgICAgICB7CiAgICAgICAgICAgIEZJWFBfU1RQIGNzOwoKICAgICAgICAgICAgY3MgPSB0cmlnZGF0YVtqKnRyaWdzdGVwXTsKCiAgICAgICAgICAgIGZvcihyPTA7IHI8bjsgcis9bSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgSU5UIHQxID0gKHIraik8PDE7CiAgICAgICAgICAgICAgICBJTlQgdDIgPSB0MSArIChtaDw8MSk7CiAgICAgICAgICAgICAgICBGSVhQX0RCTCB2cix2aSx1cix1aTsKCiAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDJdLCB4W3QyKzFdLCBjcyk7CgogICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKCiAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7CiAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7CgogICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOwogICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOwoKICAgICAgICAgICAgICAgIHQxICs9IG1oOwogICAgICAgICAgICAgICAgdDIgPSB0MSsobWg8PDEpOwoKICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0Ml0sIHhbdDIrMV0sIGNzKTsKCiAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwogICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOwoKICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1ci12cjsKICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aSt2aTsKCiAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXIrdnI7CiAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWktdmk7CgogICAgICAgICAgICAgICAgLyogU2FtZSBhcyBhYm92ZSBidXQgZm9yIHQxLHQyIHdpdGggaj5taC80IGFuZCB0aHVzIGNzIHN3YXBwZWQgKi8KICAgICAgICAgICAgICAgIHQxID0gKHIrbWgvMi1qKTw8MTsKICAgICAgICAgICAgICAgIHQyID0gdDEgKyAobWg8PDEpOwoKICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0MisxXSwgeFt0Ml0sIGNzKTsKCiAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwogICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOwoKICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1ci12cjsKICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aSt2aTsKCiAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXIrdnI7CiAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWktdmk7CgogICAgICAgICAgICAgICAgdDEgKz0gbWg7CiAgICAgICAgICAgICAgICB0MiA9IHQxKyhtaDw8MSk7CgogICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyKzFdLCB4W3QyXSwgY3MpOwoKICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7CiAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7CgogICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyLXZyOwogICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpLXZpOwoKICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1cit2cjsKICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aSt2aTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB7CiAgICAgICAgICAgIGogPSBtaC80OwogICAgICAgICAgICBmb3Iocj0wOyByPG47IHIrPW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIElOVCB0MSA9IChyK21oLzItaik8PDE7CiAgICAgICAgICAgICAgICBJTlQgdDIgPSB0MSArIChtaDw8MSk7CiAgICAgICAgICAgICAgICBGSVhQX0RCTCB2cix2aSx1cix1aTsKCiAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDJdLCB4W3QyKzFdLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDVhODI3OTlhKSk7CgogICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKCiAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7CiAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7CgogICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOwogICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOwoKICAgICAgICAgICAgICAgIHQxICs9IG1oOwogICAgICAgICAgICAgICAgdDIgPSB0MSsobWg8PDEpOwoKICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0Ml0sIHhbdDIrMV0sIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NWE4Mjc5OWEpKTsKCiAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwogICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOwoKICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1ci12cjsKICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aSt2aTsKCiAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXIrdnI7CiAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWktdmk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KI2VuZGlmCgo=