LyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCi8qIE1haW4gZmlsZSBmb3IgQ0QtUk9NIHN1cHBvcnQKICoKICogQ29weXJpZ2h0IDE5OTQgTWFydGluIEF5b3R0ZQogKiBDb3B5cmlnaHQgMTk5OSwgMjAwMSwgMjAwMyBFcmljIFBvdWVjaAogKiBDb3B5cmlnaHQgMjAwMCBBbmRyZWFzIE1vaHIKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaWZkZWYgSEFWRV9JT19ICiMgaW5jbHVkZSA8aW8uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1VOSVNURF9ICiMgaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KCiNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NDU0lfU0dfSAojIGluY2x1ZGUgPHNjc2kvc2cuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NDU0lfU0NTSV9ICiMgaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiMgdW5kZWYgUkVBU1NJR05fQkxPQ0tTICAvKiBhdm9pZCBjb25mbGljdCB3aXRoIHdpbmlvY3RsLmggKi8KI2VuZGlmCiNpZmRlZiBIQVZFX1NDU0lfU0NTSV9JT0NUTF9ICiMgaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9MSU5VWF9NQUpPUl9ICiMgaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX0xJTlVYX0hEUkVHX0gKIyBpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfTElOVVhfUEFSQU1fSAojIGluY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9MSU5VWF9DRFJPTV9ICiMgaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX0xJTlVYX1VDRFJPTV9ICiMgaW5jbHVkZSA8bGludXgvdWNkcm9tLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfQ0RJT19ICiMgaW5jbHVkZSA8c3lzL2NkaW8uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19TQ1NJSU9fSAojIGluY2x1ZGUgPHN5cy9zY3NpaW8uaD4KI2VuZGlmCgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgojZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKI2luY2x1ZGUgIm50c3RhdHVzLmgiCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2ludGVybmwuaCIKI2luY2x1ZGUgIndpbmlvY3RsLmgiCiNpbmNsdWRlICJudGRkc3Rvci5oIgojaW5jbHVkZSAibnRkZGNkcm0uaCIKI2luY2x1ZGUgIm50ZGRzY3NpLmgiCiNpbmNsdWRlICJudGRsbF9taXNjLmgiCiNpbmNsdWRlICJ3aW5lL3NlcnZlci5oIgojaW5jbHVkZSAid2luZS9saWJyYXJ5LmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgovKiBOb24tTGludXggc3lzdGVtcyBkbyBub3QgaGF2ZSBsaW51eC9jZHJvbS5oIGFuZCB0aGUgbGlrZSwgYW5kIHRodXMKICAgbGFjayB0aGUgZm9sbG93aW5nIGNvbnN0YW50cy4gKi8KCiNpZm5kZWYgQ0RfU0VDUwogICNkZWZpbmUgQ0RfU0VDUyAgICAgICAgICAgICAgNjAgLyogc2Vjb25kcyBwZXIgbWludXRlICovCiNlbmRpZgojaWZuZGVmIENEX0ZSQU1FUwogICNkZWZpbmUgQ0RfRlJBTUVTICAgICAgICAgICAgNzUgLyogZnJhbWVzIHBlciBzZWNvbmQgKi8KI2VuZGlmCgovKiBkZWZpbml0aW9ucyB0YWtlbiBmcm9tIGxpYmR2ZGNzcyAqLwoKI2RlZmluZSBJT0NUTF9EVkRfQkFTRSAgICAgICAgICAgICAgICAgRklMRV9ERVZJQ0VfRFZECgojZGVmaW5lIElPQ1RMX0RWRF9TVEFSVF9TRVNTSU9OICAgICBDVExfQ09ERShJT0NUTF9EVkRfQkFTRSwgMHgwNDAwLCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfUkVBRF9BQ0NFU1MpCiNkZWZpbmUgSU9DVExfRFZEX1JFQURfS0VZICAgICAgICAgIENUTF9DT0RFKElPQ1RMX0RWRF9CQVNFLCAweDA0MDEsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9SRUFEX0FDQ0VTUykKI2RlZmluZSBJT0NUTF9EVkRfU0VORF9LRVkgICAgICAgICAgQ1RMX0NPREUoSU9DVExfRFZEX0JBU0UsIDB4MDQwMiwgTUVUSE9EX0JVRkZFUkVELCBGSUxFX1JFQURfQUNDRVNTKQojZGVmaW5lIElPQ1RMX0RWRF9FTkRfU0VTU0lPTiAgICAgICBDVExfQ09ERShJT0NUTF9EVkRfQkFTRSwgMHgwNDAzLCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfUkVBRF9BQ0NFU1MpCiNkZWZpbmUgSU9DVExfRFZEX1NFVF9SRUFEX0FIRUFEICAgIENUTF9DT0RFKElPQ1RMX0RWRF9CQVNFLCAweDA0MDQsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9SRUFEX0FDQ0VTUykKI2RlZmluZSBJT0NUTF9EVkRfR0VUX1JFR0lPTiAgICAgICAgQ1RMX0NPREUoSU9DVExfRFZEX0JBU0UsIDB4MDQwNSwgTUVUSE9EX0JVRkZFUkVELCBGSUxFX1JFQURfQUNDRVNTKQojZGVmaW5lIElPQ1RMX0RWRF9TRU5EX0tFWTIgICAgICAgICBDVExfQ09ERShJT0NUTF9EVkRfQkFTRSwgMHgwNDA2LCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfUkVBRF9BQ0NFU1MgfCBGSUxFX1dSSVRFX0FDQ0VTUykKCiNkZWZpbmUgSU9DVExfRFZEX1JFQURfU1RSVUNUVVJFICAgIENUTF9DT0RFKElPQ1RMX0RWRF9CQVNFLCAweDA0NTAsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9SRUFEX0FDQ0VTUykKCnR5cGVkZWYgZW51bSB7CiAgICBEdmRDaGFsbGVuZ2VLZXkgPSAweDAxLAogICAgRHZkQnVzS2V5MSwKICAgIER2ZEJ1c0tleTIsCiAgICBEdmRUaXRsZUtleSwKICAgIER2ZEFzZiwKICAgIER2ZFNldFJwY0tleSA9IDB4NiwKICAgIER2ZEdldFJwY0tleSA9IDB4OCwKICAgIER2ZERpc2tLZXkgPSAweDgwLAogICAgRHZkSW52YWxpZGF0ZUFHSUQgPSAweDNmCn0gRFZEX0tFWV9UWVBFOwoKdHlwZWRlZiBVTE9ORyBEVkRfU0VTU0lPTl9JRCwgKlBEVkRfU0VTU0lPTl9JRDsKCnR5cGVkZWYgc3RydWN0IF9EVkRfQ09QWV9QUk9URUNUX0tFWSB7CiAgICBVTE9ORyBLZXlMZW5ndGg7CiAgICBEVkRfU0VTU0lPTl9JRCBTZXNzaW9uSWQ7CiAgICBEVkRfS0VZX1RZUEUgS2V5VHlwZTsKICAgIFVMT05HIEtleUZsYWdzOwogICAgdW5pb24gewogICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgIFVMT05HIEZpbGVIYW5kbGU7CiAgICAgICAgICAgIFVMT05HIFJlc2VydmVkOyAgIC8qIHVzZWQgZm9yIE5UIGFsaWdubWVudCAqLwogICAgICAgIH0gczsKICAgICAgICBMQVJHRV9JTlRFR0VSIFRpdGxlT2Zmc2V0OwogICAgfSBQYXJhbWV0ZXJzOwogICAgVUNIQVIgS2V5RGF0YVsxXTsKfSBEVkRfQ09QWV9QUk9URUNUX0tFWSwgKlBEVkRfQ09QWV9QUk9URUNUX0tFWTsKCnR5cGVkZWYgc3RydWN0IF9EVkRfUlBDX0tFWSB7CiAgICBVQ0hBUiBVc2VyUmVzZXRzQXZhaWxhYmxlOjM7CiAgICBVQ0hBUiBNYW51ZmFjdHVyZXJSZXNldHNBdmFpbGFibGU6MzsKICAgIFVDSEFSIFR5cGVDb2RlOjI7CiAgICBVQ0hBUiBSZWdpb25NYXNrOwogICAgVUNIQVIgUnBjU2NoZW1lOwogICAgVUNIQVIgUmVzZXJ2ZWQyWzFdOwp9IERWRF9SUENfS0VZLCAqIFBEVkRfUlBDX0tFWTsKCnR5cGVkZWYgc3RydWN0IF9EVkRfQVNGIHsKICAgIFVDSEFSIFJlc2VydmVkMFszXTsKICAgIFVDSEFSIFN1Y2Nlc3NGbGFnOjE7CiAgICBVQ0hBUiBSZXNlcnZlZDE6NzsKfSBEVkRfQVNGLCAqIFBEVkRfQVNGOwoKdHlwZWRlZiBzdHJ1Y3QgX0RWRF9SRUdJT04KewogICAgICAgIHVuc2lnbmVkIGNoYXIgY29weV9zeXN0ZW07CiAgICAgICAgdW5zaWduZWQgY2hhciByZWdpb25fZGF0YTsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWVkaWEgcmVnaW9uIChub3QgcGxheWFibGUgd2hlbiBzZXQpICovCiAgICAgICAgdW5zaWduZWQgY2hhciBzeXN0ZW1fcmVnaW9uOyAgICAvKiBjdXJyZW50IGRyaXZlIHJlZ2lvbiAocGxheWFibGUgd2hlbiBzZXQpICovCiAgICAgICAgdW5zaWduZWQgY2hhciByZXNldF9jb3VudDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZXNldHMgYXZhaWxhYmxlICovCn0gRFZEX1JFR0lPTiwgKiBQRFZEX1JFR0lPTjsKCnR5cGVkZWYgc3RydWN0IF9EVkRfUkVBRF9TVFJVQ1RVUkUgewogICAgICAgIC8qIENvbnRhaW5zIGFuIG9mZnNldCB0byB0aGUgbG9naWNhbCBibG9jayBhZGRyZXNzIG9mIHRoZSBkZXNjcmlwdG9yIHRvIGJlIHJldHJpZXZlZC4gKi8KICAgICAgICBMQVJHRV9JTlRFR0VSIGJsb2NrX2J5dGVfb2Zmc2V0OwoKICAgICAgICAvKiAwOlBoeXNpY2FsIGRlc2NyaXB0b3IsIDE6Q29weXJpZ2h0IGRlc2NyaXB0b3IsIDI6RGlzayBrZXkgZGVzY3JpcHRvcgogICAgICAgICAgIDM6QkNBIGRlc2NyaXB0b3IsIDQ6TWFudWZhY3R1cmVyIGRlc2NyaXB0b3IsIDU6TWF4IGRlc2NyaXB0b3IKICAgICAgICAgKi8KICAgICAgICBsb25nIGZvcm1hdDsKCiAgICAgICAgLyogU2Vzc2lvbiBJRCwgdGhhdCBpcyBvYnRhaW5lZCBieSBJT0NUTF9EVkRfU1RBUlRfU0VTU0lPTiAqLwogICAgICAgIGxvbmcgc2Vzc2lvbjsKCiAgICAgICAgLyogRnJvbSAwIHRvIDQgKi8KICAgICAgICB1bnNpZ25lZCBjaGFyIGxheWVyX25vOwp9RFZEX1JFQURfU1RSVUNUVVJFLCAqIFBEVkRfUkVBRF9TVFJVQ1RVUkU7Cgp0eXBlZGVmIHN0cnVjdCBfRFZEX0xBWUVSX0RFU0NSSVBUT1IKewogICAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwoKICAgICAgICB1bnNpZ25lZCBjaGFyIGJvb2tfdmVyc2lvbiA6IDQ7CgogICAgICAgIC8qIDA6RFZELVJPTSwgMTpEVkQtUkFNLCAyOkRWRC1SLCAzOkRWRC1SVywgOTpEVkQtUlcgKi8KICAgICAgICB1bnNpZ25lZCBjaGFyIGJvb2tfdHlwZSA6IDQ7CgogICAgICAgIHVuc2lnbmVkIGNoYXIgbWluaW11bV9yYXRlIDogNDsKCiAgICAgICAgLyogVGhlIHBoeXNpY2FsIHNpemUgb2YgdGhlIG1lZGlhLiAwOjEyMCBtbSwgMTo4MCBtbS4gKi8KICAgIHVuc2lnbmVkIGNoYXIgZGlza19zaXplIDogNDsKCiAgICAvKiAxOlJlYWQtb25seSBsYXllciwgMjpSZWNvcmRhYmxlIGxheWVyLCA0OlJld3JpdGFibGUgbGF5ZXIgKi8KICAgICAgICB1bnNpZ25lZCBjaGFyIGxheWVyX3R5cGUgOiA0OwoKICAgICAgICAvKiAwOnBhcmFsbGVsIHRyYWNrIHBhdGgsIDE6b3Bwb3NpdGUgdHJhY2sgcGF0aCAqLwogICAgdW5zaWduZWQgY2hhciB0cmFja19wYXRoIDogMTsKCiAgICAgICAgLyogMDpvbmUgbGF5ZXJzLCAxOnR3byBsYXllcnMsIGFuZCBzbyBvbiAqLwogICAgdW5zaWduZWQgY2hhciBudW1fb2ZfbGF5ZXJzIDogMjsKCiAgICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkMSA6IDE7CgogICAgICAgIC8qIDA6MC43NCC1bS90cmFjaywgMTowLjgwILVtL3RyYWNrLCAyOjAuNjE1ILVtL3RyYWNrICovCiAgICB1bnNpZ25lZCBjaGFyIHRyYWNrX2RlbnNpdHkgOiA0OwoKICAgICAgICAvKiAwOjAuMjY3ILVtL2JpdCwgMTowLjI5MyC1bS9iaXQsIDI6MC40MDkgdG8gMC40MzUgtW0vYml0LCA0OjAuMjgwIHRvIDAuMjkxILVtL2JpdCwgODowLjM1MyC1bS9iaXQgKi8KICAgIHVuc2lnbmVkIGNoYXIgbGluZWFyX2RlbnNpdHkgOiA0OwoKICAgICAgICAvKiBNdXN0IGJlIGVpdGhlciAweDMwMDAwOkRWRC1ST00gb3IgRFZELVIvLVJXIG9yIDB4MzEwMDA6RFZELVJBTSBvciBEVkQrUlcgKi8KICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRpbmdfZGF0YV9zZWN0b3I7CgogICAgdW5zaWduZWQgbG9uZyBlbmRfZGF0YV9zZWN0b3I7CiAgICB1bnNpZ25lZCBsb25nIGVuZF9sYXllcl96ZXJvX3NlY3RvcjsKICAgIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ1IDogNzsKCiAgICAgICAgLyogMCBpbmRpY2F0ZXMgbm8gQkNBIGRhdGEgKi8KICAgICAgICB1bnNpZ25lZCBjaGFyIEJDQV9mbGFnIDogMTsKCiAgICAgICAgdW5zaWduZWQgY2hhciByZXNlcnZlZDY7Cn1EVkRfTEFZRVJfREVTQ1JJUFRPUiwgKiBQRFZEX0xBWUVSX0RFU0NSSVBUT1I7Cgp0eXBlZGVmIHN0cnVjdCBfRFZEX0NPUFlSSUdIVF9ERVNDUklQVE9SCnsKICAgICAgICB1bnNpZ25lZCBjaGFyIHByb3RlY3Rpb247CiAgICB1bnNpZ25lZCBjaGFyIHJlZ2lvbjsKICAgIHVuc2lnbmVkIHNob3J0IHJlc2VydmVkOwp9RFZEX0NPUFlSSUdIVF9ERVNDUklQVE9SLCAqIFBEVkRfQ09QWVJJR0hUX0RFU0NSSVBUT1I7Cgp0eXBlZGVmIHN0cnVjdCBfRFZEX01BTlVGQUNUVVJFUl9ERVNDUklQVE9SCnsKICAgICAgICB1bnNpZ25lZCBjaGFyIG1hbnVmYWN0dXJpbmdbMjA0OF07Cn1EVkRfTUFOVUZBQ1RVUkVSX0RFU0NSSVBUT1IsICogUERWRF9NQU5VRkFDVFVSRVJfREVTQ1JJUFRPUjsKCiNkZWZpbmUgRFZEX0NIQUxMRU5HRV9LRVlfTEVOR1RIICAgICgxMiArIHNpemVvZihEVkRfQ09QWV9QUk9URUNUX0tFWSkgLSBzaXplb2YoVUNIQVIpKQoKI2RlZmluZSBEVkRfRElTS19LRVlfTEVOR1RIICAgICAgICAgKDIwNDggKyBzaXplb2YoRFZEX0NPUFlfUFJPVEVDVF9LRVkpIC0gc2l6ZW9mKFVDSEFSKSkKCiNkZWZpbmUgRFZEX0tFWV9TSVpFIDUKI2RlZmluZSBEVkRfQ0hBTExFTkdFX1NJWkUgMTAKI2RlZmluZSBEVkRfRElTQ0tFWV9TSVpFIDIwNDgKI2RlZmluZSBEVkRfU0VDVE9SX1BST1RFQ1RFRCAgICAgICAgICAgIDB4MDAwMDAwMjAKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgaW9jb2RleHMKewogIERXT1JEIGNvZGU7CiAgY29uc3QgY2hhciAqY29kZXg7Cn0gaW9jb2RleHRhYmxlW10gPSB7CiNkZWZpbmUgWCh4KSB7IHgsICN4IH0sClgoSU9DVExfQ0RST01fQ0hFQ0tfVkVSSUZZKQpYKElPQ1RMX0NEUk9NX0NVUlJFTlRfUE9TSVRJT04pClgoSU9DVExfQ0RST01fRElTS19UWVBFKQpYKElPQ1RMX0NEUk9NX0dFVF9DT05UUk9MKQpYKElPQ1RMX0NEUk9NX0dFVF9EUklWRV9HRU9NRVRSWSkKWChJT0NUTF9DRFJPTV9HRVRfVk9MVU1FKQpYKElPQ1RMX0NEUk9NX0xPQURfTUVESUEpClgoSU9DVExfQ0RST01fTUVESUFfQ0FUQUxPRykKWChJT0NUTF9DRFJPTV9NRURJQV9SRU1PVkFMKQpYKElPQ1RMX0NEUk9NX1BBVVNFX0FVRElPKQpYKElPQ1RMX0NEUk9NX1BMQVlfQVVESU9fTVNGKQpYKElPQ1RMX0NEUk9NX1JBV19SRUFEKQpYKElPQ1RMX0NEUk9NX1JFQURfUV9DSEFOTkVMKQpYKElPQ1RMX0NEUk9NX1JFQURfVE9DKQpYKElPQ1RMX0NEUk9NX1JFU1VNRV9BVURJTykKWChJT0NUTF9DRFJPTV9TRUVLX0FVRElPX01TRikKWChJT0NUTF9DRFJPTV9TRVRfVk9MVU1FKQpYKElPQ1RMX0NEUk9NX1NUT1BfQVVESU8pClgoSU9DVExfQ0RST01fVFJBQ0tfSVNSQykKWChJT0NUTF9ESVNLX01FRElBX1JFTU9WQUwpClgoSU9DVExfRFZEX0VORF9TRVNTSU9OKQpYKElPQ1RMX0RWRF9HRVRfUkVHSU9OKQpYKElPQ1RMX0RWRF9SRUFEX0tFWSkKWChJT0NUTF9EVkRfUkVBRF9TVFJVQ1RVUkUpClgoSU9DVExfRFZEX1NFTkRfS0VZKQpYKElPQ1RMX0RWRF9TVEFSVF9TRVNTSU9OKQpYKElPQ1RMX1NDU0lfR0VUX0FERFJFU1MpClgoSU9DVExfU0NTSV9HRVRfQ0FQQUJJTElUSUVTKQpYKElPQ1RMX1NDU0lfUEFTU19USFJPVUdIKQpYKElPQ1RMX1NDU0lfUEFTU19USFJPVUdIX0RJUkVDVCkKWChJT0NUTF9TVE9SQUdFX0NIRUNLX1ZFUklGWSkKWChJT0NUTF9TVE9SQUdFX0VKRUNUSU9OX0NPTlRST0wpClgoSU9DVExfU1RPUkFHRV9FSkVDVF9NRURJQSkKWChJT0NUTF9TVE9SQUdFX0dFVF9ERVZJQ0VfTlVNQkVSKQpYKElPQ1RMX1NUT1JBR0VfTE9BRF9NRURJQSkKWChJT0NUTF9TVE9SQUdFX01FRElBX1JFTU9WQUwpClgoSU9DVExfU1RPUkFHRV9SRVNFVF9ERVZJQ0UpCiN1bmRlZiBYCn07CnN0YXRpYyBjb25zdCBjaGFyICppb2NvZGV4KERXT1JEIGNvZGUpCnsKICAgdW5zaWduZWQgaW50IGk7CiAgIHN0YXRpYyBjaGFyIGJ1ZmZlclsyNV07CiAgIGZvcihpPTA7IGk8c2l6ZW9mKGlvY29kZXh0YWJsZSkvc2l6ZW9mKHN0cnVjdCBpb2NvZGV4cyk7IGkrKykKICAgICAgaWYgKGNvZGU9PWlvY29kZXh0YWJsZVtpXS5jb2RlKQoJIHJldHVybiBpb2NvZGV4dGFibGVbaV0uY29kZXg7CiAgIHNwcmludGYoYnVmZmVyLCAiSU9DVExfQ09ERV8leCIsIChpbnQpY29kZSk7CiAgIHJldHVybiBidWZmZXI7Cn0KCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGNkcm9tKTsKCiNkZWZpbmUgRlJBTUVfT0ZfQUREUihhKSAoKChpbnQpKGEpWzFdICogQ0RfU0VDUyArIChhKVsyXSkgKiBDRF9GUkFNRVMgKyAoYSlbM10pCiNkZWZpbmUgRlJBTUVfT0ZfTVNGKGEpICgoKGludCkoYSkuTSAqIENEX1NFQ1MgKyAoYSkuUykgKiBDRF9GUkFNRVMgKyAoYSkuRikKI2RlZmluZSBGUkFNRV9PRl9UT0ModG9jLCBpZHgpICBGUkFNRV9PRl9BRERSKCh0b2MpLlRyYWNrRGF0YVtpZHggLSAodG9jKS5GaXJzdFRyYWNrXS5BZGRyZXNzKQojZGVmaW5lIE1TRl9PRl9GUkFNRShtLGZyKSB7aW50IGY9KGZyKTsgKChVQ0hBUiAqKSYobSkpWzJdPWYlQ0RfRlJBTUVTO2YvPUNEX0ZSQU1FUzsoKFVDSEFSICopJihtKSlbMV09ZiVDRF9TRUNTOygoVUNIQVIgKikmKG0pKVswXT1mL0NEX1NFQ1M7fQoKc3RhdGljIE5UU1RBVFVTIENEUk9NX1JlYWRUT0MoaW50LCBpbnQsIENEUk9NX1RPQyopOwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fR2V0U3RhdHVzQ29kZShpbnQpOwoKCiNpZmRlZiBsaW51eAoKIyBpZm5kZWYgSURFNl9NQUpPUgojICBkZWZpbmUgSURFNl9NQUpPUiA4OAojIGVuZGlmCiMgaWZuZGVmIElERTdfTUFKT1IKIyAgZGVmaW5lIElERTdfTUFKT1IgODkKIyBlbmRpZgoKIyBpZmRlZiBDRFJPTV9TRU5EX1BBQ0tFVAovKiBzdHJ1Y3R1cmUgZm9yIENEUk9NX1BBQ0tFVF9DT01NQU5EIGlvY3RsICovCi8qIG5vdCBhbGwgTGludXggdmVyc2lvbnMgaGF2ZSBhbGwgdGhlIGZpZWxkcywgc28gd2UgZGVmaW5lIHRoZQogKiBzdHJ1Y3R1cmUgb3Vyc2VsdmVzIHRvIG1ha2Ugc3VyZSAqLwpzdHJ1Y3QgbGludXhfY2Ryb21fZ2VuZXJpY19jb21tYW5kCnsKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgY21kW0NEUk9NX1BBQ0tFVF9TSVpFXTsKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAqYnVmZmVyOwogICAgdW5zaWduZWQgaW50ICAgICAgICAgICBidWZsZW47CiAgICBpbnQgICAgICAgICAgICAgICAgICAgIHN0YXQ7CiAgICBzdHJ1Y3QgcmVxdWVzdF9zZW5zZSAgKnNlbnNlOwogICAgdW5zaWduZWQgY2hhciAgICAgICAgICBkYXRhX2RpcmVjdGlvbjsKICAgIGludCAgICAgICAgICAgICAgICAgICAgcXVpZXQ7CiAgICBpbnQgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ7CiAgICB2b2lkICAgICAgICAgICAgICAgICAgKnJlc2VydmVkWzFdOwp9OwojIGVuZGlmICAvKiBDRFJPTV9TRU5EX1BBQ0tFVCAqLwoKI2VuZGlmICAvKiBsaW51eCAqLwoKLyogRklYTUU6IHRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgY2FuJ3Qgb3BlbiBzaW11bHRhbmVvdXNseSBzZXZlcmFsIHRpbWVzIC9kZXYvY2Ryb20KICogdGhpcyBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIGEgcHJvcGVyIGRldmljZSBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQKICogCiAqIChXUykgV2UgbmVlZCB0aGlzIHRvIGtlZXAgdHJhY2sgb2YgY3VycmVudCBwb3NpdGlvbiBhbmQgdG8gc2FmZWx5CiAqIGRldGVjdCBtZWRpYSBjaGFuZ2VzLiBCZXNpZGVzIHRoaXMgc2hvdWxkIHByb3ZpZGUgYSBncmVhdCBzcGVlZCB1cAogKiBmb3IgdG9jIGlucXVpcmllcy4KICovCnN0cnVjdCBjZHJvbV9jYWNoZSB7CiAgICBkZXZfdCAgICAgICBkZXZpY2U7CiAgICBpbm9fdCAgICAgICBpbm9kZTsKICAgIGNoYXIgICAgICAgIHRvY19nb29kOyAvKiBpZiBmYWxzZSwgd2lsbCByZXJlYWQgVE9DIGZyb20gZGlzayAqLwogICAgQ0RST01fVE9DICAgdG9jOwogICAgU1VCX1FfQ1VSUkVOVF9QT1NJVElPTiBDdXJyZW50UG9zaXRpb247Cn07Ci8qIHdobyBoYXMgbW9yZSB0aGFuIDUgY2Ryb21zIG9uIGhpcy9oZXIgbWFjaGluZSA/PyAqLwovKiBGSVhNRTogdGhpcyBzaG91bGQgZ3JvdyBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBjZHJvbXMgd2UgaW5zdGFsbC9jb25maWd1cmUgCiAqIGF0IHN0YXJ0dXAKICovCiNkZWZpbmUgTUFYX0NBQ0hFX0VOVFJJRVMgICAgICAgNQpzdGF0aWMgc3RydWN0IGNkcm9tX2NhY2hlIGNkcm9tX2NhY2hlW01BWF9DQUNIRV9FTlRSSUVTXTsKCnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIGNhY2hlX3NlY3Rpb247CnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OX0RFQlVHIGNyaXRzZWN0X2RlYnVnID0KewogICAgMCwgMCwgJmNhY2hlX3NlY3Rpb24sCiAgICB7ICZjcml0c2VjdF9kZWJ1Zy5Qcm9jZXNzTG9ja3NMaXN0LCAmY3JpdHNlY3RfZGVidWcuUHJvY2Vzc0xvY2tzTGlzdCB9LAogICAgICAwLCAwLCB7IDAsIChEV09SRCkoX19GSUxFX18gIjogY2FjaGVfc2VjdGlvbiIpIH0KfTsKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gY2FjaGVfc2VjdGlvbiA9IHsgJmNyaXRzZWN0X2RlYnVnLCAtMSwgMCwgMCwgMCwgMCB9OwoKLyogUHJvcG9zZWQgbWVkaWEgY2hhbmdlIGZ1bmN0aW9uOiBub3QgcmVhbGx5IG5lZWRlZCBhdCB0aGlzIHRpbWUgKi8KLyogVGhpcyBpcyBhIDEgb3IgMCB0eXBlIG9mIGZ1bmN0aW9uICovCiNpZiAwCnN0YXRpYyBpbnQgQ0RST01fTWVkaWFDaGFuZ2VkKGludCBkZXYpCnsKICAgaW50IGk7CgogICBzdHJ1Y3QgY2Ryb21fdG9jaGRyCWhkcjsKICAgc3RydWN0IGNkcm9tX3RvY2VudHJ5IGVudHJ5OwoKICAgaWYgKGRldiA8IDAgfHwgZGV2ID49IE1BWF9DQUNIRV9FTlRSSUVTKQogICAgICByZXR1cm4gMDsKICAgaWYgKCBpb2N0bChjZHJvbV9jYWNoZVtkZXZdLmZkLCBDRFJPTVJFQURUT0NIRFIsICZoZHIpID09IC0xICkKICAgICAgcmV0dXJuIDA7CgogICBpZiAoIG1lbWNtcCgmaGRyLCAmY2Ryb21fY2FjaGVbZGV2XS5oZHIsIHNpemVvZihzdHJ1Y3QgY2Ryb21fdG9jaGRyKSkgKQogICAgICByZXR1cm4gMTsKCiAgIGZvciAoaT1oZHIuY2R0aF90cmswOyBpPD1oZHIuY2R0aF90cmsxKzE7IGkrKykKICAgewogICAgICBpZiAoaSA9PSBoZHIuY2R0aF90cmsxICsgMSkKICAgICAgewoJIGVudHJ5LmNkdGVfdHJhY2sgPSBDRFJPTV9MRUFET1VUOwogICAgICB9IGVsc2UgewogICAgICAgICBlbnRyeS5jZHRlX3RyYWNrID0gaTsKICAgICAgfQogICAgICBlbnRyeS5jZHRlX2Zvcm1hdCA9IENEUk9NX01TRjsKICAgICAgaWYgKCBpb2N0bChjZHJvbV9jYWNoZVtkZXZdLmZkLCBDRFJPTVJFQURUT0NFTlRSWSwgJmVudHJ5KSA9PSAtMSkKCSByZXR1cm4gMDsKICAgICAgaWYgKCBtZW1jbXAoJmVudHJ5LCBjZHJvbV9jYWNoZVtkZXZdLmVudHJ5K2ktaGRyLmNkdGhfdHJrMCwKCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBjZHJvbV90b2NlbnRyeSkpICkKCSByZXR1cm4gMTsKICAgfQogICByZXR1cm4gMDsKfQojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX1N5bmNDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgW2ludGVybmFsXQogKgogKiBSZWFkIHRoZSBUT0MgaW4gYW5kIHN0b3JlIGl0IGluIHRoZSBjZHJvbV9jYWNoZSBzdHJ1Y3R1cmUuCiAqIEZ1cnRoZXIgcmVxdWVzdHMgZm9yIHRoZSBUT0Mgd2lsbCBiZSBjb3BpZWQgZnJvbSB0aGUgY2FjaGUKICogdW5sZXNzIGNlcnRhaW4gZXZlbnRzIGxpa2UgZGlzayBlamVjdGlvbiBpcyBkZXRlY3RlZCwgaW4gd2hpY2gKICogY2FzZSB0aGUgY2FjaGUgd2lsbCBiZSBjbGVhcmVkLCBjYXVzaW5nIGl0IHRvIGJlIHJlc3luY2VkLgogKiBUaGUgY2FjaGUgc2VjdGlvbiBtdXN0IGJlIGhlbGQgYnkgY2FsbGVyLgogKi8Kc3RhdGljIGludCBDRFJPTV9TeW5jQ2FjaGUoaW50IGRldiwgaW50IGZkKQp7CiAgIGludCBpLCBpbyA9IDAsIHRzejsKI2lmZGVmIGxpbnV4CiAgIHN0cnVjdCBjZHJvbV90b2NoZHIJCWhkcjsKICAgc3RydWN0IGNkcm9tX3RvY2VudHJ5CWVudHJ5OwojZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCiAgIHN0cnVjdCBpb2NfdG9jX2hlYWRlcgloZHI7CiAgIHN0cnVjdCBpb2NfcmVhZF90b2NfZW50cnkJZW50cnk7CiAgIHN0cnVjdCBjZF90b2NfZW50cnkgICAgICAgICB0b2NfYnVmZmVyOwojZW5kaWYKICAgQ0RST01fVE9DICp0b2MgPSAmY2Ryb21fY2FjaGVbZGV2XS50b2M7CiAgIGNkcm9tX2NhY2hlW2Rldl0udG9jX2dvb2QgPSAwOwoKI2lmZGVmIGxpbnV4CgogICBpbyA9IGlvY3RsKGZkLCBDRFJPTVJFQURUT0NIRFIsICZoZHIpOwogICBpZiAoaW8gPT0gLTEpCiAgIHsKICAgICAgV0FSTigiKCVkKSAtLSBFcnJvciBvY2N1cnJlZCAoJXMpIVxuIiwgZGV2LCBzdHJlcnJvcihlcnJubykpOwogICAgICBnb3RvIGVuZDsKICAgfQoKICAgdG9jLT5GaXJzdFRyYWNrID0gaGRyLmNkdGhfdHJrMDsKICAgdG9jLT5MYXN0VHJhY2sgID0gaGRyLmNkdGhfdHJrMTsKICAgdHN6ID0gc2l6ZW9mKHRvYy0+Rmlyc3RUcmFjaykgKyBzaXplb2YodG9jLT5MYXN0VHJhY2spCiAgICAgICArIHNpemVvZihUUkFDS19EQVRBKSAqICh0b2MtPkxhc3RUcmFjay10b2MtPkZpcnN0VHJhY2srMik7CiAgIHRvYy0+TGVuZ3RoWzBdID0gdHN6ID4+IDg7CiAgIHRvYy0+TGVuZ3RoWzFdID0gdHN6OwoKICAgVFJBQ0UoImNhY2hpbmcgdG9jIGZyb209JWQgdG89JWRcbiIsIHRvYy0+Rmlyc3RUcmFjaywgdG9jLT5MYXN0VHJhY2sgKTsKCiAgIGZvciAoaSA9IHRvYy0+Rmlyc3RUcmFjazsgaSA8PSB0b2MtPkxhc3RUcmFjayArIDE7IGkrKykKICAgewogICAgIGlmIChpID09IHRvYy0+TGFzdFRyYWNrICsgMSkKICAgICAgIGVudHJ5LmNkdGVfdHJhY2sgPSBDRFJPTV9MRUFET1VUOwogICAgIGVsc2UgCiAgICAgICBlbnRyeS5jZHRlX3RyYWNrID0gaTsKICAgICBlbnRyeS5jZHRlX2Zvcm1hdCA9IENEUk9NX01TRjsKICAgICBpbyA9IGlvY3RsKGZkLCBDRFJPTVJFQURUT0NFTlRSWSwgJmVudHJ5KTsKICAgICBpZiAoaW8gPT0gLTEpIHsKICAgICAgIFdBUk4oImVycm9yIHJlYWQgZW50cnkgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgIGdvdG8gZW5kOwogICAgIH0KICAgICB0b2MtPlRyYWNrRGF0YVtpIC0gdG9jLT5GaXJzdFRyYWNrXS5Db250cm9sID0gZW50cnkuY2R0ZV9jdHJsOwogICAgIHRvYy0+VHJhY2tEYXRhW2kgLSB0b2MtPkZpcnN0VHJhY2tdLkFkciA9IGVudHJ5LmNkdGVfYWRyOwogICAgIC8qIG1hcmtpbmcgbGFzdCB0cmFjayB3aXRoIGxlYWRvdXQgdmFsdWUgYXMgaW5kZXggKi8KICAgICB0b2MtPlRyYWNrRGF0YVtpIC0gdG9jLT5GaXJzdFRyYWNrXS5UcmFja051bWJlciA9IGVudHJ5LmNkdGVfdHJhY2s7CiAgICAgdG9jLT5UcmFja0RhdGFbaSAtIHRvYy0+Rmlyc3RUcmFja10uQWRkcmVzc1swXSA9IDA7CiAgICAgdG9jLT5UcmFja0RhdGFbaSAtIHRvYy0+Rmlyc3RUcmFja10uQWRkcmVzc1sxXSA9IGVudHJ5LmNkdGVfYWRkci5tc2YubWludXRlOwogICAgIHRvYy0+VHJhY2tEYXRhW2kgLSB0b2MtPkZpcnN0VHJhY2tdLkFkZHJlc3NbMl0gPSBlbnRyeS5jZHRlX2FkZHIubXNmLnNlY29uZDsKICAgICB0b2MtPlRyYWNrRGF0YVtpIC0gdG9jLT5GaXJzdFRyYWNrXS5BZGRyZXNzWzNdID0gZW50cnkuY2R0ZV9hZGRyLm1zZi5mcmFtZTsKICAgIH0KICAgIGNkcm9tX2NhY2hlW2Rldl0udG9jX2dvb2QgPSAxOwogICAgaW8gPSAwOwojZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCgogICAgaW8gPSBpb2N0bChmZCwgQ0RJT1JFQURUT0NIRUFERVIsICZoZHIpOwogICAgaWYgKGlvID09IC0xKQogICAgewogICAgICAgIFdBUk4oIiglZCkgLS0gRXJyb3Igb2NjdXJyZWQgKCVzKSFcbiIsIGRldiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICBnb3RvIGVuZDsKICAgIH0KICAgIHRvYy0+Rmlyc3RUcmFjayA9IGhkci5zdGFydGluZ190cmFjazsKICAgIHRvYy0+TGFzdFRyYWNrICA9IGhkci5lbmRpbmdfdHJhY2s7CiAgICB0c3ogPSBzaXplb2YodG9jLT5GaXJzdFRyYWNrKSArIHNpemVvZih0b2MtPkxhc3RUcmFjaykKICAgICAgICArIHNpemVvZihUUkFDS19EQVRBKSAqICh0b2MtPkxhc3RUcmFjay10b2MtPkZpcnN0VHJhY2srMik7CiAgICB0b2MtPkxlbmd0aFswXSA9IHRzeiA+PiA4OwogICAgdG9jLT5MZW5ndGhbMV0gPSB0c3o7CgogICAgVFJBQ0UoImNhY2hpbmcgdG9jIGZyb209JWQgdG89JWRcbiIsIHRvYy0+Rmlyc3RUcmFjaywgdG9jLT5MYXN0VHJhY2sgKTsKCiAgICBmb3IgKGkgPSB0b2MtPkZpcnN0VHJhY2s7IGkgPD0gdG9jLT5MYXN0VHJhY2sgKyAxOyBpKyspCiAgICB7CglpZiAoaSA9PSB0b2MtPkxhc3RUcmFjayArIDEpCiAgICAgICAgewojZGVmaW5lIExFQURPVVQgMHhhYQoJICAgIGVudHJ5LnN0YXJ0aW5nX3RyYWNrID0gTEVBRE9VVDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlbnRyeS5zdGFydGluZ190cmFjayA9IGk7CiAgICAgICAgfQoJbWVtc2V0KChjaGFyICopJnRvY19idWZmZXIsIDAsIHNpemVvZih0b2NfYnVmZmVyKSk7CgllbnRyeS5hZGRyZXNzX2Zvcm1hdCA9IENEX01TRl9GT1JNQVQ7CgllbnRyeS5kYXRhX2xlbiA9IHNpemVvZih0b2NfYnVmZmVyKTsKCWVudHJ5LmRhdGEgPSAmdG9jX2J1ZmZlcjsKCWlvID0gaW9jdGwoZmQsIENESU9SRUFEVE9DRU5UUllTLCAmZW50cnkpOwoJaWYgKGlvID09IC0xKSB7CgkgICAgV0FSTigiZXJyb3IgcmVhZCBlbnRyeSAoJXMpXG4iLCBzdHJlcnJvcihlcnJubykpOwoJICAgIGdvdG8gZW5kOwoJfQogICAgICAgIHRvYy0+VHJhY2tEYXRhW2kgLSB0b2MtPkZpcnN0VHJhY2tdLkNvbnRyb2wgPSB0b2NfYnVmZmVyLmNvbnRyb2w7CiAgICAgICAgdG9jLT5UcmFja0RhdGFbaSAtIHRvYy0+Rmlyc3RUcmFja10uQWRyID0gdG9jX2J1ZmZlci5hZGRyX3R5cGU7CiAgICAgICAgLyogbWFya2luZyBsYXN0IHRyYWNrIHdpdGggbGVhZG91dCB2YWx1ZSBhcyBpbmRleCAqLwogICAgICAgIHRvYy0+VHJhY2tEYXRhW2kgLSB0b2MtPkZpcnN0VHJhY2tdLlRyYWNrTnVtYmVyID0gZW50cnkuc3RhcnRpbmdfdHJhY2s7CiAgICAgICAgdG9jLT5UcmFja0RhdGFbaSAtIHRvYy0+Rmlyc3RUcmFja10uQWRkcmVzc1swXSA9IDA7CiAgICAgICAgdG9jLT5UcmFja0RhdGFbaSAtIHRvYy0+Rmlyc3RUcmFja10uQWRkcmVzc1sxXSA9IHRvY19idWZmZXIuYWRkci5tc2YubWludXRlOwogICAgICAgIHRvYy0+VHJhY2tEYXRhW2kgLSB0b2MtPkZpcnN0VHJhY2tdLkFkZHJlc3NbMl0gPSB0b2NfYnVmZmVyLmFkZHIubXNmLnNlY29uZDsKICAgICAgICB0b2MtPlRyYWNrRGF0YVtpIC0gdG9jLT5GaXJzdFRyYWNrXS5BZGRyZXNzWzNdID0gdG9jX2J1ZmZlci5hZGRyLm1zZi5mcmFtZTsKICAgIH0KICAgIGNkcm9tX2NhY2hlW2Rldl0udG9jX2dvb2QgPSAxOwogICAgaW8gPSAwOwojZWxzZQogICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwojZW5kaWYKZW5kOgogICAgcmV0dXJuIENEUk9NX0dldFN0YXR1c0NvZGUoaW8pOwp9CgpzdGF0aWMgdm9pZCBDRFJPTV9DbGVhckNhY2hlRW50cnkoaW50IGRldikKewogICAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24oICZjYWNoZV9zZWN0aW9uICk7CiAgICBjZHJvbV9jYWNoZVtkZXZdLnRvY19nb29kID0gMDsKICAgIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmY2FjaGVfc2VjdGlvbiApOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX0dldEludGVyZmFjZUluZm8KICoKICogRGV0ZXJtaW5lcyB0aGUgaWRlIGludGVyZmFjZSAodGhlIG51bWJlciBhZnRlciB0aGUgaWRlKSwgYW5kIHRoZQogKiBudW1iZXIgb2YgdGhlIGRldmljZSBvbiB0aGF0IGludGVyZmFjZSBmb3IgaWRlIGNkcm9tcyAoKnBvcnQgPT0gMCkuCiAqIERldGVybWluZXMgdGhlIHNjc2kgaW5mb3JtYXRpb24gZm9yIHNjc2kgY2Ryb21zICgqcG9ydCA+PSAxKS4KICogUmV0dXJucyBmYWxzZSBpZiB0aGUgaW5mbyBjYW5ub3Qgbm90IGJlIG9idGFpbmVkLgogKi8Kc3RhdGljIGludCBDRFJPTV9HZXRJbnRlcmZhY2VJbmZvKGludCBmZCwgaW50KiBwb3J0LCBpbnQqIGlmYWNlLCBpbnQqIGRldmljZSxpbnQqIGx1bikKewojaWYgZGVmaW5lZChsaW51eCkKICAgIHN0cnVjdCBzdGF0IHN0OwogICAgaWYgKCBmc3RhdChmZCwgJnN0KSA9PSAtMSB8fCAhIFNfSVNCTEsoc3Quc3RfbW9kZSkpIHJldHVybiAwOwogICAgKnBvcnQgPSAwOwogICAgKmlmYWNlID0gMDsKICAgICpkZXZpY2UgPSAwOwogICAgKmx1biA9IDA7CiAgICBzd2l0Y2ggKG1ham9yKHN0LnN0X3JkZXYpKSB7CiAgICBjYXNlIElERTBfTUFKT1I6ICppZmFjZSA9IDA7IGJyZWFrOwogICAgY2FzZSBJREUxX01BSk9SOiAqaWZhY2UgPSAxOyBicmVhazsKICAgIGNhc2UgSURFMl9NQUpPUjogKmlmYWNlID0gMjsgYnJlYWs7CiAgICBjYXNlIElERTNfTUFKT1I6ICppZmFjZSA9IDM7IGJyZWFrOwogICAgY2FzZSBJREU0X01BSk9SOiAqaWZhY2UgPSA0OyBicmVhazsKICAgIGNhc2UgSURFNV9NQUpPUjogKmlmYWNlID0gNTsgYnJlYWs7CiAgICBjYXNlIElERTZfTUFKT1I6ICppZmFjZSA9IDY7IGJyZWFrOwogICAgY2FzZSBJREU3X01BSk9SOiAqaWZhY2UgPSA3OyBicmVhazsKICAgIGRlZmF1bHQ6ICpwb3J0ID0gMTsgYnJlYWs7CiAgICB9CgogICAgaWYgKCpwb3J0ID09IDApCiAgICAgICAgKmRldmljZSA9IChtaW5vcihzdC5zdF9yZGV2KSA+PiA2KTsKICAgIGVsc2UKICAgIHsKI2lmZGVmIFNDU0lfSU9DVExfR0VUX0lETFVOCiAgICAgICAgVUlOVDMyIGlkbHVuWzJdOwogICAgICAgIGlmIChpb2N0bChmZCwgU0NTSV9JT0NUTF9HRVRfSURMVU4sICZpZGx1bikgIT0gLTEpCiAgICAgICAgewogICAgICAgICAgICAqcG9ydCA9ICgoaWRsdW5bMF0gPj4gMjQpICYgMHhmZikgKyAxOwogICAgICAgICAgICAqaWZhY2UgPSAoaWRsdW5bMF0gPj4gMTYpICYgMHhmZjsKICAgICAgICAgICAgKmRldmljZSA9IGlkbHVuWzBdICYgMHhmZjsKICAgICAgICAgICAgKmx1biA9IChpZGx1blswXSA+PiA4KSAmIDB4ZmY7CiAgICAgICAgfQogICAgICAgIGVsc2UKI2VuZGlmCiAgICAgICAgewogICAgICAgICAgICBXQVJOKCJDRC1ST00gZGV2aWNlICglZCwgJWQpIG5vdCBzdXBwb3J0ZWRcbiIsIG1ham9yKHN0LnN0X3JkZXYpLCBtaW5vcihzdC5zdF9yZGV2KSk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwojZWxpZiBkZWZpbmVkKF9fTmV0QlNEX18pCiAgICBzdHJ1Y3Qgc2NzaV9hZGRyIGFkZHI7CiAgICBpZiAoaW9jdGwoZmQsIFNDSU9DSURFTlRJRlksICZhZGRyKSAhPSAtMSkKICAgIHsKICAgICAgICBzd2l0Y2ggKGFkZHIudHlwZSkgCiAgICAgICAgewogICAgICAgIGNhc2UgVFlQRV9TQ1NJOiAgKnBvcnQgPSAxOwogICAgICAgICAgICAqaWZhY2UgPSBhZGRyLmFkZHIuc2NzaS5zY2J1czsKICAgICAgICAgICAgKmRldmljZSA9IGFkZHIuYWRkci5zY3NpLnRhcmdldDsKICAgICAgICAgICAgKmx1biA9IGFkZHIuYWRkci5zY3NpLmx1bjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0FUQVBJOiAqcG9ydCA9IDA7CiAgICAgICAgICAgICppZmFjZSA9IGFkZHIuYWRkci5hdGFwaS5hdGJ1czsKICAgICAgICAgICAgKmRldmljZSA9IGFkZHIuYWRkci5hdGFwaS5kcml2ZTsKICAgICAgICAgICAgKmx1biA9IDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiAwOwojZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQogICAgRklYTUUoIm5vdCBpbXBsZW1lbnRlZCBmb3IgQlNEXG4iKTsKICAgIHJldHVybiAwOwojZWxzZQogICAgRklYTUUoIm5vdCBpbXBsZW1lbnRlZCBmb3Igbm9ubGludXhcbiIpOwogICAgcmV0dXJuIDA7CiNlbmRpZgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fT3BlbgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIENEUk9NX09wZW4oaW50IGZkLCBpbnQqIGRldikKewogICAgc3RydWN0IHN0YXQgc3Q7CiAgICBOVFNUQVRVUyByZXQgPSBTVEFUVVNfU1VDQ0VTUzsKICAgIGludCAgICAgICAgIGVtcHR5ID0gLTE7CgogICAgZnN0YXQoZmQsICZzdCk7CgogICAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24oICZjYWNoZV9zZWN0aW9uICk7CiAgICBmb3IgKCpkZXYgPSAwOyAqZGV2IDwgTUFYX0NBQ0hFX0VOVFJJRVM7ICgqZGV2KSsrKQogICAgewogICAgICAgIGlmIChlbXB0eSA9PSAtMSAmJgogICAgICAgICAgICBjZHJvbV9jYWNoZVsqZGV2XS5kZXZpY2UgPT0gMCAmJgogICAgICAgICAgICBjZHJvbV9jYWNoZVsqZGV2XS5pbm9kZSA9PSAwKQogICAgICAgICAgICBlbXB0eSA9ICpkZXY7CiAgICAgICAgZWxzZSBpZiAoY2Ryb21fY2FjaGVbKmRldl0uZGV2aWNlID09IHN0LnN0X2RldiAmJgogICAgICAgICAgICAgICAgIGNkcm9tX2NhY2hlWypkZXZdLmlub2RlID09IHN0LnN0X2lubykKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoKmRldiA9PSBNQVhfQ0FDSEVfRU5UUklFUykKICAgIHsKICAgICAgICBpZiAoZW1wdHkgPT0gLTEpIHJldCA9IFNUQVRVU19OT1RfSU1QTEVNRU5URUQ7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgKmRldiA9IGVtcHR5OwogICAgICAgICAgICBjZHJvbV9jYWNoZVsqZGV2XS5kZXZpY2UgID0gc3Quc3RfZGV2OwogICAgICAgICAgICBjZHJvbV9jYWNoZVsqZGV2XS5pbm9kZSAgID0gc3Quc3RfaW5vOwogICAgICAgIH0KICAgIH0KICAgIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmY2FjaGVfc2VjdGlvbiApOwoKICAgIFRSQUNFKCIlZCwgJWRcbiIsICpkZXYsIGZkKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX0dldFN0YXR1c0NvZGUKICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9HZXRTdGF0dXNDb2RlKGludCBpbykKewogICAgaWYgKGlvID09IDApIHJldHVybiBTVEFUVVNfU1VDQ0VTUzsKICAgIHJldHVybiBGSUxFX0dldE50U3RhdHVzKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX0dldENvbnRyb2wKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9HZXRDb250cm9sKGludCBkZXYsIENEUk9NX0FVRElPX0NPTlRST0wqIGNhYykKewogICAgY2FjLT5MYmFGb3JtYXQgPSAwOyAvKiBGSVhNRSAqLwogICAgY2FjLT5Mb2dpY2FsQmxvY2tzUGVyU2Vjb25kID0gMTsgLyogRklYTUUgKi8KICAgIHJldHVybiAgU1RBVFVTX05PVF9TVVBQT1JURUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX0dldERldmljZU51bWJlcgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIENEUk9NX0dldERldmljZU51bWJlcihpbnQgZGV2LCBTVE9SQUdFX0RFVklDRV9OVU1CRVIqIGRldm51bSkKewogICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9HZXREcml2ZUdlb21ldHJ5CiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fR2V0RHJpdmVHZW9tZXRyeShpbnQgZGV2LCBpbnQgZmQsIERJU0tfR0VPTUVUUlkqIGRnKQp7CiAgQ0RST01fVE9DICAgICB0b2M7CiAgTlRTVEFUVVMgICAgICByZXQgPSAwOwogIGludCAgICAgICAgICAgZnNpemUgPSAwOwoKICBpZiAoKHJldCA9IENEUk9NX1JlYWRUT0MoZGV2LCBmZCwgJnRvYykpICE9IDApIHJldHVybiByZXQ7CgogIGZzaXplID0gRlJBTUVfT0ZfVE9DKHRvYywgdG9jLkxhc3RUcmFjaysxKQogICAgICAgIC0gRlJBTUVfT0ZfVE9DKHRvYywgMSk7IC8qIFRvdGFsIHNpemUgaW4gZnJhbWVzICovCiAgCiAgZGctPkN5bGluZGVycy51Lkxvd1BhcnQgPSBmc2l6ZSAvICg2NCAqIDMyKTsgCiAgZGctPkN5bGluZGVycy51LkhpZ2hQYXJ0ID0gMDsgCiAgZGctPk1lZGlhVHlwZSA9IFJlbW92YWJsZU1lZGlhOyAgCiAgZGctPlRyYWNrc1BlckN5bGluZGVyID0gNjQ7IAogIGRnLT5TZWN0b3JzUGVyVHJhY2sgPSAzMjsgIAogIGRnLT5CeXRlc1BlclNlY3Rvcj0gMjA0ODsgCiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RST01fUmVzZXQgICAgICAgICAgICAgICAgICAgICBbaW50ZXJuYWxdCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fUmVzZXRBdWRpbyhpbnQgZmQpCnsKI2lmIGRlZmluZWQobGludXgpCiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgQ0RST01SRVNFVCkpOwojZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgQ0RJT0NSRVNFVCwgTlVMTCkpOwojZWxzZQogICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fU2V0VHJheQogKgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIENEUk9NX1NldFRyYXkoaW50IGZkLCBCT09MIGRvRWplY3QpCnsKI2lmIGRlZmluZWQobGludXgpCiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgZG9FamVjdCA/IENEUk9NRUpFQ1QgOiBDRFJPTUNMT1NFVFJBWSkpOwojZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZSgoaW9jdGwoZmQsIENESU9DQUxMT1csIE5VTEwpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlvY3RsKGZkLCBkb0VqZWN0ID8gQ0RJT0NFSkVDVCA6IENESU9DQ0xPU0UsIE5VTEwpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlvY3RsKGZkLCBDRElPQ1BSRVZFTlQsIE5VTEwpKSk7CiNlbHNlCiAgICByZXR1cm4gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9Db250cm9sRWplY3Rpb24KICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9Db250cm9sRWplY3Rpb24oaW50IGZkLCBjb25zdCBQUkVWRU5UX01FRElBX1JFTU9WQUwqIHJtdikKewojaWYgZGVmaW5lZChsaW51eCkKICAgIHJldHVybiBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvY3RsKGZkLCBDRFJPTV9MT0NLRE9PUiwgcm12LT5QcmV2ZW50TWVkaWFSZW1vdmFsKSk7CiNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykKICAgIHJldHVybiBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvY3RsKGZkLCAocm12LT5QcmV2ZW50TWVkaWFSZW1vdmFsKSA/IENESU9DUFJFVkVOVCA6IENESU9DQUxMT1csIE5VTEwpKTsKI2Vsc2UKICAgIHJldHVybiBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX1JlYWRUT0MKICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9SZWFkVE9DKGludCBkZXYsIGludCBmZCwgQ0RST01fVE9DKiB0b2MpCnsKICAgIE5UU1RBVFVTICAgICAgIHJldCA9IFNUQVRVU19OT1RfU1VQUE9SVEVEOwoKICAgIGlmIChkZXYgPCAwIHx8IGRldiA+PSBNQVhfQ0FDSEVfRU5UUklFUykKICAgICAgICByZXR1cm4gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwoKICAgIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmY2FjaGVfc2VjdGlvbiApOwogICAgaWYgKGNkcm9tX2NhY2hlW2Rldl0udG9jX2dvb2QgfHwgIShyZXQgPSBDRFJPTV9TeW5jQ2FjaGUoZGV2LCBmZCkpKQogICAgewogICAgICAgICp0b2MgPSBjZHJvbV9jYWNoZVtkZXZdLnRvYzsKICAgICAgICByZXQgPSBTVEFUVVNfU1VDQ0VTUzsKICAgIH0KICAgIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmY2FjaGVfc2VjdGlvbiApOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fR2V0RGlza0RhdGEKICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9HZXREaXNrRGF0YShpbnQgZGV2LCBpbnQgZmQsIENEUk9NX0RJU0tfREFUQSogZGF0YSkKewogICAgQ0RST01fVE9DICAgdG9jOwogICAgTlRTVEFUVVMgICAgcmV0OwogICAgaW50ICAgICAgICAgaTsKCiAgICBpZiAoKHJldCA9IENEUk9NX1JlYWRUT0MoZGV2LCBmZCwgJnRvYykpICE9IDApIHJldHVybiByZXQ7CiAgICBkYXRhLT5EaXNrRGF0YSA9IDA7CiAgICBmb3IgKGkgPSB0b2MuRmlyc3RUcmFjazsgaSA8PSB0b2MuTGFzdFRyYWNrOyBpKyspIHsKICAgICAgICBpZiAodG9jLlRyYWNrRGF0YVtpLXRvYy5GaXJzdFRyYWNrXS5Db250cm9sICYgMHgwNCkKICAgICAgICAgICAgZGF0YS0+RGlza0RhdGEgfD0gQ0RST01fRElTS19EQVRBX1RSQUNLOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZGF0YS0+RGlza0RhdGEgfD0gQ0RST01fRElTS19BVURJT19UUkFDSzsKICAgIH0KICAgIHJldHVybiBTVEFUVVNfU1VDQ0VTUzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fUmVhZFFDaGFubmVsCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fUmVhZFFDaGFubmVsKGludCBkZXYsIGludCBmZCwgY29uc3QgQ0RST01fU1VCX1FfREFUQV9GT1JNQVQqIGZtdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJfUV9DSEFOTkVMX0RBVEEqIGRhdGEpCnsKICAgIE5UU1RBVFVTICAgICAgICAgICAgcmV0ID0gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiNpZmRlZiBsaW51eAogICAgdW5zaWduZWQgICAgICAgICAgICBzaXplOwogICAgU1VCX1FfSEVBREVSKiAgICAgICBoZHIgPSAoU1VCX1FfSEVBREVSKilkYXRhOwogICAgaW50ICAgICAgICAgICAgICAgICBpbzsKICAgIHN0cnVjdCBjZHJvbV9zdWJjaG5sCXNjOwogICAgc2MuY2RzY19mb3JtYXQgPSBDRFJPTV9NU0Y7CgogICAgaW8gPSBpb2N0bChmZCwgQ0RST01TVUJDSE5MLCAmc2MpOwogICAgaWYgKGlvID09IC0xKQogICAgewoJVFJBQ0UoIm9wZW5lZCBvciBub19tZWRpYSAoJXMpIVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKCWhkci0+QXVkaW9TdGF0dXMgPSBBVURJT19TVEFUVVNfTk9fU1RBVFVTOwoJQ0RST01fQ2xlYXJDYWNoZUVudHJ5KGRldik7Cglnb3RvIGVuZDsKICAgIH0KCiAgICBoZHItPkF1ZGlvU3RhdHVzID0gQVVESU9fU1RBVFVTX05PVF9TVVBQT1JURUQ7CgogICAgc3dpdGNoIChzYy5jZHNjX2F1ZGlvc3RhdHVzKSB7CiAgICBjYXNlIENEUk9NX0FVRElPX0lOVkFMSUQ6CglDRFJPTV9DbGVhckNhY2hlRW50cnkoZGV2KTsKCWhkci0+QXVkaW9TdGF0dXMgPSBBVURJT19TVEFUVVNfTk9UX1NVUFBPUlRFRDsKCWJyZWFrOwogICAgY2FzZSBDRFJPTV9BVURJT19OT19TVEFUVVM6CglDRFJPTV9DbGVhckNhY2hlRW50cnkoZGV2KTsKCWhkci0+QXVkaW9TdGF0dXMgPSBBVURJT19TVEFUVVNfTk9fU1RBVFVTOwoJYnJlYWs7CiAgICBjYXNlIENEUk9NX0FVRElPX1BMQVk6CiAgICAgICAgaGRyLT5BdWRpb1N0YXR1cyA9IEFVRElPX1NUQVRVU19JTl9QUk9HUkVTUzsKICAgICAgICBicmVhazsKICAgIGNhc2UgQ0RST01fQVVESU9fUEFVU0VEOgogICAgICAgIGhkci0+QXVkaW9TdGF0dXMgPSBBVURJT19TVEFUVVNfUEFVU0VEOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBDRFJPTV9BVURJT19DT01QTEVURUQ6CiAgICAgICAgaGRyLT5BdWRpb1N0YXR1cyA9IEFVRElPX1NUQVRVU19QTEFZX0NPTVBMRVRFOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBDRFJPTV9BVURJT19FUlJPUjoKICAgICAgICBoZHItPkF1ZGlvU3RhdHVzID0gQVVESU9fU1RBVFVTX1BMQVlfRVJST1I7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgoJVFJBQ0UoInN0YXR1cz0lMDJYICFcbiIsIHNjLmNkc2NfYXVkaW9zdGF0dXMpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgc3dpdGNoIChmbXQtPkZvcm1hdCkKICAgIHsKICAgIGNhc2UgSU9DVExfQ0RST01fQ1VSUkVOVF9QT1NJVElPTjoKICAgICAgICBzaXplID0gc2l6ZW9mKFNVQl9RX0NVUlJFTlRfUE9TSVRJT04pOwogICAgICAgIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmY2FjaGVfc2VjdGlvbiApOwoJaWYgKGhkci0+QXVkaW9TdGF0dXM9PUFVRElPX1NUQVRVU19JTl9QUk9HUkVTUykgewogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLkZvcm1hdENvZGUgPSBJT0NUTF9DRFJPTV9DVVJSRU5UX1BPU0lUSU9OOwogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLkNvbnRyb2wgPSBzYy5jZHNjX2N0cmw7IAogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLkFEUiA9IHNjLmNkc2NfYWRyOyAKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5UcmFja051bWJlciA9IHNjLmNkc2NfdHJrOyAKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5JbmRleE51bWJlciA9IHNjLmNkc2NfaW5kOyAKCiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uQWJzb2x1dGVBZGRyZXNzWzBdID0gMDsgCiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uQWJzb2x1dGVBZGRyZXNzWzFdID0gc2MuY2RzY19hYnNhZGRyLm1zZi5taW51dGU7IAogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLkFic29sdXRlQWRkcmVzc1syXSA9IHNjLmNkc2NfYWJzYWRkci5tc2Yuc2Vjb25kOwogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLkFic29sdXRlQWRkcmVzc1szXSA9IHNjLmNkc2NfYWJzYWRkci5tc2YuZnJhbWU7CiAKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5UcmFja1JlbGF0aXZlQWRkcmVzc1swXSA9IDA7IAogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLlRyYWNrUmVsYXRpdmVBZGRyZXNzWzFdID0gc2MuY2RzY19yZWxhZGRyLm1zZi5taW51dGU7IAogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLlRyYWNrUmVsYXRpdmVBZGRyZXNzWzJdID0gc2MuY2RzY19yZWxhZGRyLm1zZi5zZWNvbmQ7CiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uVHJhY2tSZWxhdGl2ZUFkZHJlc3NbM10gPSBzYy5jZHNjX3JlbGFkZHIubXNmLmZyYW1lOwoKCSAgY2Ryb21fY2FjaGVbZGV2XS5DdXJyZW50UG9zaXRpb24gPSBkYXRhLT5DdXJyZW50UG9zaXRpb247Cgl9CgllbHNlIC8qIG5vdCBwbGF5aW5nICovCgl7CgkgIGNkcm9tX2NhY2hlW2Rldl0uQ3VycmVudFBvc2l0aW9uLkhlYWRlciA9ICpoZHI7IC8qIFByZXNlcnZlIGhlYWRlciBpbmZvICovCgkgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbiA9IGNkcm9tX2NhY2hlW2Rldl0uQ3VycmVudFBvc2l0aW9uOwoJfQogICAgICAgIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmY2FjaGVfc2VjdGlvbiApOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9DRFJPTV9NRURJQV9DQVRBTE9HOgogICAgICAgIHNpemUgPSBzaXplb2YoU1VCX1FfTUVESUFfQ0FUQUxPR19OVU1CRVIpOwogICAgICAgIGRhdGEtPk1lZGlhQ2F0YWxvZy5Gb3JtYXRDb2RlID0gSU9DVExfQ0RST01fTUVESUFfQ0FUQUxPRzsKICAgICAgICB7CiAgICAgICAgICAgIHN0cnVjdCBjZHJvbV9tY24gbWNuOwogICAgICAgICAgICBpZiAoKGlvID0gaW9jdGwoZmQsIENEUk9NX0dFVF9NQ04sICZtY24pKSA9PSAtMSkgZ290byBlbmQ7CgogICAgICAgICAgICBkYXRhLT5NZWRpYUNhdGFsb2cuRm9ybWF0Q29kZSA9IElPQ1RMX0NEUk9NX01FRElBX0NBVEFMT0c7CiAgICAgICAgICAgIGRhdGEtPk1lZGlhQ2F0YWxvZy5NY3ZhbCA9IDA7IC8qIEZJWE1FICovCiAgICAgICAgICAgIG1lbWNweShkYXRhLT5NZWRpYUNhdGFsb2cuTWVkaWFDYXRhbG9nLCBtY24ubWVkaXVtX2NhdGFsb2dfbnVtYmVyLCAxNCk7CiAgICAgICAgICAgIGRhdGEtPk1lZGlhQ2F0YWxvZy5NZWRpYUNhdGFsb2dbMTRdID0gMDsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX0NEUk9NX1RSQUNLX0lTUkM6CiAgICAgICAgc2l6ZSA9IHNpemVvZihTVUJfUV9DVVJSRU5UX1BPU0lUSU9OKTsKICAgICAgICBGSVhNRSgiVHJhY2tJc3JjOiBOSVkgb24gbGludXhcbiIpOwogICAgICAgIGRhdGEtPlRyYWNrSXNyYy5Gb3JtYXRDb2RlID0gSU9DVExfQ0RST01fVFJBQ0tfSVNSQzsKICAgICAgICBkYXRhLT5UcmFja0lzcmMuVGN2YWwgPSAwOwogICAgICAgIGlvID0gMDsKICAgICAgICBicmVhazsKICAgIH0KCiBlbmQ6CiAgICByZXQgPSBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvKTsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQogICAgdW5zaWduZWQgICAgICAgICAgICBzaXplOwogICAgU1VCX1FfSEVBREVSKiAgICAgICBoZHIgPSAoU1VCX1FfSEVBREVSKilkYXRhOwogICAgaW50ICAgICAgICAgICAgICAgICBpbzsKICAgIHN0cnVjdCBpb2NfcmVhZF9zdWJjaGFubmVsCXJlYWRfc2M7CiAgICBzdHJ1Y3QgY2Rfc3ViX2NoYW5uZWxfaW5mbwlzYzsKCiAgICByZWFkX3NjLmFkZHJlc3NfZm9ybWF0ID0gQ0RfTVNGX0ZPUk1BVDsKICAgIHJlYWRfc2MudHJhY2sgICAgICAgICAgPSAwOwogICAgcmVhZF9zYy5kYXRhX2xlbiAgICAgICA9IHNpemVvZihzYyk7CiAgICByZWFkX3NjLmRhdGEgICAgICAgICAgID0gJnNjOwogICAgc3dpdGNoIChmbXQtPkZvcm1hdCkKICAgIHsKICAgIGNhc2UgSU9DVExfQ0RST01fQ1VSUkVOVF9QT1NJVElPTjoKICAgICAgICByZWFkX3NjLmRhdGFfZm9ybWF0ICAgID0gQ0RfQ1VSUkVOVF9QT1NJVElPTjsKICAgICAgICBicmVhazsKICAgIGNhc2UgSU9DVExfQ0RST01fTUVESUFfQ0FUQUxPRzoKICAgICAgICByZWFkX3NjLmRhdGFfZm9ybWF0ICAgID0gQ0RfTUVESUFfQ0FUQUxPRzsKICAgICAgICBicmVhazsKICAgIGNhc2UgSU9DVExfQ0RST01fVFJBQ0tfSVNSQzoKICAgICAgICByZWFkX3NjLmRhdGFfZm9ybWF0ICAgID0gQ0RfVFJBQ0tfSU5GTzsKICAgICAgICBzYy53aGF0LnRyYWNrX2luZm8udHJhY2tfbnVtYmVyID0gZGF0YS0+VHJhY2tJc3JjLlRyYWNrOwogICAgICAgIGJyZWFrOwogICAgfQogICAgaW8gPSBpb2N0bChmZCwgQ0RJT0NSRUFEU1VCQ0hBTk5FTCwgJnJlYWRfc2MpOwogICAgaWYgKGlvID09IC0xKQogICAgewoJVFJBQ0UoIm9wZW5lZCBvciBub19tZWRpYSAoJXMpIVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKCUNEUk9NX0NsZWFyQ2FjaGVFbnRyeShkZXYpOwoJaGRyLT5BdWRpb1N0YXR1cyA9IEFVRElPX1NUQVRVU19OT19TVEFUVVM7Cglnb3RvIGVuZDsKICAgIH0KCiAgICBoZHItPkF1ZGlvU3RhdHVzID0gQVVESU9fU1RBVFVTX05PVF9TVVBQT1JURUQ7CgogICAgc3dpdGNoIChzYy5oZWFkZXIuYXVkaW9fc3RhdHVzKSB7CiAgICBjYXNlIENEX0FTX0FVRElPX0lOVkFMSUQ6CglDRFJPTV9DbGVhckNhY2hlRW50cnkoZGV2KTsKCWhkci0+QXVkaW9TdGF0dXMgPSBBVURJT19TVEFUVVNfTk9UX1NVUFBPUlRFRDsKCWJyZWFrOwogICAgY2FzZSBDRF9BU19OT19TVEFUVVM6CglDRFJPTV9DbGVhckNhY2hlRW50cnkoZGV2KTsKCWhkci0+QXVkaW9TdGF0dXMgPSBBVURJT19TVEFUVVNfTk9fU1RBVFVTOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBDRF9BU19QTEFZX0lOX1BST0dSRVNTOgogICAgICAgIGhkci0+QXVkaW9TdGF0dXMgPSBBVURJT19TVEFUVVNfSU5fUFJPR1JFU1M7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIENEX0FTX1BMQVlfUEFVU0VEOgogICAgICAgIGhkci0+QXVkaW9TdGF0dXMgPSBBVURJT19TVEFUVVNfUEFVU0VEOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBDRF9BU19QTEFZX0NPTVBMRVRFRDoKICAgICAgICBoZHItPkF1ZGlvU3RhdHVzID0gQVVESU9fU1RBVFVTX1BMQVlfQ09NUExFVEU7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIENEX0FTX1BMQVlfRVJST1I6CiAgICAgICAgaGRyLT5BdWRpb1N0YXR1cyA9IEFVRElPX1NUQVRVU19QTEFZX0VSUk9SOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKCVRSQUNFKCJzdGF0dXM9JTAyWCAhXG4iLCBzYy5oZWFkZXIuYXVkaW9fc3RhdHVzKTsKICAgIH0KICAgIHN3aXRjaCAoZm10LT5Gb3JtYXQpCiAgICB7CiAgICBjYXNlIElPQ1RMX0NEUk9NX0NVUlJFTlRfUE9TSVRJT046CiAgICAgICAgc2l6ZSA9IHNpemVvZihTVUJfUV9DVVJSRU5UX1BPU0lUSU9OKTsKICAgICAgICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiggJmNhY2hlX3NlY3Rpb24gKTsKCWlmIChoZHItPkF1ZGlvU3RhdHVzPT1BVURJT19TVEFUVVNfSU5fUFJPR1JFU1MpIHsKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5Gb3JtYXRDb2RlID0gSU9DVExfQ0RST01fQ1VSUkVOVF9QT1NJVElPTjsKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5Db250cm9sID0gc2Mud2hhdC5wb3NpdGlvbi5jb250cm9sOwogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLkFEUiA9IHNjLndoYXQucG9zaXRpb24uYWRkcl90eXBlOwogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLlRyYWNrTnVtYmVyID0gc2Mud2hhdC5wb3NpdGlvbi50cmFja19udW1iZXI7CiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uSW5kZXhOdW1iZXIgPSBzYy53aGF0LnBvc2l0aW9uLmluZGV4X251bWJlcjsKCiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uQWJzb2x1dGVBZGRyZXNzWzBdID0gMDsKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5BYnNvbHV0ZUFkZHJlc3NbMV0gPSBzYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLm1pbnV0ZTsKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5BYnNvbHV0ZUFkZHJlc3NbMl0gPSBzYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLnNlY29uZDsKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5BYnNvbHV0ZUFkZHJlc3NbM10gPSBzYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLmZyYW1lOwogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLlRyYWNrUmVsYXRpdmVBZGRyZXNzWzBdID0gMDsKICAgICAgICAgIGRhdGEtPkN1cnJlbnRQb3NpdGlvbi5UcmFja1JlbGF0aXZlQWRkcmVzc1sxXSA9IHNjLndoYXQucG9zaXRpb24ucmVsYWRkci5tc2YubWludXRlOwogICAgICAgICAgZGF0YS0+Q3VycmVudFBvc2l0aW9uLlRyYWNrUmVsYXRpdmVBZGRyZXNzWzJdID0gc2Mud2hhdC5wb3NpdGlvbi5yZWxhZGRyLm1zZi5zZWNvbmQ7CiAgICAgICAgICBkYXRhLT5DdXJyZW50UG9zaXRpb24uVHJhY2tSZWxhdGl2ZUFkZHJlc3NbM10gPSBzYy53aGF0LnBvc2l0aW9uLnJlbGFkZHIubXNmLmZyYW1lOwoJICBjZHJvbV9jYWNoZVtkZXZdLkN1cnJlbnRQb3NpdGlvbiA9IGRhdGEtPkN1cnJlbnRQb3NpdGlvbjsKCX0KCWVsc2UgeyAvKiBub3QgcGxheWluZyAqLwoJICBjZHJvbV9jYWNoZVtkZXZdLkN1cnJlbnRQb3NpdGlvbi5IZWFkZXIgPSAqaGRyOyAvKiBQcmVzZXJ2ZSBoZWFkZXIgaW5mbyAqLwoJICBkYXRhLT5DdXJyZW50UG9zaXRpb24gPSBjZHJvbV9jYWNoZVtkZXZdLkN1cnJlbnRQb3NpdGlvbjsKCX0KICAgICAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmNhY2hlX3NlY3Rpb24gKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgSU9DVExfQ0RST01fTUVESUFfQ0FUQUxPRzoKICAgICAgICBzaXplID0gc2l6ZW9mKFNVQl9RX01FRElBX0NBVEFMT0dfTlVNQkVSKTsKICAgICAgICBkYXRhLT5NZWRpYUNhdGFsb2cuRm9ybWF0Q29kZSA9IElPQ1RMX0NEUk9NX01FRElBX0NBVEFMT0c7CiAgICAgICAgZGF0YS0+TWVkaWFDYXRhbG9nLk1jdmFsID0gc2Mud2hhdC5tZWRpYV9jYXRhbG9nLm1jX3ZhbGlkOwogICAgICAgIG1lbWNweShkYXRhLT5NZWRpYUNhdGFsb2cuTWVkaWFDYXRhbG9nLCBzYy53aGF0Lm1lZGlhX2NhdGFsb2cubWNfbnVtYmVyLCAxNSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX0NEUk9NX1RSQUNLX0lTUkM6CiAgICAgICAgc2l6ZSA9IHNpemVvZihTVUJfUV9DVVJSRU5UX1BPU0lUSU9OKTsKICAgICAgICBkYXRhLT5UcmFja0lzcmMuRm9ybWF0Q29kZSA9IElPQ1RMX0NEUk9NX1RSQUNLX0lTUkM7CiAgICAgICAgZGF0YS0+VHJhY2tJc3JjLlRjdmFsID0gc2Mud2hhdC50cmFja19pbmZvLnRpX3ZhbGlkOwogICAgICAgIG1lbWNweShkYXRhLT5UcmFja0lzcmMuVHJhY2tJc3JjLCBzYy53aGF0LnRyYWNrX2luZm8udGlfbnVtYmVyLCAxNSk7CiAgICAgICAgYnJlYWs7CiAgICB9CgogZW5kOgogICAgcmV0ID0gQ0RST01fR2V0U3RhdHVzQ29kZShpbyk7CiNlbmRpZgogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fVmVyaWZ5CiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fVmVyaWZ5KGludCBkZXYsIGludCBmZCkKewogICAgLyogcXVpY2sgaW1wbGVtZW50YXRpb24gKi8KICAgIENEUk9NX1NVQl9RX0RBVEFfRk9STUFUICAgICBmbXQ7CiAgICBTVUJfUV9DSEFOTkVMX0RBVEEgICAgICAgICAgZGF0YTsKCiAgICBmbXQuRm9ybWF0ID0gSU9DVExfQ0RST01fQ1VSUkVOVF9QT1NJVElPTjsKICAgIHJldHVybiBDRFJPTV9SZWFkUUNoYW5uZWwoZGV2LCBmZCwgJmZtdCwgJmRhdGEpID8gMSA6IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX1BsYXlBdWRpb01TRgogKgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIENEUk9NX1BsYXlBdWRpb01TRihpbnQgZmQsIGNvbnN0IENEUk9NX1BMQVlfQVVESU9fTVNGKiBhdWRpb19tc2YpCnsKICAgIE5UU1RBVFVTICAgICAgIHJldCA9IFNUQVRVU19OT1RfU1VQUE9SVEVEOwojaWZkZWYgbGludXgKICAgIHN0cnVjdCAJY2Ryb21fbXNmCW1zZjsKICAgIGludCAgICAgICAgIGlvOwoKICAgIG1zZi5jZG1zZl9taW4wICAgPSBhdWRpb19tc2YtPlN0YXJ0aW5nTTsKICAgIG1zZi5jZG1zZl9zZWMwICAgPSBhdWRpb19tc2YtPlN0YXJ0aW5nUzsKICAgIG1zZi5jZG1zZl9mcmFtZTAgPSBhdWRpb19tc2YtPlN0YXJ0aW5nRjsKICAgIG1zZi5jZG1zZl9taW4xICAgPSBhdWRpb19tc2YtPkVuZGluZ007CiAgICBtc2YuY2Rtc2Zfc2VjMSAgID0gYXVkaW9fbXNmLT5FbmRpbmdTOwogICAgbXNmLmNkbXNmX2ZyYW1lMSA9IGF1ZGlvX21zZi0+RW5kaW5nRjsKCiAgICBpbyA9IGlvY3RsKGZkLCBDRFJPTVNUQVJUKTsKICAgIGlmIChpbyA9PSAtMSkKICAgIHsKCVdBUk4oIm1vdG9yIGRvZXNuJ3Qgc3RhcnQgIVxuIik7Cglnb3RvIGVuZDsKICAgIH0KICAgIGlvID0gaW9jdGwoZmQsIENEUk9NUExBWU1TRiwgJm1zZik7CiAgICBpZiAoaW8gPT0gLTEpCiAgICB7CglXQVJOKCJkZXZpY2UgZG9lc24ndCBwbGF5ICFcbiIpOwoJZ290byBlbmQ7CiAgICB9CiAgICBUUkFDRSgibXNmID0gJWQ6JWQ6JWQgJWQ6JWQ6JWRcbiIsCgkgIG1zZi5jZG1zZl9taW4wLCBtc2YuY2Rtc2Zfc2VjMCwgbXNmLmNkbXNmX2ZyYW1lMCwKCSAgbXNmLmNkbXNmX21pbjEsIG1zZi5jZG1zZl9zZWMxLCBtc2YuY2Rtc2ZfZnJhbWUxKTsKIGVuZDoKICAgIHJldCA9IENEUk9NX0dldFN0YXR1c0NvZGUoaW8pOwojZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCiAgICBzdHJ1Y3QJaW9jX3BsYXlfbXNmCW1zZjsKICAgIGludCAgICAgICAgIGlvOwoKICAgIG1zZi5zdGFydF9tICAgICAgPSBhdWRpb19tc2YtPlN0YXJ0aW5nTTsKICAgIG1zZi5zdGFydF9zICAgICAgPSBhdWRpb19tc2YtPlN0YXJ0aW5nUzsKICAgIG1zZi5zdGFydF9mICAgICAgPSBhdWRpb19tc2YtPlN0YXJ0aW5nRjsKICAgIG1zZi5lbmRfbSAgICAgICAgPSBhdWRpb19tc2YtPkVuZGluZ007CiAgICBtc2YuZW5kX3MgICAgICAgID0gYXVkaW9fbXNmLT5FbmRpbmdTOwogICAgbXNmLmVuZF9mICAgICAgICA9IGF1ZGlvX21zZi0+RW5kaW5nRjsKCiAgICBpbyA9IGlvY3RsKGZkLCBDRElPQ1NUQVJULCBOVUxMKTsKICAgIGlmIChpbyA9PSAtMSkKICAgIHsKCVdBUk4oIm1vdG9yIGRvZXNuJ3Qgc3RhcnQgIVxuIik7Cglnb3RvIGVuZDsKICAgIH0KICAgIGlvID0gaW9jdGwoZmQsIENESU9DUExBWU1TRiwgJm1zZik7CiAgICBpZiAoaW8gPT0gLTEpCiAgICB7CglXQVJOKCJkZXZpY2UgZG9lc24ndCBwbGF5ICFcbiIpOwoJZ290byBlbmQ7CiAgICB9CiAgICBUUkFDRSgibXNmID0gJWQ6JWQ6JWQgJWQ6JWQ6JWRcbiIsCgkgIG1zZi5zdGFydF9tLCBtc2Yuc3RhcnRfcywgbXNmLnN0YXJ0X2YsCgkgIG1zZi5lbmRfbSwgICBtc2YuZW5kX3MsICAgbXNmLmVuZF9mKTsKZW5kOgogICAgcmV0ID0gQ0RST01fR2V0U3RhdHVzQ29kZShpbyk7CiNlbmRpZgogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fU2Vla0F1ZGlvTVNGCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fU2Vla0F1ZGlvTVNGKGludCBkZXYsIGludCBmZCwgY29uc3QgQ0RST01fU0VFS19BVURJT19NU0YqIGF1ZGlvX21zZikKewogICAgQ0RST01fVE9DIHRvYzsKICAgIGludCBpLCBpbywgZnJhbWU7CiAgICBTVUJfUV9DVVJSRU5UX1BPU0lUSU9OICpjcDsKI2lmIGRlZmluZWQobGludXgpCiAgICBzdHJ1Y3QgY2Ryb21fbXNmMAltc2Y7CiAgICBzdHJ1Y3QgY2Ryb21fc3ViY2hubCBzYzsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQogICAgc3RydWN0IGlvY19wbGF5X21zZgltc2Y7CiAgICBzdHJ1Y3QgaW9jX3JlYWRfc3ViY2hhbm5lbAlyZWFkX3NjOwogICAgc3RydWN0IGNkX3N1Yl9jaGFubmVsX2luZm8Jc2M7CiAgICBpbnQgZmluYWxfZnJhbWU7CiNlbmRpZgoKICAgIC8qIFVzZSB0aGUgaW5mb3JtYXRpb24gb24gdGhlIFRPQyB0byBjb21wdXRlIHRoZSBuZXcgY3VycmVudAogICAgICogcG9zaXRpb24sIHdoaWNoIGlzIHNoYWRvd2VkIG9uIHRoZSBjYWNoZS4gW1BvcnRhYmxlXS4gKi8KICAgIGZyYW1lID0gRlJBTUVfT0ZfTVNGKCphdWRpb19tc2YpOwoKICAgIGlmICgoaW8gPSBDRFJPTV9SZWFkVE9DKGRldiwgZmQsICZ0b2MpKSAhPSAwKSByZXR1cm4gaW87CgogICAgZm9yKGk9dG9jLkZpcnN0VHJhY2s7aTw9dG9jLkxhc3RUcmFjaysxO2krKykKICAgICAgaWYgKEZSQU1FX09GX1RPQyh0b2MsaSk+ZnJhbWUpIGJyZWFrOwogICAgaWYgKGkgPD0gdG9jLkZpcnN0VHJhY2sgfHwgaSA+IHRvYy5MYXN0VHJhY2srMSkKICAgICAgcmV0dXJuIFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgIGktLTsKICAgIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmY2FjaGVfc2VjdGlvbiApOwogICAgY3AgPSAmY2Ryb21fY2FjaGVbZGV2XS5DdXJyZW50UG9zaXRpb247CiAgICBjcC0+Rm9ybWF0Q29kZSA9IElPQ1RMX0NEUk9NX0NVUlJFTlRfUE9TSVRJT047IAogICAgY3AtPkNvbnRyb2wgPSB0b2MuVHJhY2tEYXRhW2ktdG9jLkZpcnN0VHJhY2tdLkNvbnRyb2w7IAogICAgY3AtPkFEUiA9IHRvYy5UcmFja0RhdGFbaS10b2MuRmlyc3RUcmFja10uQWRyOyAKICAgIGNwLT5UcmFja051bWJlciA9IHRvYy5UcmFja0RhdGFbaS10b2MuRmlyc3RUcmFja10uVHJhY2tOdW1iZXI7CiAgICBjcC0+SW5kZXhOdW1iZXIgPSAwOyAvKiBGSVhNRTogd2hlcmUgZG8gdGhleSBrZWVwIHRoZXNlPyAqLwogICAgY3AtPkFic29sdXRlQWRkcmVzc1swXSA9IDA7IAogICAgY3AtPkFic29sdXRlQWRkcmVzc1sxXSA9IHRvYy5UcmFja0RhdGFbaS10b2MuRmlyc3RUcmFja10uQWRkcmVzc1sxXTsKICAgIGNwLT5BYnNvbHV0ZUFkZHJlc3NbMl0gPSB0b2MuVHJhY2tEYXRhW2ktdG9jLkZpcnN0VHJhY2tdLkFkZHJlc3NbMl07CiAgICBjcC0+QWJzb2x1dGVBZGRyZXNzWzNdID0gdG9jLlRyYWNrRGF0YVtpLXRvYy5GaXJzdFRyYWNrXS5BZGRyZXNzWzNdOwogICAgZnJhbWUgLT0gRlJBTUVfT0ZfVE9DKHRvYyxpKTsKICAgIGNwLT5UcmFja1JlbGF0aXZlQWRkcmVzc1swXSA9IDA7CiAgICBNU0ZfT0ZfRlJBTUUoY3AtPlRyYWNrUmVsYXRpdmVBZGRyZXNzWzFdLCBmcmFtZSk7IAogICAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24oICZjYWNoZV9zZWN0aW9uICk7CgogICAgLyogSWYgcGxheWluZywgdGhlbiBpc3N1ZSBhIHNlZWsgY29tbWFuZCwgb3RoZXJ3aXNlIGRvIG5vdGhpbmcgKi8KI2lmZGVmIGxpbnV4CiAgICBzYy5jZHNjX2Zvcm1hdCA9IENEUk9NX01TRjsKCiAgICBpbyA9IGlvY3RsKGZkLCBDRFJPTVNVQkNITkwsICZzYyk7CiAgICBpZiAoaW8gPT0gLTEpCiAgICB7CglUUkFDRSgib3BlbmVkIG9yIG5vX21lZGlhICglcykhXG4iLCBzdHJlcnJvcihlcnJubykpOwoJQ0RST01fQ2xlYXJDYWNoZUVudHJ5KGRldik7CiAgICAgICAgcmV0dXJuIENEUk9NX0dldFN0YXR1c0NvZGUoaW8pOwogICAgfQogICAgaWYgKHNjLmNkc2NfYXVkaW9zdGF0dXM9PUNEUk9NX0FVRElPX1BMQVkpCiAgICB7CiAgICAgIG1zZi5taW51dGUgPSBhdWRpb19tc2YtPk07CiAgICAgIG1zZi5zZWNvbmQgPSBhdWRpb19tc2YtPlM7CiAgICAgIG1zZi5mcmFtZSAgPSBhdWRpb19tc2YtPkY7CiAgICAgIHJldHVybiBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvY3RsKGZkLCBDRFJPTVNFRUssICZtc2YpKTsKICAgIH0KICAgIHJldHVybiBTVEFUVVNfU1VDQ0VTUzsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQogICAgcmVhZF9zYy5hZGRyZXNzX2Zvcm1hdCA9IENEX01TRl9GT1JNQVQ7CiAgICByZWFkX3NjLnRyYWNrICAgICAgICAgID0gMDsKICAgIHJlYWRfc2MuZGF0YV9sZW4gICAgICAgPSBzaXplb2Yoc2MpOwogICAgcmVhZF9zYy5kYXRhICAgICAgICAgICA9ICZzYzsKICAgIHJlYWRfc2MuZGF0YV9mb3JtYXQgICAgPSBDRF9DVVJSRU5UX1BPU0lUSU9OOwoKICAgIGlvID0gaW9jdGwoZmQsIENESU9DUkVBRFNVQkNIQU5ORUwsICZyZWFkX3NjKTsKICAgIGlmIChpbyA9PSAtMSkKICAgIHsKCVRSQUNFKCJvcGVuZWQgb3Igbm9fbWVkaWEgKCVzKSFcbiIsIHN0cmVycm9yKGVycm5vKSk7CglDRFJPTV9DbGVhckNhY2hlRW50cnkoZGV2KTsKICAgICAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpbyk7CiAgICB9CiAgICBpZiAoc2MuaGVhZGVyLmF1ZGlvX3N0YXR1cz09Q0RfQVNfUExBWV9JTl9QUk9HUkVTUykgCiAgICB7CgogICAgICBtc2Yuc3RhcnRfbSAgICAgID0gYXVkaW9fbXNmLT5NOwogICAgICBtc2Yuc3RhcnRfcyAgICAgID0gYXVkaW9fbXNmLT5TOwogICAgICBtc2Yuc3RhcnRfZiAgICAgID0gYXVkaW9fbXNmLT5GOwogICAgICBmaW5hbF9mcmFtZSA9IEZSQU1FX09GX1RPQyh0b2MsdG9jLkxhc3RUcmFjaysxKS0xOwogICAgICBNU0ZfT0ZfRlJBTUUobXNmLmVuZF9tLCBmaW5hbF9mcmFtZSk7CgogICAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgQ0RJT0NQTEFZTVNGLCAmbXNmKSk7CiAgICB9CiAgICByZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiNlbHNlCiAgICByZXR1cm4gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9QYXVzZUF1ZGlvCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fUGF1c2VBdWRpbyhpbnQgZmQpCnsKI2lmIGRlZmluZWQobGludXgpCiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgQ0RST01QQVVTRSkpOwojZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgQ0RJT0NQQVVTRSwgTlVMTCkpOwojZWxzZQogICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fUmVzdW1lQXVkaW8KICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9SZXN1bWVBdWRpbyhpbnQgZmQpCnsKI2lmIGRlZmluZWQobGludXgpCiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgQ0RST01SRVNVTUUpKTsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQogICAgcmV0dXJuIENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoZmQsIENESU9DUkVTVU1FLCBOVUxMKSk7CiNlbHNlCiAgICByZXR1cm4gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9TdG9wQXVkaW8KICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9TdG9wQXVkaW8oaW50IGZkKQp7CiNpZiBkZWZpbmVkKGxpbnV4KQogICAgcmV0dXJuIENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoZmQsIENEUk9NU1RPUCkpOwojZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCiAgICByZXR1cm4gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgQ0RJT0NTVE9QLCBOVUxMKSk7CiNlbHNlCiAgICByZXR1cm4gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9HZXRWb2x1bWUKICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9HZXRWb2x1bWUoaW50IGZkLCBWT0xVTUVfQ09OVFJPTCogdmMpCnsKI2lmIGRlZmluZWQobGludXgpCiAgICBzdHJ1Y3QgY2Ryb21fdm9sY3RybCB2b2xjOwogICAgaW50IGlvOwoKICAgIGlvID0gaW9jdGwoZmQsIENEUk9NVk9MUkVBRCwgJnZvbGMpOwogICAgaWYgKGlvICE9IC0xKQogICAgewogICAgICAgIHZjLT5Qb3J0Vm9sdW1lWzBdID0gdm9sYy5jaGFubmVsMDsKICAgICAgICB2Yy0+UG9ydFZvbHVtZVsxXSA9IHZvbGMuY2hhbm5lbDE7CiAgICAgICAgdmMtPlBvcnRWb2x1bWVbMl0gPSB2b2xjLmNoYW5uZWwyOwogICAgICAgIHZjLT5Qb3J0Vm9sdW1lWzNdID0gdm9sYy5jaGFubmVsMzsKICAgIH0KICAgIHJldHVybiBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvKTsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQogICAgc3RydWN0ICBpb2Nfdm9sICAgICB2b2xjOwogICAgaW50IGlvOwoKICAgIGlvID0gaW9jdGwoZmQsIENESU9DR0VUVk9MLCAmdm9sYyk7CiAgICBpZiAoaW8gIT0gLTEpCiAgICB7CiAgICAgICAgdmMtPlBvcnRWb2x1bWVbMF0gPSB2b2xjLnZvbFswXTsKICAgICAgICB2Yy0+UG9ydFZvbHVtZVsxXSA9IHZvbGMudm9sWzFdOwogICAgICAgIHZjLT5Qb3J0Vm9sdW1lWzJdID0gdm9sYy52b2xbMl07CiAgICAgICAgdmMtPlBvcnRWb2x1bWVbM10gPSB2b2xjLnZvbFszXTsKICAgIH0KICAgIHJldHVybiBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvKTsKI2Vsc2UKICAgIHJldHVybiBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX1NldFZvbHVtZQogKgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIENEUk9NX1NldFZvbHVtZShpbnQgZmQsIGNvbnN0IFZPTFVNRV9DT05UUk9MKiB2YykKewojaWYgZGVmaW5lZChsaW51eCkKICAgIHN0cnVjdCBjZHJvbV92b2xjdHJsIHZvbGM7CgogICAgdm9sYy5jaGFubmVsMCA9IHZjLT5Qb3J0Vm9sdW1lWzBdOwogICAgdm9sYy5jaGFubmVsMSA9IHZjLT5Qb3J0Vm9sdW1lWzFdOwogICAgdm9sYy5jaGFubmVsMiA9IHZjLT5Qb3J0Vm9sdW1lWzJdOwogICAgdm9sYy5jaGFubmVsMyA9IHZjLT5Qb3J0Vm9sdW1lWzNdOwoKICAgIHJldHVybiBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvY3RsKGZkLCBDRFJPTVZPTENUUkwsICZ2b2xjKSk7CiNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykKICAgIHN0cnVjdCAgaW9jX3ZvbCAgICAgdm9sYzsKCiAgICB2b2xjLnZvbFswXSA9IHZjLT5Qb3J0Vm9sdW1lWzBdOwogICAgdm9sYy52b2xbMV0gPSB2Yy0+UG9ydFZvbHVtZVsxXTsKICAgIHZvbGMudm9sWzJdID0gdmMtPlBvcnRWb2x1bWVbMl07CiAgICB2b2xjLnZvbFszXSA9IHZjLT5Qb3J0Vm9sdW1lWzNdOwoKICAgIHJldHVybiBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvY3RsKGZkLCBDRElPQ1NFVFZPTCwgJnZvbGMpKTsKI2Vsc2UKICAgIHJldHVybiBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX1Jhd1JlYWQKICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9SYXdSZWFkKGludCBmZCwgY29uc3QgUkFXX1JFQURfSU5GTyogcmF3LCB2b2lkKiBidWZmZXIsIERXT1JEIGxlbiwgRFdPUkQqIHN6KQp7CiAgICBpbnQJICAgICAgICByZXQgPSBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKICAgIGludCAgICAgICAgIGlvID0gLTE7CiAgICBEV09SRCAgICAgICBzZWN0U2l6ZTsKCiAgICBzd2l0Y2ggKHJhdy0+VHJhY2tNb2RlKQogICAgewogICAgY2FzZSBZZWxsb3dNb2RlMjogICBzZWN0U2l6ZSA9IDIzMzY7ICAgICAgICBicmVhazsKICAgIGNhc2UgWEFGb3JtMjogICAgICAgc2VjdFNpemUgPSAyMzI4OyAgICAgICAgYnJlYWs7CiAgICBjYXNlIENEREE6ICAgICAgICAgIHNlY3RTaXplID0gMjM1MjsgICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDogICAgcmV0dXJuIFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgIH0KICAgIGlmIChsZW4gPCByYXctPlNlY3RvckNvdW50ICogc2VjdFNpemUpIHJldHVybiBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKICAgIC8qIHN0cmFuZ2VseSBlbm91Z2gsIGl0IHNlZW1zIHRoYXQgc2VjdG9yIG9mZnNldHMgYXJlIGFsd2F5cyBpbmRpY2F0ZWQgd2l0aCBhIHNpemUgb2YgMjA0OCwKICAgICAqIGV2ZW4gaWYgYSBsYXJnZXIgc2l6ZSBpZiByZWFkLi4uCiAgICAgKi8KI2lmIGRlZmluZWQobGludXgpCiAgICB7CiAgICAgICAgc3RydWN0IGNkcm9tX3JlYWQgICAgICAgY2RyOwogICAgICAgIHN0cnVjdCBjZHJvbV9yZWFkX2F1ZGlvIGNkcmE7CgogICAgICAgIHN3aXRjaCAocmF3LT5UcmFja01vZGUpCiAgICAgICAgewogICAgICAgIGNhc2UgWWVsbG93TW9kZTI6CiAgICAgICAgICAgIGlmIChyYXctPkRpc2tPZmZzZXQudS5IaWdoUGFydCkgRklYTUUoIlVuc3VwcG9ydGVkIHZhbHVlXG4iKTsKICAgICAgICAgICAgY2RyLmNkcmVhZF9sYmEgPSByYXctPkRpc2tPZmZzZXQudS5Mb3dQYXJ0OyAvKiBGSVhNRSA/ICovCiAgICAgICAgICAgIGNkci5jZHJlYWRfYnVmYWRkciA9IGJ1ZmZlcjsKICAgICAgICAgICAgY2RyLmNkcmVhZF9idWZsZW4gPSByYXctPlNlY3RvckNvdW50ICogc2VjdFNpemU7CiAgICAgICAgICAgIGlvID0gaW9jdGwoZmQsIENEUk9NUkVBRE1PREUyLCAmY2RyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYQUZvcm0yOgogICAgICAgICAgICBGSVhNRSgiWEFGb3JtMjogTklZXG4iKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICBjYXNlIENEREE6CiAgICAgICAgICAgIC8qIEZJWE1FOiB0aGUgb3V0cHV0IGRvZXNuJ3Qgc2VlbSAxMDAlIGNvcnJlY3QuLi4gaW4gZmFjdCBvdXRwdXQgaXMgc2hpZnRlZAogICAgICAgICAgICAgKiBiZXR3ZWVuIGJ5IE5UMksgYm94IGFuZCB0aGlzLi4uIHNob3VsZCBjaGVjayBvbiB0aGUgc2FtZSBkcml2ZS4uLgogICAgICAgICAgICAgKiBvdGhlcndpc2UsIEkgZmVhciBhIDIzNTIvMjM2OCBtaXNtYXRjaCBzb21ld2hlcmUgaW4gb25lIG9mIHRoZSBkcml2ZXJzCiAgICAgICAgICAgICAqIChsaW51eC9OVCkuCiAgICAgICAgICAgICAqIEFueXdheSwgdGhhdCdzIG5vdCBjcml0aWNhbCBhdCBhbGwuIFdlJ3JlIHRhbGtpbmcgb2YgMTYvMzIgYnl0ZXMsIHdlJ3JlCiAgICAgICAgICAgICAqIHRhbGtpbmcgb2YgMC4yIG1zIG9mIHNvdW5kCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAvKiAyMDQ4ID0gMiAqKiAxMSAqLwogICAgICAgICAgICBpZiAocmF3LT5EaXNrT2Zmc2V0LnUuSGlnaFBhcnQgJiB+MjA0NykgRklYTUUoIlVuc3VwcG9ydGVkIHZhbHVlXG4iKTsKICAgICAgICAgICAgY2RyYS5hZGRyLmxiYSA9ICgocmF3LT5EaXNrT2Zmc2V0LnUuTG93UGFydCA+PiAxMSkgfAogICAgICAgICAgICAgICAgKHJhdy0+RGlza09mZnNldC51LkhpZ2hQYXJ0IDw8ICgzMiAtIDExKSkpIC0gMTsKICAgICAgICAgICAgRklYTUUoInJlYWRpbmcgYXQgJXVcbiIsIGNkcmEuYWRkci5sYmEpOwogICAgICAgICAgICBjZHJhLmFkZHJfZm9ybWF0ID0gQ0RST01fTEJBOwogICAgICAgICAgICBjZHJhLm5mcmFtZXMgPSByYXctPlNlY3RvckNvdW50OwogICAgICAgICAgICBjZHJhLmJ1ZiA9IGJ1ZmZlcjsKICAgICAgICAgICAgaW8gPSBpb2N0bChmZCwgQ0RST01SRUFEQVVESU8sICZjZHJhKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIk5JWTogJWRcbiIsIHJhdy0+VHJhY2tNb2RlKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9CiAgICB9CiNlbHNlCiAgICB7CiAgICAgICAgc3dpdGNoIChyYXctPlRyYWNrTW9kZSkKICAgICAgICB7CiAgICAgICAgY2FzZSBZZWxsb3dNb2RlMjoKICAgICAgICAgICAgRklYTUUoIlllbGxvd01vZGUyOiBOSVlcbiIpOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIGNhc2UgWEFGb3JtMjoKICAgICAgICAgICAgRklYTUUoIlhBRm9ybTI6IE5JWVxuIik7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgY2FzZSBDRERBOgogICAgICAgICAgICBGSVhNRSgiQ0REQTogTklZXG4iKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9CiAgICB9CiNlbmRpZgoKICAgICpzeiA9IHNlY3RTaXplICogcmF3LT5TZWN0b3JDb3VudDsKICAgIHJldCA9IENEUk9NX0dldFN0YXR1c0NvZGUoaW8pOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ0RST01fU2NzaVBhc3NUaHJvdWdoRGlyZWN0CiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fU2NzaVBhc3NUaHJvdWdoRGlyZWN0KGludCBmZCwgUFNDU0lfUEFTU19USFJPVUdIX0RJUkVDVCBwUGFja2V0KQp7CiAgICBpbnQgcmV0ID0gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiNpZiBkZWZpbmVkKGxpbnV4KSAmJiBkZWZpbmVkKENEUk9NX1NFTkRfUEFDS0VUKQogICAgc3RydWN0IGxpbnV4X2Nkcm9tX2dlbmVyaWNfY29tbWFuZCBjbWQ7CiAgICBzdHJ1Y3QgcmVxdWVzdF9zZW5zZSBzZW5zZTsKICAgIGludCBpbzsKCiAgICBpZiAocFBhY2tldC0+TGVuZ3RoIDwgc2l6ZW9mKFNDU0lfUEFTU19USFJPVUdIX0RJUkVDVCkpCglyZXR1cm4gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CgogICAgaWYgKHBQYWNrZXQtPkNkYkxlbmd0aCA+IDEyKQogICAgICAgIHJldHVybiBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CgogICAgaWYgKHBQYWNrZXQtPlNlbnNlSW5mb0xlbmd0aCA+IHNpemVvZihzZW5zZSkpCiAgICAgICAgcmV0dXJuIFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKCiAgICBtZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwogICAgbWVtc2V0KCZzZW5zZSwgMCwgc2l6ZW9mKHNlbnNlKSk7CgogICAgbWVtY3B5KCYoY21kLmNtZCksICYocFBhY2tldC0+Q2RiKSwgcFBhY2tldC0+Q2RiTGVuZ3RoKTsKCiAgICBjbWQuYnVmZmVyICAgICAgICAgPSBwUGFja2V0LT5EYXRhQnVmZmVyOwogICAgY21kLmJ1ZmxlbiAgICAgICAgID0gcFBhY2tldC0+RGF0YVRyYW5zZmVyTGVuZ3RoOwogICAgY21kLnNlbnNlICAgICAgICAgID0gJnNlbnNlOwogICAgY21kLnF1aWV0ICAgICAgICAgID0gMDsKICAgIGNtZC50aW1lb3V0ICAgICAgICA9IHBQYWNrZXQtPlRpbWVPdXRWYWx1ZSpIWjsKCiAgICBzd2l0Y2ggKHBQYWNrZXQtPkRhdGFJbikKICAgIHsKICAgIGNhc2UgU0NTSV9JT0NUTF9EQVRBX09VVDoKICAgICAgICBjbWQuZGF0YV9kaXJlY3Rpb24gPSBDR0NfREFUQV9XUklURTsKCWJyZWFrOwogICAgY2FzZSBTQ1NJX0lPQ1RMX0RBVEFfSU46CiAgICAgICAgY21kLmRhdGFfZGlyZWN0aW9uID0gQ0dDX0RBVEFfUkVBRDsKCWJyZWFrOwogICAgY2FzZSBTQ1NJX0lPQ1RMX0RBVEFfVU5TUEVDSUZJRUQ6CiAgICAgICAgY21kLmRhdGFfZGlyZWN0aW9uID0gQ0dDX0RBVEFfTk9ORTsKCWJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICB9CgogICAgaW8gPSBpb2N0bChmZCwgQ0RST01fU0VORF9QQUNLRVQsICZjbWQpOwoKICAgIGlmIChwUGFja2V0LT5TZW5zZUluZm9MZW5ndGggIT0gMCkKICAgIHsKICAgICAgICBtZW1jcHkoKGNoYXIqKXBQYWNrZXQgKyBwUGFja2V0LT5TZW5zZUluZm9PZmZzZXQsCgkgICAgICAgJnNlbnNlLCBwUGFja2V0LT5TZW5zZUluZm9MZW5ndGgpOwogICAgfQoKICAgIHBQYWNrZXQtPlNjc2lTdGF0dXMgPSBjbWQuc3RhdDsKCiAgICByZXQgPSBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvKTsKCiNlbGlmIGRlZmluZWQoX19OZXRCU0RfXykKICAgIHNjc2lyZXFfdCBjbWQ7CiAgICBpbnQgaW87CgogICAgaWYgKHBQYWNrZXQtPkxlbmd0aCA8IHNpemVvZihTQ1NJX1BBU1NfVEhST1VHSF9ESVJFQ1QpKQoJcmV0dXJuIFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwoKICAgIGlmIChwUGFja2V0LT5DZGJMZW5ndGggPiAxMikKICAgICAgICByZXR1cm4gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwoKICAgIGlmIChwUGFja2V0LT5TZW5zZUluZm9MZW5ndGggPiBTRU5TRUJVRkxFTikKICAgICAgICByZXR1cm4gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwoKICAgIG1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CiAgICBtZW1jcHkoJihjbWQuY21kKSwgJihwUGFja2V0LT5DZGIpLCBwUGFja2V0LT5DZGJMZW5ndGgpOwoKICAgIGNtZC5jbWRsZW4gICAgICAgICA9IHBQYWNrZXQtPkNkYkxlbmd0aDsKICAgIGNtZC5kYXRhYnVmICAgICAgICA9IHBQYWNrZXQtPkRhdGFCdWZmZXI7CiAgICBjbWQuZGF0YWxlbiAgICAgICAgPSBwUGFja2V0LT5EYXRhVHJhbnNmZXJMZW5ndGg7CiAgICBjbWQuc2Vuc2VsZW4gICAgICAgPSBwUGFja2V0LT5TZW5zZUluZm9MZW5ndGg7CiAgICBjbWQudGltZW91dCAgICAgICAgPSBwUGFja2V0LT5UaW1lT3V0VmFsdWUqMTAwMDsgLyogaW4gbWlsbGlzZWNvbmRzICovCgogICAgc3dpdGNoIChwUGFja2V0LT5EYXRhSW4pCiAgICB7CiAgICBjYXNlIFNDU0lfSU9DVExfREFUQV9PVVQ6CiAgICAgICAgY21kLmZsYWdzIHw9IFNDQ01EX1dSSVRFOwoJYnJlYWs7CiAgICBjYXNlIFNDU0lfSU9DVExfREFUQV9JTjoKICAgICAgICBjbWQuZmxhZ3MgfD0gU0NDTURfUkVBRDsKCWJyZWFrOwogICAgY2FzZSBTQ1NJX0lPQ1RMX0RBVEFfVU5TUEVDSUZJRUQ6CiAgICAgICAgY21kLmZsYWdzID0gMDsKCWJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICB9CgogICAgaW8gPSBpb2N0bChmZCwgU0NJT0NDT01NQU5ELCAmY21kKTsKCiAgICBzd2l0Y2ggKGNtZC5yZXRzdHMpCiAgICB7CiAgICBjYXNlIFNDQ01EX09LOiAgICAgICAgIGJyZWFrOwogICAgY2FzZSBTQ0NNRF9USU1FT1VUOiAgICByZXR1cm4gU1RBVFVTX1RJTUVPVVQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgY2FzZSBTQ0NNRF9CVVNZOiAgICAgICByZXR1cm4gU1RBVFVTX0RFVklDRV9CVVNZOwogICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIGNhc2UgU0NDTURfU0VOU0U6ICAgICAgYnJlYWs7CiAgICBjYXNlIFNDQ01EX1VOS05PV046ICAgIHJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOwogICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAocFBhY2tldC0+U2Vuc2VJbmZvTGVuZ3RoICE9IDApCiAgICB7CiAgICAgICAgbWVtY3B5KChjaGFyKilwUGFja2V0ICsgcFBhY2tldC0+U2Vuc2VJbmZvT2Zmc2V0LAoJICAgICAgIGNtZC5zZW5zZSwgcFBhY2tldC0+U2Vuc2VJbmZvTGVuZ3RoKTsKICAgIH0KCiAgICBwUGFja2V0LT5TY3NpU3RhdHVzID0gY21kLnN0YXR1czsKCiAgICByZXQgPSBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvKTsKI2VuZGlmCiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9TY3NpUGFzc1Rocm91Z2gKICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBDRFJPTV9TY3NpUGFzc1Rocm91Z2goaW50IGZkLCBQU0NTSV9QQVNTX1RIUk9VR0ggcFBhY2tldCkKewogICAgaW50IHJldCA9IFNUQVRVU19OT1RfU1VQUE9SVEVEOwojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChDRFJPTV9TRU5EX1BBQ0tFVCkKICAgIHN0cnVjdCBsaW51eF9jZHJvbV9nZW5lcmljX2NvbW1hbmQgY21kOwogICAgc3RydWN0IHJlcXVlc3Rfc2Vuc2Ugc2Vuc2U7CiAgICBpbnQgaW87CgogICAgaWYgKHBQYWNrZXQtPkxlbmd0aCA8IHNpemVvZihTQ1NJX1BBU1NfVEhST1VHSCkpCglyZXR1cm4gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CgogICAgaWYgKHBQYWNrZXQtPkNkYkxlbmd0aCA+IDEyKQogICAgICAgIHJldHVybiBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CgogICAgaWYgKHBQYWNrZXQtPlNlbnNlSW5mb0xlbmd0aCA+IHNpemVvZihzZW5zZSkpCiAgICAgICAgcmV0dXJuIFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKCiAgICBtZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwogICAgbWVtc2V0KCZzZW5zZSwgMCwgc2l6ZW9mKHNlbnNlKSk7CgogICAgbWVtY3B5KCYoY21kLmNtZCksICYocFBhY2tldC0+Q2RiKSwgcFBhY2tldC0+Q2RiTGVuZ3RoKTsKCiAgICBpZiAoIHBQYWNrZXQtPkRhdGFCdWZmZXJPZmZzZXQgPiAweDEwMDAgKQogICAgewogICAgICAgIGNtZC5idWZmZXIgICAgID0gKHZvaWQqKXBQYWNrZXQtPkRhdGFCdWZmZXJPZmZzZXQ7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgY21kLmJ1ZmZlciAgICAgPSAoY2hhciopcFBhY2tldCArIHBQYWNrZXQtPkRhdGFCdWZmZXJPZmZzZXQ7CiAgICB9CiAgICBjbWQuYnVmbGVuICAgICAgICAgPSBwUGFja2V0LT5EYXRhVHJhbnNmZXJMZW5ndGg7CiAgICBjbWQuc2Vuc2UgICAgICAgICAgPSAmc2Vuc2U7CiAgICBjbWQucXVpZXQgICAgICAgICAgPSAwOwogICAgY21kLnRpbWVvdXQgICAgICAgID0gcFBhY2tldC0+VGltZU91dFZhbHVlKkhaOwoKICAgIHN3aXRjaCAocFBhY2tldC0+RGF0YUluKQogICAgewogICAgY2FzZSBTQ1NJX0lPQ1RMX0RBVEFfT1VUOgogICAgICAgIGNtZC5kYXRhX2RpcmVjdGlvbiA9IENHQ19EQVRBX1dSSVRFOwoJYnJlYWs7CiAgICBjYXNlIFNDU0lfSU9DVExfREFUQV9JTjoKICAgICAgICBjbWQuZGF0YV9kaXJlY3Rpb24gPSBDR0NfREFUQV9SRUFEOwoJYnJlYWs7CiAgICBjYXNlIFNDU0lfSU9DVExfREFUQV9VTlNQRUNJRklFRDoKICAgICAgICBjbWQuZGF0YV9kaXJlY3Rpb24gPSBDR0NfREFUQV9OT05FOwoJYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgIH0KCiAgICBpbyA9IGlvY3RsKGZkLCBDRFJPTV9TRU5EX1BBQ0tFVCwgJmNtZCk7CgogICAgaWYgKHBQYWNrZXQtPlNlbnNlSW5mb0xlbmd0aCAhPSAwKQogICAgewogICAgICAgIG1lbWNweSgoY2hhciopcFBhY2tldCArIHBQYWNrZXQtPlNlbnNlSW5mb09mZnNldCwKCSAgICAgICAmc2Vuc2UsIHBQYWNrZXQtPlNlbnNlSW5mb0xlbmd0aCk7CiAgICB9CgogICAgcFBhY2tldC0+U2NzaVN0YXR1cyA9IGNtZC5zdGF0OwoKICAgIHJldCA9IENEUk9NX0dldFN0YXR1c0NvZGUoaW8pOwoKI2VsaWYgZGVmaW5lZChfX05ldEJTRF9fKQogICAgc2NzaXJlcV90IGNtZDsKICAgIGludCBpbzsKCiAgICBpZiAocFBhY2tldC0+TGVuZ3RoIDwgc2l6ZW9mKFNDU0lfUEFTU19USFJPVUdIKSkKCXJldHVybiBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKCiAgICBpZiAocFBhY2tldC0+Q2RiTGVuZ3RoID4gMTIpCiAgICAgICAgcmV0dXJuIFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKCiAgICBpZiAocFBhY2tldC0+U2Vuc2VJbmZvTGVuZ3RoID4gU0VOU0VCVUZMRU4pCiAgICAgICAgcmV0dXJuIFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKCiAgICBtZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwogICAgbWVtY3B5KCYoY21kLmNtZCksICYocFBhY2tldC0+Q2RiKSwgcFBhY2tldC0+Q2RiTGVuZ3RoKTsKCiAgICBpZiAoIHBQYWNrZXQtPkRhdGFCdWZmZXJPZmZzZXQgPiAweDEwMDAgKQogICAgewogICAgICAgIGNtZC5kYXRhYnVmICAgICA9ICh2b2lkKilwUGFja2V0LT5EYXRhQnVmZmVyT2Zmc2V0OwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGNtZC5kYXRhYnVmICAgICA9IChjaGFyKilwUGFja2V0ICsgcFBhY2tldC0+RGF0YUJ1ZmZlck9mZnNldDsKICAgIH0KCiAgICBjbWQuY21kbGVuICAgICAgICAgPSBwUGFja2V0LT5DZGJMZW5ndGg7CiAgICBjbWQuZGF0YWxlbiAgICAgICAgPSBwUGFja2V0LT5EYXRhVHJhbnNmZXJMZW5ndGg7CiAgICBjbWQuc2Vuc2VsZW4gICAgICAgPSBwUGFja2V0LT5TZW5zZUluZm9MZW5ndGg7CiAgICBjbWQudGltZW91dCAgICAgICAgPSBwUGFja2V0LT5UaW1lT3V0VmFsdWUqMTAwMDsgLyogaW4gbWlsbGlzZWNvbmRzICovCgogICAgc3dpdGNoIChwUGFja2V0LT5EYXRhSW4pCiAgICB7CiAgICBjYXNlIFNDU0lfSU9DVExfREFUQV9PVVQ6CiAgICAgICAgY21kLmZsYWdzIHw9IFNDQ01EX1dSSVRFOwoJYnJlYWs7CiAgICBjYXNlIFNDU0lfSU9DVExfREFUQV9JTjoKICAgICAgICBjbWQuZmxhZ3MgfD0gU0NDTURfUkVBRDsKCWJyZWFrOwogICAgY2FzZSBTQ1NJX0lPQ1RMX0RBVEFfVU5TUEVDSUZJRUQ6CiAgICAgICAgY21kLmZsYWdzID0gMDsKCWJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICB9CgogICAgaW8gPSBpb2N0bChmZCwgU0NJT0NDT01NQU5ELCAmY21kKTsKCiAgICBzd2l0Y2ggKGNtZC5yZXRzdHMpCiAgICB7CiAgICBjYXNlIFNDQ01EX09LOiAgICAgICAgIGJyZWFrOwogICAgY2FzZSBTQ0NNRF9USU1FT1VUOiAgICByZXR1cm4gU1RBVFVTX1RJTUVPVVQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgY2FzZSBTQ0NNRF9CVVNZOiAgICAgICByZXR1cm4gU1RBVFVTX0RFVklDRV9CVVNZOwogICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIGNhc2UgU0NDTURfU0VOU0U6ICAgICAgYnJlYWs7CiAgICBjYXNlIFNDQ01EX1VOS05PV046ICAgIHJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOwogICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAocFBhY2tldC0+U2Vuc2VJbmZvTGVuZ3RoICE9IDApCiAgICB7CiAgICAgICAgbWVtY3B5KChjaGFyKilwUGFja2V0ICsgcFBhY2tldC0+U2Vuc2VJbmZvT2Zmc2V0LAoJICAgICAgIGNtZC5zZW5zZSwgcFBhY2tldC0+U2Vuc2VJbmZvTGVuZ3RoKTsKICAgIH0KCiAgICBwUGFja2V0LT5TY3NpU3RhdHVzID0gY21kLnN0YXR1czsKCiAgICByZXQgPSBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvKTsKI2VuZGlmCiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9TY3NpR2V0Q2FwcwogKgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIENEUk9NX1Njc2lHZXRDYXBzKFBJT19TQ1NJX0NBUEFCSUxJVElFUyBjYXBzKQp7CiAgICBOVFNUQVRVUyAgICByZXQgPSBTVEFUVVNfTk9UX0lNUExFTUVOVEVEOwoKICAgIGNhcHMtPkxlbmd0aCA9IHNpemVvZigqY2Fwcyk7CiNpZiBkZWZpbmVkKGxpbnV4KQogICAgY2Fwcy0+TWF4aW11bVRyYW5zZmVyTGVuZ3RoID0gU0dfU0NBVFRFUl9TWjsgLyogRklYTUUgKi8KICAgIGNhcHMtPk1heGltdW1QaHlzaWNhbFBhZ2VzID0gU0dfU0NBVFRFUl9TWiAvIGdldHBhZ2VzaXplKCk7CiAgICBjYXBzLT5TdXBwb3J0ZWRBc3luY2hyb25vdXNFdmVudHMgPSBUUlVFOwogICAgY2Fwcy0+QWxpZ25tZW50TWFzayA9IGdldHBhZ2VzaXplKCk7CiAgICBjYXBzLT5UYWdnZWRRdWV1aW5nID0gRkFMU0U7IC8qIHdlIGNvdWxkIGNoZWNrIHRoYXQgaXQgd29ya3MgYW5kIGFuc3dlciBUUlVFICovCiAgICBjYXBzLT5BZGFwdGVyU2NhbnNEb3duID0gRkFMU0U7IC8qIEZJWE1FID8gKi8KICAgIGNhcHMtPkFkYXB0ZXJVc2VzUGlvID0gRkFMU0U7IC8qIEZJWE1FID8gKi8KICAgIHJldCA9IFNUQVRVU19TVUNDRVNTOwojZWxzZQogICAgRklYTUUoIlVuaW1wbGVtZW50ZWRcbiIpOwojZW5kaWYKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNEUk9NX0dldEFkZHJlc3MKICoKICogaW1wbGVtZW50cyBJT0NUTF9TQ1NJX0dFVF9BRERSRVNTCiAqLwpzdGF0aWMgTlRTVEFUVVMgQ0RST01fR2V0QWRkcmVzcyhpbnQgZmQsIFNDU0lfQUREUkVTUyogYWRkcmVzcykKewogICAgaW50IHBvcnRudW0sIGJ1c2lkLCB0YXJnZXRpZCwgbHVuOwoKICAgIGFkZHJlc3MtPkxlbmd0aCA9IHNpemVvZihTQ1NJX0FERFJFU1MpOwogICAgaWYgKCAhIENEUk9NX0dldEludGVyZmFjZUluZm8oZmQsICZwb3J0bnVtLCAmYnVzaWQsICZ0YXJnZXRpZCwgJmx1bikpCiAgICAgICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwoKICAgIGFkZHJlc3MtPlBvcnROdW1iZXIgPSBwb3J0bnVtOwogICAgYWRkcmVzcy0+UGF0aElkID0gYnVzaWQ7IC8qIGJ1cyBudW1iZXIgKi8KICAgIGFkZHJlc3MtPlRhcmdldElkID0gdGFyZ2V0aWQ7CiAgICBhZGRyZXNzLT5MdW4gPSBsdW47CiAgICByZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCURWRF9TdGFydFNlc3Npb24KICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBEVkRfU3RhcnRTZXNzaW9uKGludCBmZCwgUERWRF9TRVNTSU9OX0lEIHNpZF9pbiwgUERWRF9TRVNTSU9OX0lEIHNpZF9vdXQpCnsKI2lmIGRlZmluZWQobGludXgpCiAgICBOVFNUQVRVUyByZXQgPSBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKICAgIGR2ZF9hdXRoaW5mbyBhdXRoX2luZm87CgogICAgbWVtc2V0KCAmYXV0aF9pbmZvLCAwLCBzaXplb2YoIGF1dGhfaW5mbyApICk7CiAgICBhdXRoX2luZm8udHlwZSA9IERWRF9MVV9TRU5EX0FHSUQ7CiAgICBpZiAoc2lkX2luKSBhdXRoX2luZm8ubHNhLmFnaWQgPSAqKGludCopc2lkX2luOyAvKiA/Ki8KCiAgICBUUkFDRSgiZmQgMHglMDh4XG4iLGZkKTsKICAgIHJldCA9Q0RST01fR2V0U3RhdHVzQ29kZShpb2N0bChmZCwgRFZEX0FVVEgsICZhdXRoX2luZm8pKTsKICAgICpzaWRfb3V0ID0gYXV0aF9pbmZvLmxzYS5hZ2lkOwogICAgcmV0dXJuIHJldDsKI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQogICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwojZWxzZQogICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRFZEX0VuZFNlc3Npb24KICoKICoKICovCnN0YXRpYyBOVFNUQVRVUyBEVkRfRW5kU2Vzc2lvbihpbnQgZmQsIFBEVkRfU0VTU0lPTl9JRCBzaWQpCnsKI2lmIGRlZmluZWQobGludXgpCiAgICBkdmRfYXV0aGluZm8gYXV0aF9pbmZvOwoKICAgIG1lbXNldCggJmF1dGhfaW5mbywgMCwgc2l6ZW9mKCBhdXRoX2luZm8gKSApOwogICAgYXV0aF9pbmZvLnR5cGUgPSBEVkRfSU5WQUxJREFURV9BR0lEOwogICAgYXV0aF9pbmZvLmxzYS5hZ2lkID0gKihpbnQqKXNpZDsKCiAgICBUUkFDRSgiXG4iKTsKICAgIHJldHVybiBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvY3RsKGZkLCBEVkRfQVVUSCwgJmF1dGhfaW5mbykpOwojZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCiAgICByZXR1cm4gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiNlbHNlCiAgICByZXR1cm4gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlEVkRfU2VuZEtleQogKgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIERWRF9TZW5kS2V5KGludCBmZCwgUERWRF9DT1BZX1BST1RFQ1RfS0VZIGtleSkKewojaWYgZGVmaW5lZChsaW51eCkKICAgIE5UU1RBVFVTIHJldCA9IFNUQVRVU19OT1RfU1VQUE9SVEVEOwogICAgZHZkX2F1dGhpbmZvIGF1dGhfaW5mbzsKCiAgICBtZW1zZXQoICZhdXRoX2luZm8sIDAsIHNpemVvZiggYXV0aF9pbmZvICkgKTsKICAgIHN3aXRjaCAoa2V5LT5LZXlUeXBlKQogICAgewogICAgY2FzZSBEdmRDaGFsbGVuZ2VLZXk6CglhdXRoX2luZm8udHlwZSA9IERWRF9IT1NUX1NFTkRfQ0hBTExFTkdFOwoJYXV0aF9pbmZvLmhzYy5hZ2lkID0gKGludClrZXktPlNlc3Npb25JZDsKCVRSQUNFKCJEdmRDaGFsbGVuZ2VLZXkgaW9jIDB4JXhcbiIsIERWRF9BVVRIICk7CgltZW1jcHkoIGF1dGhfaW5mby5oc2MuY2hhbCwga2V5LT5LZXlEYXRhLCBEVkRfQ0hBTExFTkdFX1NJWkUgKTsKCXJldCA9IENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoIGZkLCBEVkRfQVVUSCwgJmF1dGhfaW5mbyApKTsKCWJyZWFrOwogICAgY2FzZSBEdmRCdXNLZXkyOgoJYXV0aF9pbmZvLnR5cGUgPSBEVkRfSE9TVF9TRU5EX0tFWTI7CglhdXRoX2luZm8uaHNrLmFnaWQgPSAoaW50KWtleS0+U2Vzc2lvbklkOwoKCW1lbWNweSggYXV0aF9pbmZvLmhzay5rZXksIGtleS0+S2V5RGF0YSwgRFZEX0tFWV9TSVpFICk7CgkKCVRSQUNFKCJEdmRCdXNLZXkyXG4iKTsKCXJldCA9IENEUk9NX0dldFN0YXR1c0NvZGUoaW9jdGwoIGZkLCBEVkRfQVVUSCwgJmF1dGhfaW5mbyApKTsKCWJyZWFrOwoKICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBLZXl0eXBlIDB4JXhcbiIsa2V5LT5LZXlUeXBlKTsKICAgIH0KICAgIHJldHVybiByZXQ7CiNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykKICAgIFRSQUNFKCJic2RcbiIpOwogICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwojZWxzZQogICAgVFJBQ0UoIm91dHNpZGVcbiIpOwogICAgcmV0dXJuIFNUQVRVU19OT1RfU1VQUE9SVEVEOwojZW5kaWYKICAgIFRSQUNFKCJub3QgcmVhY2hlZFxuIik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCURWRF9SZWFkS2V5CiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgRFZEX1JlYWRLZXkoaW50IGZkLCBQRFZEX0NPUFlfUFJPVEVDVF9LRVkga2V5KQp7CiNpZiBkZWZpbmVkKGxpbnV4KQogICAgTlRTVEFUVVMgcmV0ID0gU1RBVFVTX05PVF9TVVBQT1JURUQ7CiAgICBkdmRfc3RydWN0IGR2ZDsKICAgIGR2ZF9hdXRoaW5mbyBhdXRoX2luZm87CgogICAgbWVtc2V0KCAmZHZkLCAwLCBzaXplb2YoIGR2ZF9zdHJ1Y3QgKSApOwogICAgbWVtc2V0KCAmYXV0aF9pbmZvLCAwLCBzaXplb2YoIGF1dGhfaW5mbyApICk7CiAgICBzd2l0Y2ggKGtleS0+S2V5VHlwZSkKICAgIHsKICAgIGNhc2UgRHZkRGlza0tleToKCQoJZHZkLnR5cGUgPSBEVkRfU1RSVUNUX0RJU0NLRVk7CglkdmQuZGlzY2tleS5hZ2lkID0gKGludClrZXktPlNlc3Npb25JZDsKCW1lbXNldCggZHZkLmRpc2NrZXkudmFsdWUsIDAsIERWRF9ESVNDS0VZX1NJWkUgKTsKCQoJVFJBQ0UoIkR2ZERpc2tLZXlcbiIpOwoJcmV0ID0gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bCggZmQsIERWRF9SRUFEX1NUUlVDVCwgJmR2ZCApKTsKCWlmIChyZXQgPT0gU1RBVFVTX1NVQ0NFU1MpCgkgICAgbWVtY3B5KGtleS0+S2V5RGF0YSxkdmQuZGlzY2tleS52YWx1ZSxEVkRfRElTQ0tFWV9TSVpFKTsKCWJyZWFrOwogICAgY2FzZSBEdmRUaXRsZUtleToKCWF1dGhfaW5mby50eXBlID0gRFZEX0xVX1NFTkRfVElUTEVfS0VZOwoJYXV0aF9pbmZvLmxzdGsuYWdpZCA9IChpbnQpa2V5LT5TZXNzaW9uSWQ7CglhdXRoX2luZm8ubHN0ay5sYmEgPSAoaW50KShrZXktPlBhcmFtZXRlcnMuVGl0bGVPZmZzZXQuUXVhZFBhcnQ+PjExKTsKCVRSQUNFKCJEdmRUaXRsZUtleSBzZXNzaW9uICVkIFF1YWRwYXJ0IDB4JTA4bHggb2Zmc2V0IDB4JTA4eFxuIiwKCSAgICAgIChpbnQpa2V5LT5TZXNzaW9uSWQsIChsb25nKWtleS0+UGFyYW1ldGVycy5UaXRsZU9mZnNldC5RdWFkUGFydCwgCgkgICAgICBhdXRoX2luZm8ubHN0ay5sYmEpOwoJcmV0ID0gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bCggZmQsIERWRF9BVVRILCAmYXV0aF9pbmZvICkpOwoJaWYgKHJldCA9PSBTVEFUVVNfU1VDQ0VTUykKCSAgICBtZW1jcHkoa2V5LT5LZXlEYXRhLCBhdXRoX2luZm8ubHN0ay50aXRsZV9rZXksIERWRF9LRVlfU0laRSApOwoJYnJlYWs7CiAgICBjYXNlIER2ZENoYWxsZW5nZUtleToKCglhdXRoX2luZm8udHlwZSA9IERWRF9MVV9TRU5EX0NIQUxMRU5HRTsKCWF1dGhfaW5mby5sc2MuYWdpZCA9IChpbnQpa2V5LT5TZXNzaW9uSWQ7CgoJVFJBQ0UoIkR2ZENoYWxsZW5nZUtleVxuIik7CglyZXQgPSBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvY3RsKCBmZCwgRFZEX0FVVEgsICZhdXRoX2luZm8gKSk7CglpZiAocmV0ID09IFNUQVRVU19TVUNDRVNTKQoJICAgIG1lbWNweSgga2V5LT5LZXlEYXRhLCBhdXRoX2luZm8ubHNjLmNoYWwsIERWRF9DSEFMTEVOR0VfU0laRSApOwoJYnJlYWs7CiAgICBjYXNlIER2ZEFzZjoKCWF1dGhfaW5mby50eXBlID0gRFZEX0xVX1NFTkRfQVNGOwoJVFJBQ0UoIkR2ZEFzZlxuIik7CglhdXRoX2luZm8ubHNhc2YuYXNmPSgoUERWRF9BU0Ypa2V5LT5LZXlEYXRhKS0+U3VjY2Vzc0ZsYWc7CglyZXQgPSBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvY3RsKCBmZCwgRFZEX0FVVEgsICZhdXRoX2luZm8gKSk7CgkoKFBEVkRfQVNGKWtleS0+S2V5RGF0YSktPlN1Y2Nlc3NGbGFnID0gYXV0aF9pbmZvLmxzYXNmLmFzZjsKCWJyZWFrOwogICAgY2FzZSBEdmRCdXNLZXkxOgoJYXV0aF9pbmZvLnR5cGUgPSBEVkRfTFVfU0VORF9LRVkxOwoJYXV0aF9pbmZvLmxzay5hZ2lkID0gKGludClrZXktPlNlc3Npb25JZDsKCglUUkFDRSgiRHZkQnVzS2V5MVxuIik7CglyZXQgPSBDRFJPTV9HZXRTdGF0dXNDb2RlKGlvY3RsKCBmZCwgRFZEX0FVVEgsICZhdXRoX2luZm8gKSk7CgoJaWYgKHJldCA9PSBTVEFUVVNfU1VDQ0VTUykKCSAgICBtZW1jcHkoIGtleS0+S2V5RGF0YSwgYXV0aF9pbmZvLmxzay5rZXksIERWRF9LRVlfU0laRSApOwoJYnJlYWs7CiAgICBjYXNlIER2ZEdldFJwY0tleToKCWF1dGhfaW5mby50eXBlID0gRFZEX0xVX1NFTkRfUlBDX1NUQVRFOwoKCVRSQUNFKCJEdmRHZXRScGNLZXlcbiIpOwoJcmV0ID0gQ0RST01fR2V0U3RhdHVzQ29kZShpb2N0bCggZmQsIERWRF9BVVRILCAmYXV0aF9pbmZvICkpOwoKCWlmIChyZXQgPT0gU1RBVFVTX1NVQ0NFU1MpCgl7CgkgICAgKChQRFZEX1JQQ19LRVkpa2V5LT5LZXlEYXRhKS0+VHlwZUNvZGUgPSBhdXRoX2luZm8ubHJwY3MudHlwZTsKCSAgICAoKFBEVkRfUlBDX0tFWSlrZXktPktleURhdGEpLT5SZWdpb25NYXNrID0gYXV0aF9pbmZvLmxycGNzLnJlZ2lvbl9tYXNrOwoJICAgICgoUERWRF9SUENfS0VZKWtleS0+S2V5RGF0YSktPlJwY1NjaGVtZSA9IGF1dGhfaW5mby5scnBjcy5ycGNfc2NoZW1lOwoJfQoJYnJlYWs7CiAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24ga2V5dHlwZSAweCV4XG4iLGtleS0+S2V5VHlwZSk7CiAgICB9CiAgICByZXR1cm4gcmV0OwojZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCiAgICBUUkFDRSgiYnNkXG4iKTsKICAgIHJldHVybiBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKI2Vsc2UKICAgIFRSQUNFKCJvdXRzaWRlXG4iKTsKICAgIHJldHVybiBTVEFUVVNfTk9UX1NVUFBPUlRFRDsKI2VuZGlmCiAgICBUUkFDRSgibm90IHJlYWNoZWRcbiIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlEVkRfR2V0UmVnaW9uCiAqCiAqCiAqLwpzdGF0aWMgTlRTVEFUVVMgRFZEX0dldFJlZ2lvbihpbnQgZGV2LCBQRFZEX1JFR0lPTiByZWdpb24pCnsKICAgIEZJWE1FKCJcbiIpOwogICAgcmV0dXJuIFNUQVRVU19TVUNDRVNTOwoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRFZEX0dldFJlZ2lvbgogKgogKgogKi8Kc3RhdGljIE5UU1RBVFVTIERWRF9SZWFkU3RydWN0dXJlKGludCBkZXYsIFBEVkRfUkVBRF9TVFJVQ1RVUkUgc3RydWN0dXJlLCBQRFZEX0xBWUVSX0RFU0NSSVBUT1IgbGF5ZXIpCnsKICAgIEZJWE1FKCJcbiIpOwogICAgcmV0dXJuIFNUQVRVU19TVUNDRVNTOwoKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDRFJPTV9EZXZpY2VJb0NvbnRyb2wKICoKICoKICovCk5UU1RBVFVTIENEUk9NX0RldmljZUlvQ29udHJvbChIQU5ETEUgaERldmljZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEUgaEV2ZW50LCBQSU9fQVBDX1JPVVRJTkUgVXNlckFwY1JvdXRpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVk9JRCBVc2VyQXBjQ29udGV4dCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSU9fU1RBVFVTX0JMT0NLIHBpb3NiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIGR3SW9Db250cm9sQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscEluQnVmZmVyLCBEV09SRCBuSW5CdWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwT3V0QnVmZmVyLCBEV09SRCBuT3V0QnVmZmVyU2l6ZSkKewogICAgRFdPUkQgICAgICAgc3ogPSAwOwogICAgTlRTVEFUVVMgICAgc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAgICBpbnQgZmQsIGRldjsKCiAgICBUUkFDRSgiJWx4ICVzICVseCAlbGQgJWx4ICVsZCAlcFxuIiwKICAgICAgICAgIChEV09SRCloRGV2aWNlLCBpb2NvZGV4KGR3SW9Db250cm9sQ29kZSksIChEV09SRClscEluQnVmZmVyLCBuSW5CdWZmZXJTaXplLAogICAgICAgICAgKERXT1JEKWxwT3V0QnVmZmVyLCBuT3V0QnVmZmVyU2l6ZSwgcGlvc2IpOwoKICAgIHBpb3NiLT5JbmZvcm1hdGlvbiA9IDA7CgogICAgaWYgKChzdGF0dXMgPSB3aW5lX3NlcnZlcl9oYW5kbGVfdG9fZmQoIGhEZXZpY2UsIDAsICZmZCwgTlVMTCApKSkgZ290byBlcnJvcjsKICAgIGlmICgoc3RhdHVzID0gQ0RST01fT3BlbihmZCwgJmRldikpKQogICAgewogICAgICAgIHdpbmVfc2VydmVyX3JlbGVhc2VfZmQoIGhEZXZpY2UsIGZkICk7CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICBzd2l0Y2ggKGR3SW9Db250cm9sQ29kZSkKICAgIHsKICAgIGNhc2UgSU9DVExfU1RPUkFHRV9DSEVDS19WRVJJRlk6CiAgICBjYXNlIElPQ1RMX0NEUk9NX0NIRUNLX1ZFUklGWToKICAgICAgICBzeiA9IDA7CglDRFJPTV9DbGVhckNhY2hlRW50cnkoZGV2KTsKICAgICAgICBpZiAobHBJbkJ1ZmZlciAhPSBOVUxMIHx8IG5JbkJ1ZmZlclNpemUgIT0gMCB8fCBscE91dEJ1ZmZlciAhPSBOVUxMIHx8IG5PdXRCdWZmZXJTaXplICE9IDApCiAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX1ZlcmlmeShkZXYsIGZkKTsKICAgICAgICBicmVhazsKCi8qIEVQUCAgICAgY2FzZSBJT0NUTF9TVE9SQUdFX0NIRUNLX1ZFUklGWTI6ICovCgovKiBFUFAgICAgIGNhc2UgSU9DVExfU1RPUkFHRV9GSU5EX05FV19ERVZJQ0VTOiAqLwovKiBFUFAgICAgIGNhc2UgSU9DVExfQ0RST01fRklORF9ORVdfREVWSUNFUzogKi8KCiAgICBjYXNlIElPQ1RMX1NUT1JBR0VfTE9BRF9NRURJQToKICAgIGNhc2UgSU9DVExfQ0RST01fTE9BRF9NRURJQToKICAgICAgICBzeiA9IDA7CglDRFJPTV9DbGVhckNhY2hlRW50cnkoZGV2KTsKICAgICAgICBpZiAobHBJbkJ1ZmZlciAhPSBOVUxMIHx8IG5JbkJ1ZmZlclNpemUgIT0gMCB8fCBscE91dEJ1ZmZlciAhPSBOVUxMIHx8IG5PdXRCdWZmZXJTaXplICE9IDApCiAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX1NldFRyYXkoZmQsIEZBTFNFKTsKICAgICAgICBicmVhazsKICAgICBjYXNlIElPQ1RMX1NUT1JBR0VfRUpFQ1RfTUVESUE6CiAgICAgICAgc3ogPSAwOwoJQ0RST01fQ2xlYXJDYWNoZUVudHJ5KGRldik7CiAgICAgICAgaWYgKGxwSW5CdWZmZXIgIT0gTlVMTCB8fCBuSW5CdWZmZXJTaXplICE9IDAgfHwgbHBPdXRCdWZmZXIgIT0gTlVMTCB8fCBuT3V0QnVmZmVyU2l6ZSAhPSAwKQogICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9TZXRUcmF5KGZkLCBUUlVFKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIElPQ1RMX0NEUk9NX01FRElBX1JFTU9WQUw6CiAgICBjYXNlIElPQ1RMX0RJU0tfTUVESUFfUkVNT1ZBTDoKICAgIGNhc2UgSU9DVExfU1RPUkFHRV9NRURJQV9SRU1PVkFMOgogICAgY2FzZSBJT0NUTF9TVE9SQUdFX0VKRUNUSU9OX0NPTlRST0w6CiAgICAgICAgLyogRklYTUUgdGhlIGxhc3QgaW9jdGw6cyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHR3byBvdGhlcnMuLi4KICAgICAgICAgKiBsb2NrY291bnQvb3duZXIgc2hvdWxkIGJlIGhhbmRsZWQgKi8KICAgICAgICBzeiA9IDA7CglDRFJPTV9DbGVhckNhY2hlRW50cnkoZGV2KTsKICAgICAgICBpZiAobHBPdXRCdWZmZXIgIT0gTlVMTCB8fCBuT3V0QnVmZmVyU2l6ZSAhPSAwKSBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobkluQnVmZmVyU2l6ZSA8IHNpemVvZihQUkVWRU5UX01FRElBX1JFTU9WQUwpKSBzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX0NvbnRyb2xFamVjdGlvbihmZCwgKGNvbnN0IFBSRVZFTlRfTUVESUFfUkVNT1ZBTCopbHBJbkJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CgovKiBFUFAgICAgIGNhc2UgSU9DVExfU1RPUkFHRV9HRVRfTUVESUFfVFlQRVM6ICovCgogICAgY2FzZSBJT0NUTF9TVE9SQUdFX0dFVF9ERVZJQ0VfTlVNQkVSOgogICAgICAgIHN6ID0gc2l6ZW9mKFNUT1JBR0VfREVWSUNFX05VTUJFUik7CiAgICAgICAgaWYgKGxwSW5CdWZmZXIgIT0gTlVMTCB8fCBuSW5CdWZmZXJTaXplICE9IDApIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIGlmIChuT3V0QnVmZmVyU2l6ZSA8IHN6KSBzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX0dldERldmljZU51bWJlcihkZXYsIChTVE9SQUdFX0RFVklDRV9OVU1CRVIqKWxwT3V0QnVmZmVyKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIElPQ1RMX1NUT1JBR0VfUkVTRVRfREVWSUNFOgogICAgICAgIHN6ID0gMDsKCUNEUk9NX0NsZWFyQ2FjaGVFbnRyeShkZXYpOwogICAgICAgIGlmIChscEluQnVmZmVyICE9IE5VTEwgfHwgbkluQnVmZmVyU2l6ZSAhPSAwIHx8IGxwT3V0QnVmZmVyICE9IE5VTEwgfHwgbk91dEJ1ZmZlclNpemUgIT0gMCkKICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2Ugc3RhdHVzID0gQ0RST01fUmVzZXRBdWRpbyhmZCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBJT0NUTF9DRFJPTV9HRVRfQ09OVFJPTDoKICAgICAgICBzeiA9IHNpemVvZihDRFJPTV9BVURJT19DT05UUk9MKTsKICAgICAgICBpZiAobHBJbkJ1ZmZlciAhPSBOVUxMIHx8IG5JbkJ1ZmZlclNpemUgIT0gMCkgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2UgaWYgKG5PdXRCdWZmZXJTaXplIDwgc3opIHN0YXR1cyA9IFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwogICAgICAgIGVsc2Ugc3RhdHVzID0gQ0RST01fR2V0Q29udHJvbChkZXYsIChDRFJPTV9BVURJT19DT05UUk9MKilscE91dEJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBJT0NUTF9DRFJPTV9HRVRfRFJJVkVfR0VPTUVUUlk6CiAgICAgICAgc3ogPSBzaXplb2YoRElTS19HRU9NRVRSWSk7CiAgICAgICAgaWYgKGxwSW5CdWZmZXIgIT0gTlVMTCB8fCBuSW5CdWZmZXJTaXplICE9IDApIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIGlmIChuT3V0QnVmZmVyU2l6ZSA8IHN6KSBzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX0dldERyaXZlR2VvbWV0cnkoZGV2LCBmZCwgKERJU0tfR0VPTUVUUlkqKWxwT3V0QnVmZmVyKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIElPQ1RMX0NEUk9NX0RJU0tfVFlQRToKICAgICAgICBzeiA9IHNpemVvZihDRFJPTV9ESVNLX0RBVEEpOwoJLyogQ0RST01fQ2xlYXJDYWNoZUVudHJ5KGRldik7ICovCiAgICAgICAgaWYgKGxwSW5CdWZmZXIgIT0gTlVMTCB8fCBuSW5CdWZmZXJTaXplICE9IDApIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIGlmIChuT3V0QnVmZmVyU2l6ZSA8IHN6KSBzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX0dldERpc2tEYXRhKGRldiwgZmQsIChDRFJPTV9ESVNLX0RBVEEqKWxwT3V0QnVmZmVyKTsKICAgICAgICBicmVhazsKCi8qIEVQUCAgICAgY2FzZSBJT0NUTF9DRFJPTV9HRVRfTEFTVF9TRVNTSU9OOiAqLwoKICAgIGNhc2UgSU9DVExfQ0RST01fUkVBRF9RX0NIQU5ORUw6CiAgICAgICAgc3ogPSBzaXplb2YoU1VCX1FfQ0hBTk5FTF9EQVRBKTsKICAgICAgICBpZiAobHBJbkJ1ZmZlciA9PSBOVUxMIHx8IG5JbkJ1ZmZlclNpemUgPCBzaXplb2YoQ0RST01fU1VCX1FfREFUQV9GT1JNQVQpKQogICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobk91dEJ1ZmZlclNpemUgPCBzeikgc3RhdHVzID0gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9SZWFkUUNoYW5uZWwoZGV2LCBmZCwgKGNvbnN0IENEUk9NX1NVQl9RX0RBVEFfRk9STUFUKilscEluQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNVQl9RX0NIQU5ORUxfREFUQSopbHBPdXRCdWZmZXIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgSU9DVExfQ0RST01fUkVBRF9UT0M6CiAgICAgICAgc3ogPSBzaXplb2YoQ0RST01fVE9DKTsKICAgICAgICBpZiAobHBJbkJ1ZmZlciAhPSBOVUxMIHx8IG5JbkJ1ZmZlclNpemUgIT0gMCkgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2UgaWYgKG5PdXRCdWZmZXJTaXplIDwgc3opIHN0YXR1cyA9IFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwogICAgICAgIGVsc2Ugc3RhdHVzID0gQ0RST01fUmVhZFRPQyhkZXYsIGZkLCAoQ0RST01fVE9DKilscE91dEJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CgovKiBFUFAgICAgIGNhc2UgSU9DVExfQ0RST01fUkVBRF9UT0NfRVg6ICovCgogICAgY2FzZSBJT0NUTF9DRFJPTV9QQVVTRV9BVURJTzoKICAgICAgICBzeiA9IDA7CiAgICAgICAgaWYgKGxwSW5CdWZmZXIgIT0gTlVMTCB8fCBuSW5CdWZmZXJTaXplICE9IDAgfHwgbHBPdXRCdWZmZXIgIT0gTlVMTCB8fCBuT3V0QnVmZmVyU2l6ZSAhPSAwKQogICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9QYXVzZUF1ZGlvKGZkKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgSU9DVExfQ0RST01fUExBWV9BVURJT19NU0Y6CiAgICAgICAgc3ogPSAwOwogICAgICAgIGlmIChscE91dEJ1ZmZlciAhPSBOVUxMIHx8IG5PdXRCdWZmZXJTaXplICE9IDApIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIGlmIChuSW5CdWZmZXJTaXplIDwgc2l6ZW9mKENEUk9NX1BMQVlfQVVESU9fTVNGKSkgc3RhdHVzID0gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9QbGF5QXVkaW9NU0YoZmQsIChjb25zdCBDRFJPTV9QTEFZX0FVRElPX01TRiopbHBJbkJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX0NEUk9NX1JFU1VNRV9BVURJTzoKICAgICAgICBzeiA9IDA7CiAgICAgICAgaWYgKGxwSW5CdWZmZXIgIT0gTlVMTCB8fCBuSW5CdWZmZXJTaXplICE9IDAgfHwgbHBPdXRCdWZmZXIgIT0gTlVMTCB8fCBuT3V0QnVmZmVyU2l6ZSAhPSAwKQogICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9SZXN1bWVBdWRpbyhmZCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX0NEUk9NX1NFRUtfQVVESU9fTVNGOgogICAgICAgIHN6ID0gMDsKICAgICAgICBpZiAobHBPdXRCdWZmZXIgIT0gTlVMTCB8fCBuT3V0QnVmZmVyU2l6ZSAhPSAwKSBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobkluQnVmZmVyU2l6ZSA8IHNpemVvZihDRFJPTV9TRUVLX0FVRElPX01TRikpIHN0YXR1cyA9IFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwogICAgICAgIGVsc2Ugc3RhdHVzID0gQ0RST01fU2Vla0F1ZGlvTVNGKGRldiwgZmQsIChjb25zdCBDRFJPTV9TRUVLX0FVRElPX01TRiopbHBJbkJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX0NEUk9NX1NUT1BfQVVESU86CiAgICAgICAgc3ogPSAwOwoJQ0RST01fQ2xlYXJDYWNoZUVudHJ5KGRldik7IC8qIE1heWJlIGludGVudGlvbiBpcyB0byBjaGFuZ2UgbWVkaWEgKi8KICAgICAgICBpZiAobHBJbkJ1ZmZlciAhPSBOVUxMIHx8IG5JbkJ1ZmZlclNpemUgIT0gMCB8fCBscE91dEJ1ZmZlciAhPSBOVUxMIHx8IG5PdXRCdWZmZXJTaXplICE9IDApCiAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX1N0b3BBdWRpbyhmZCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX0NEUk9NX0dFVF9WT0xVTUU6CiAgICAgICAgc3ogPSBzaXplb2YoVk9MVU1FX0NPTlRST0wpOwogICAgICAgIGlmIChscEluQnVmZmVyICE9IE5VTEwgfHwgbkluQnVmZmVyU2l6ZSAhPSAwKSBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobk91dEJ1ZmZlclNpemUgPCBzeikgc3RhdHVzID0gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9HZXRWb2x1bWUoZmQsIChWT0xVTUVfQ09OVFJPTCopbHBPdXRCdWZmZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9DRFJPTV9TRVRfVk9MVU1FOgogICAgICAgIHN6ID0gMDsKCUNEUk9NX0NsZWFyQ2FjaGVFbnRyeShkZXYpOwogICAgICAgIGlmIChscEluQnVmZmVyID09IE5VTEwgfHwgbkluQnVmZmVyU2l6ZSA8IHNpemVvZihWT0xVTUVfQ09OVFJPTCkgfHwgbHBPdXRCdWZmZXIgIT0gTlVMTCkKICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2Ugc3RhdHVzID0gQ0RST01fU2V0Vm9sdW1lKGZkLCAoY29uc3QgVk9MVU1FX0NPTlRST0wqKWxwSW5CdWZmZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9DRFJPTV9SQVdfUkVBRDoKICAgICAgICBzeiA9IDA7CiAgICAgICAgaWYgKG5JbkJ1ZmZlclNpemUgPCBzaXplb2YoUkFXX1JFQURfSU5GTykpIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIGlmIChscE91dEJ1ZmZlciA9PSBOVUxMKSBzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX1Jhd1JlYWQoZmQsIChjb25zdCBSQVdfUkVBRF9JTkZPKilscEluQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwT3V0QnVmZmVyLCBuT3V0QnVmZmVyU2l6ZSwgJnN6KTsKICAgICAgICBicmVhazsKICAgIGNhc2UgSU9DVExfU0NTSV9HRVRfQUREUkVTUzoKICAgICAgICBzeiA9IHNpemVvZihTQ1NJX0FERFJFU1MpOwogICAgICAgIGlmIChscEluQnVmZmVyICE9IE5VTEwgfHwgbkluQnVmZmVyU2l6ZSAhPSAwKSBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobk91dEJ1ZmZlclNpemUgPCBzeikgc3RhdHVzID0gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9HZXRBZGRyZXNzKGZkLCAoU0NTSV9BRERSRVNTKilscE91dEJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX1NDU0lfUEFTU19USFJPVUdIX0RJUkVDVDoKICAgICAgICBzeiA9IHNpemVvZihTQ1NJX1BBU1NfVEhST1VHSF9ESVJFQ1QpOwogICAgICAgIGlmIChscE91dEJ1ZmZlciA9PSBOVUxMKSBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobk91dEJ1ZmZlclNpemUgPCBzaXplb2YoU0NTSV9QQVNTX1RIUk9VR0hfRElSRUNUKSkgc3RhdHVzID0gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CiAgICAgICAgZWxzZSBzdGF0dXMgPSBDRFJPTV9TY3NpUGFzc1Rocm91Z2hEaXJlY3QoZmQsIChQU0NTSV9QQVNTX1RIUk9VR0hfRElSRUNUKWxwT3V0QnVmZmVyKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgSU9DVExfU0NTSV9QQVNTX1RIUk9VR0g6CiAgICAgICAgc3ogPSBzaXplb2YoU0NTSV9QQVNTX1RIUk9VR0gpOwogICAgICAgIGlmIChscE91dEJ1ZmZlciA9PSBOVUxMKSBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobk91dEJ1ZmZlclNpemUgPCBzaXplb2YoU0NTSV9QQVNTX1RIUk9VR0gpKSBzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICBlbHNlIHN0YXR1cyA9IENEUk9NX1Njc2lQYXNzVGhyb3VnaChmZCwgKFBTQ1NJX1BBU1NfVEhST1VHSClscE91dEJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX1NDU0lfR0VUX0NBUEFCSUxJVElFUzoKICAgICAgICBzeiA9IHNpemVvZihJT19TQ1NJX0NBUEFCSUxJVElFUyk7CiAgICAgICAgaWYgKGxwT3V0QnVmZmVyID09IE5VTEwpIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBlbHNlIGlmIChuT3V0QnVmZmVyU2l6ZSA8IHNpemVvZihJT19TQ1NJX0NBUEFCSUxJVElFUykpIHN0YXR1cyA9IFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwogICAgICAgIGVsc2Ugc3RhdHVzID0gQ0RST01fU2NzaUdldENhcHMoKFBJT19TQ1NJX0NBUEFCSUxJVElFUylscE91dEJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX0RWRF9TVEFSVF9TRVNTSU9OOgogICAgICAgIHN6ID0gc2l6ZW9mKERWRF9TRVNTSU9OX0lEKTsKICAgICAgICBpZiAobHBPdXRCdWZmZXIgPT0gTlVMTCkgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2UgaWYgKG5PdXRCdWZmZXJTaXplIDwgc3opIHN0YXR1cyA9IFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCJiZWZvcmUgaW4gMHglMDhseCBvdXQgMHglMDhseFxuIiwobHBJbkJ1ZmZlcik/KihQRFZEX1NFU1NJT05fSUQpbHBJbkJ1ZmZlcjowLAogICAgICAgICAgICAgICAgICAqKFBEVkRfU0VTU0lPTl9JRClscE91dEJ1ZmZlcik7CiAgICAgICAgICAgIHN0YXR1cyA9IERWRF9TdGFydFNlc3Npb24oZmQsIChQRFZEX1NFU1NJT05fSUQpbHBJbkJ1ZmZlciwgKFBEVkRfU0VTU0lPTl9JRClscE91dEJ1ZmZlcik7CiAgICAgICAgICAgIFRSQUNFKCJiZWZvcmUgaW4gMHglMDhseCBvdXQgMHglMDhseFxuIiwobHBJbkJ1ZmZlcik/KihQRFZEX1NFU1NJT05fSUQpbHBJbkJ1ZmZlcjowLAogICAgICAgICAgICAgICAgICAqKFBEVkRfU0VTU0lPTl9JRClscE91dEJ1ZmZlcik7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9EVkRfRU5EX1NFU1NJT046CiAgICAgICAgc3ogPSBzaXplb2YoRFZEX1NFU1NJT05fSUQpOwogICAgICAgIGlmICgobHBJbkJ1ZmZlciA9PSBOVUxMKSB8fCAgKG5JbkJ1ZmZlclNpemUgPCBzeikpc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2Ugc3RhdHVzID0gRFZEX0VuZFNlc3Npb24oZmQsIChQRFZEX1NFU1NJT05fSUQpbHBJbkJ1ZmZlcik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX0RWRF9TRU5EX0tFWToKICAgICAgICBzeiA9IDA7CiAgICAgICAgaWYgKCFscEluQnVmZmVyIHx8CiAgICAgICAgICAgICgoKFBEVkRfQ09QWV9QUk9URUNUX0tFWSlscEluQnVmZmVyKS0+S2V5TGVuZ3RoICE9IG5JbkJ1ZmZlclNpemUpKQogICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoImRvaW5nIERWRF9TZW5kS2V5XG4iKTsKICAgICAgICAgICAgc3RhdHVzID0gRFZEX1NlbmRLZXkoZmQsIChQRFZEX0NPUFlfUFJPVEVDVF9LRVkpbHBJbkJ1ZmZlcik7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9EVkRfUkVBRF9LRVk6CiAgICAgICAgaWYgKCFscEluQnVmZmVyIHx8CiAgICAgICAgICAgICgoKFBEVkRfQ09QWV9QUk9URUNUX0tFWSlscEluQnVmZmVyKS0+S2V5TGVuZ3RoICE9IG5JbkJ1ZmZlclNpemUpKQogICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobHBJbkJ1ZmZlciAhPWxwT3V0QnVmZmVyKSBzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgiZG9pbmcgRFZEX1JFQURfS0VZXG4iKTsKICAgICAgICAgICAgc3ogPSAoKFBEVkRfQ09QWV9QUk9URUNUX0tFWSlscEluQnVmZmVyKS0+S2V5TGVuZ3RoOwogICAgICAgICAgICBzdGF0dXMgPSBEVkRfUmVhZEtleShmZCwgKFBEVkRfQ09QWV9QUk9URUNUX0tFWSlscEluQnVmZmVyKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElPQ1RMX0RWRF9HRVRfUkVHSU9OOgogICAgICAgIHN6ID0gc2l6ZW9mKERWRF9SRUdJT04pOwogICAgICAgIGlmIChscEluQnVmZmVyICE9IE5VTEwgfHwgbkluQnVmZmVyU2l6ZSAhPSAwKSBzdGF0dXMgPSBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgICAgZWxzZSBpZiAobk91dEJ1ZmZlclNpemUgPCBzeikgc3RhdHVzID0gU1RBVFVTX0JVRkZFUl9UT09fU01BTEw7CiAgICAgICAgVFJBQ0UoImRvaW5nIERWRF9HZXRfUkVHSU9OXG4iKTsKICAgICAgICBzdGF0dXMgPSBEVkRfR2V0UmVnaW9uKGZkLCAoUERWRF9SRUdJT04pbHBPdXRCdWZmZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJT0NUTF9EVkRfUkVBRF9TVFJVQ1RVUkU6CiAgICAgICAgc3ogPSBzaXplb2YoRFZEX0xBWUVSX0RFU0NSSVBUT1IpOwogICAgICAgIGlmIChscEluQnVmZmVyID09IE5VTEwgfHwgbkluQnVmZmVyU2l6ZSAhPSBzaXplb2YoRFZEX1JFQURfU1RSVUNUVVJFKSkgc3RhdHVzID0gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgIGVsc2UgaWYgKG5PdXRCdWZmZXJTaXplIDwgc3opIHN0YXR1cyA9IFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwogICAgICAgIFRSQUNFKCJkb2luZyBEVkRfUkVBRF9TVFJVQ1RVUkVcbiIpOwogICAgICAgIHN0YXR1cyA9IERWRF9SZWFkU3RydWN0dXJlKGZkLCAoUERWRF9SRUFEX1NUUlVDVFVSRSlscEluQnVmZmVyLCAoUERWRF9MQVlFUl9ERVNDUklQVE9SKWxwT3V0QnVmZmVyKTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCJVbnN1cHBvcnRlZCBJT0NUTCAlbHggKHR5cGU9JWx4IGFjY2Vzcz0lbHggZnVuYz0lbHggbWV0aD0lbHgpXG4iLCAKICAgICAgICAgICAgICBkd0lvQ29udHJvbENvZGUsIGR3SW9Db250cm9sQ29kZSA+PiAxNiwgKGR3SW9Db250cm9sQ29kZSA+PiAxNCkgJiAzLAogICAgICAgICAgICAgIChkd0lvQ29udHJvbENvZGUgPj4gMikgJiAweEZGRiwgZHdJb0NvbnRyb2xDb2RlICYgMyk7CiAgICAgICAgc3ogPSAwOwogICAgICAgIHN0YXR1cyA9IFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKICAgICAgICBicmVhazsKICAgIH0KICAgIHdpbmVfc2VydmVyX3JlbGVhc2VfZmQoIGhEZXZpY2UsIGZkICk7CiBlcnJvcjoKICAgIHBpb3NiLT51LlN0YXR1cyA9IHN0YXR1czsKICAgIHBpb3NiLT5JbmZvcm1hdGlvbiA9IHN6OwogICAgaWYgKGhFdmVudCkgTnRTZXRFdmVudChoRXZlbnQsIE5VTEwpOwogICAgcmV0dXJuIHN0YXR1czsKfQo=