LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgICAgICAgIEFUTUVMIE1pY3JvY29udHJvbGxlciBTb2Z0d2FyZSBTdXBwb3J0IAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24KICoKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93LgogKgogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFx1bml0Ci8vLwovLy8gIVB1cnBvc2UKLy8vIAovLy8gQ0NJRCBkcml2ZXIKLy8vIAovLy8gIVVzYWdlCi8vLyAKLy8vIEV4cGxhbmF0aW9uIG9uIHRoZSB1c2FnZSBvZiB0aGUgY29kZSBtYWRlIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBoZWFkZXIgZmlsZS4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgIEhlYWRlcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpbmNsdWRlICJib2FyZC5oIgojaW5jbHVkZSA8VVNCRERyaXZlci5oPgojaW5jbHVkZSA8VVNCUmVxdWVzdHMuaD4KI2luY2x1ZGUgPFVTQkRlc2NyaXB0b3JzLmg+Ci8vI2luY2x1ZGUgPHVzYi9kZXZpY2UvZGZ1L2RmdS5oPgojaW5jbHVkZSA8Y2NpZGRyaXZlcmRlc2NyaXB0b3JzLmg+CgovLyBGSVhNRTogUmVtb3ZlIERGVSByZWxhdGVkIHN0dWZmIAovKiBubyBERlUgYm9vdGxvYWRlciBpcyBiZWluZyB1c2VkICovCiNkZWZpbmUgREZVX05VTV9JRiAgICAgIDAKI2RlZmluZSBERlVfSUZfREVTQ1JJUFRPUlNfU1RSVUNUCiNkZWZpbmUgREZVX0lGX0RFU0NSSVBUT1JTCgojZGVmaW5lIERGVV9OVU1fU1RSSU5HUyAwCiNkZWZpbmUgREZVX1NUUklOR19ERVNDUklQVE9SUwoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgTG9jYWwgZGVmaW5pdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8vIENvbnN0YW50czogSURzOiBEZXZpY2UgcHJvZHVjdCBJRC4KLy8jZGVmaW5lIENDSUREcml2ZXJEZXNjcmlwdG9yc19QUk9EVUNUSUQgICAgICAgMHg2MTI5CiNkZWZpbmUgQ0NJRERyaXZlckRlc2NyaXB0b3JzX1BST0RVQ1RJRCAgICAgICBTSU1UUkFDRV9QUk9EVUNUX0lECi8vLyBDb25zdGFudHM6IElEczogRGV2aWNlIHZlbmRvciBJRC4KI2RlZmluZSBDQ0lERHJpdmVyRGVzY3JpcHRvcnNfVkVORE9SSUQgICAgICAgIEFUTUVMX1ZFTkRPUl9JRAovLyNkZWZpbmUgQ0NJRERyaXZlckRlc2NyaXB0b3JzX1ZFTkRPUklEICAgICAgICAweDAzRUIKLy8vIENvbnN0YW50czogSURzOiBEZXZpY2UgcmVsZWFzZSBudW1iZXIuCiNkZWZpbmUgQ0NJRERyaXZlckRlc2NyaXB0b3JzX1JFTEVBU0UgICAgICAgICAweDAxMDAKCi8vLyBSZXR1cm5zIHRoZSBtaW5pbXVtIGJldHdlZW4gdHdvIHZhbHVlcy4KI2RlZmluZSBNSU4oYSwgYikgICAgICAgKChhIDwgYikgPyBhIDogYikKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgVHlwZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBEcml2ZXIgc3RydWN0dXJlIGZvciBhbiBDQ0lEIGRldmljZQp0eXBlZGVmIHN0cnVjdCB7CgogICAgLy8vIFN0YW5kYXJkIFVTQiBkZXZpY2UgZHJpdmVyIGluc3RhbmNlCiAgICBVU0JERHJpdmVyICAgICAgICAgICAgIHVzYmREcml2ZXI7CiAgICAvLy8gQ0NJRCBtZXNzYWdlCiAgICBTX2NjaWRfYnVsa19pbl9oZWFkZXIgIHNDY2lkTWVzc2FnZTsKICAgIC8vLyBDQ0lEIGNvbW1hbmQKICAgIFNfY2NpZF9idWxrX291dF9oZWFkZXIgc0NjaWRDb21tYW5kOwogICAgLy8vIEludGVycnVwdCBtZXNzYWdlIGFuc3dlcgogICAgdW5zaWduZWQgY2hhciAgICAgICAgICBCdWZmZXJJTlRbNF07CiAgICAvLy8gQnVmZmVyIGRhdGEgb2YgbWVzc2FnZQogICAgdW5zaWduZWQgY2hhciAgICAgICAgICBQcm90b2NvbERhdGFTdHJ1Y3R1cmVbMTBdOwogICAgLy8vIFByb3RvY29sIHVzZWQKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgYlByb3RvY29sOwogICAgLy8vIFNsb3RTdGF0dXMKICAgIC8vLyBCaXQgMCA9IFNsb3QgMCBjdXJyZW50IHN0YXRlCiAgICAvLy8gQml0IDEgPSBTbG90IDAgY2hhbmdlZCBzdGF0dXMKICAgIC8vLyBCaXQgMiA9IFNsb3QgMSBjdXJyZW50IHN0YXRlCiAgICAvLy8gQml0IDMgPSBTbG90IDEgY2hhbmdlZCBzdGF0dXMKICAgIC8vLyBCaXQgNCA9IFNsb3QgMiBjdXJyZW50IHN0YXRlCiAgICAvLy8gQml0IDUgPSBTbG90IDIgY2hhbmdlZCBzdGF0dXMKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgU2xvdFN0YXR1czsKCn0gQ0NJRERyaXZlcjsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgTG9jYWwgdmFyaWFibGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy8gU3RhdGljIGluc3RhbmNlIG9mIHRoZSBDQ0lEIGRldmljZSBkcml2ZXIuCnN0YXRpYyBDQ0lERHJpdmVyIGNjaWREcml2ZXI7CnN0YXRpYyBDQ0lERHJpdmVyQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JzICpjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUzsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgSW50ZXJuYWwgZnVuY3Rpb25zCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gSW5pdGlhbGl6ZXMgdGhlIENDSUQgZGV2aWNlIGRyaXZlci4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBDQ0lERHJpdmVyX0luaXRpYWxpemUoIHZvaWQgKQp7CiAgICBjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUyA9IGdldENvbmZpZ0Rlc2MoQ0ZHX05VTV9DQ0lEKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlc3BvbnNlIFBpcGUsIEJ1bGstSU4gTWVzc2FnZXMKLy8vIFJldHVybiB0aGUgU2xvdCBTdGF0dXMgdG8gdGhlIGhvc3QKLy8vIEFuc3dlciB0bzoKLy8vICAgUENfdG9fUkRSX0ljY1Bvd2VyT2ZmCi8vLyAgIFBDX3RvX1JEUl9HZXRTbG90U3RhdHVzCi8vLyAgIFBDX3RvX1JEUl9JY2NDbG9jawovLy8gICBQQ190b19SRFJfVDBBUERVCi8vLyAgIFBDX3RvX1JEUl9NZWNoYW5pY2FsCi8vLyAgIFBDX3RvX1JEUl9BYm9ydCBhbmQgQ2xhc3Mgc3BlY2lmaWMgQUJPUlQgcmVxdWVzdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDU2xvdFN0YXR1cyggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX1NMT1RTVEFUVVM7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgPSAwOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyAgID0gY2NpZERyaXZlci5TbG90U3RhdHVzOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yICAgID0gMDsKICAgIC8vIDAwaCBDbG9jayBydW5uaW5nCiAgICAvLyAwMWggQ2xvY2sgc3RvcHBlZCBpbiBzdGF0ZSBMCiAgICAvLyAwMmggQ2xvY2sgc3RvcHBlZCBpbiBzdGF0ZSBICiAgICAvLyAwM2ggQ2xvY2sgc3RvcHBlZCBpbiBhbiB1bmtub3duIHN0YXRlCiAgICAvLyBBbGwgb3RoZXIgdmFsdWVzIGFyZSBSZXNlcnZlZCBmb3IgRnV0dXJlIFVzZS4KICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IDA7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZXNwb25zZSBQaXBlLCBCdWxrLUlOIE1lc3NhZ2VzCi8vLyBBbnN3ZXIgdG8gUENfdG9fUkRSX0ljY1Bvd2VyT24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUkRSdG9QQ0RhdGFibG9ja19BVFIoIHZvaWQgKQp7CiAgICB1bnNpZ25lZCBjaGFyIGk7CiAgICB1bnNpZ25lZCBjaGFyIEF0cltBVFJfU0laRV9NQVhdOwogICAgdW5zaWduZWQgY2hhciBsZW5ndGg7CiAgICB1aW50MzJfdCBzdGF0dXM7IAoKICAgIFRSQUNFX0RFQlVHKCIuIik7CgovLyAgICBzdGF0dXMgPSBJU083ODE2X0RhdGFibG9ja19BVFIoIEF0ciwgJmxlbmd0aCApOwovLyAgICBJU083ODE2X0RlY29kZV9BVFIoIEF0ciApOwoKICAgIGlmIChzdGF0dXMgPT0gMCkgewogICAgICAgIFRSQUNFX0RFQlVHKCJUaW1lb3V0IG9jY3VyZWQgd2hpbGUgcmVhZGluZyBBVFIiKTsKLy8gRklYTUU6IHJlYWN0IHByb3Blcmx5IHRvIHRpbWVvdXQuLgovLyAgICAgICAgcmV0dXJuOwogICAgfQoKLy8gRklYTUU6IE1vcmUgdGVzdHM/IElzIGJQcm90b2NvbCA9IEF0clszXSA/CiAgICBpZiggbGVuZ3RoID4gNSApIHsKICAgICAgICBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsxXSA9IEF0clszXSYweDBGOyAvLyBURCgxKQogICAgICAgIGNjaWREcml2ZXIuYlByb3RvY29sID0gQXRyWzNdJjB4MEY7ICAgICAgICAgICAvLyBURCgxKQogICAgICAgIFRSQUNFX0lORk8oIlByb3RvY29sIGRhdGEgc3RydWN0dXJlOiAweCV4LCBiUHJvdG9jb2w6IDB4JXhcblxyIiwKICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0sIGNjaWREcml2ZXIuYlByb3RvY29sKTsKICAgIH0KCiAgICAvLyBTX2NjaWRfcHJvdG9jb2xfdDAKICAgIC8vIGJtRmluZGV4RGluZGV4CiAgICBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVswXSA9IEF0clsyXTsgICAgIC8vIFRBKDEpCgogICAgLy8gYm1UQ0NLU1QwCiAgICAvLyBGb3IgVD0wICxCMCCWIDBiLCBCNy0yIJYgMDAwMDAwYgogICAgLy8gQjEgliBDb252ZW50aW9uIHVzZWQgKGIxPTAgZm9yIGRpcmVjdCwgYjE9MSBmb3IgaW52ZXJzZSkKCiAgICAvLyBiR3VhcmRUaW1lVDAKICAgIC8vIEV4dHJhIEd1YXJkdGltZSBiZXR3ZWVuIHR3byBjaGFyYWN0ZXJzLiBBZGQgMCB0byAyNTQgZXR1IHRvIHRoZSBub3JtYWwgCiAgICAvLyBndWFyZHRpbWUgb2YgMTJldHUuIEZGaCBpcyB0aGUgc2FtZSBhcyAwMGguCiAgICBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsyXSA9IEF0cls0XTsgICAgIC8vIFRDKDEpCiAgICAvLyBBVDkxQ19CQVNFX1VTMC0+VVNfVFRHUiA9IDA7ICAvLyBUQzEKCiAgICAvLyBiV2FpdGluZ0ludGVnZXJUMAogICAgLy8gV0kgZm9yIFQ9MCB1c2VkIHRvIGRlZmluZSBXV1QKICAgIGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzNdID0gQXRyWzddOyAgICAgLy8gVEMoMikKCiAgICAvLyBiQ2xvY2tTdG9wCiAgICAvLyBJQ0MgQ2xvY2sgU3RvcCBTdXBwb3J0CiAgICAvLyAwMCA9IFN0b3BwaW5nIHRoZSBDbG9jayBpcyBub3QgYWxsb3dlZAogICAgLy8gMDEgPSBTdG9wIHdpdGggQ2xvY2sgc2lnbmFsIExvdwogICAgLy8gMDIgPSBTdG9wIHdpdGggQ2xvY2sgc2lnbmFsIEhpZ2gKICAgIC8vIDAzID0gU3RvcCB3aXRoIENsb2NrIGVpdGhlciBIaWdoIG9yIExvdwogICAgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbNF0gPSAweDAwOyAgICAgICAvLyAwIHRvIDMKCiAgICAvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfREFUQUJMT0NLOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgICAgID0gbGVuZ3RoOyAgLy8gU2l6ZSBvZiBBVFIKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTaXplVG9TZW5kICs9IGxlbmd0aDsgIC8vIFNpemUgb2YgQVRSCiAgICAvLyBiQ2hhaW5QYXJhbWV0ZXI6IDAwIHRoZSByZXNwb25zZSBBUERVIGJlZ2lucyBhbmQgZW5kcyBpbiB0aGlzIGNvbW1hbmQKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyAgICA9IDA7CgogICAgZm9yKCBpPTA7IGk8bGVuZ3RoOyBpKysgKSB7CgogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVtpXSAgPSBBdHJbaV07CiAgICB9CgogICAgLy8gU2V0IHRoZSBzbG90IHRvIGFuIGFjdGl2ZSBzdGF0dXMKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yID0gMDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlc3BvbnNlIFBpcGUsIEJ1bGstSU4gTWVzc2FnZXMKLy8vIEluIG90aGVyIGNhc2VzLCB0aGUgcmVzcG9uc2UgbWVzc2FnZSBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6IAovLy8gVGhlIHJlc3BvbnNlIGRhdGEgd2lsbCBjb250YWluIHRoZSBvcHRpb25hbCBkYXRhIHJldHVybmVkIGJ5IHRoZSBJQ0MsIAovLy8gZm9sbG93ZWQgYnkgdGhlIDIgYnl0ZS1zaXplIHN0YXR1cyB3b3JkcyBTVzEtU1cyLgovLy8KLy8vIEFuc3dlciB0bzoKLy8vICAgUENfdG9fUkRSX1hmckJsb2NrCi8vLyAgIFBDX3RvX1JEUl9TZWN1cmUKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUkRSdG9QQ0RhdGFibG9jayggdm9pZCApCnsKICAgIC8vVFJBQ0VfREVCVUcoIi4iKTsKCiAgICAvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfREFUQUJMT0NLOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNpemVUb1NlbmQgKz0gY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aDsKICAgIC8vIGJDaGFpblBhcmFtZXRlcjogMDAgdGhlIHJlc3BvbnNlIEFQRFUgYmVnaW5zIGFuZCBlbmRzIGluIHRoaXMgY29tbWFuZAogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljID0gMDsKCiAgICAvLyBTZXQgdGhlIHNsb3QgdG8gYW4gYWN0aXZlIHN0YXR1cwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgPSAwOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gUmVzcG9uc2UgUGlwZSwgQnVsay1JTiBNZXNzYWdlcwovLy8gQW5zd2VyIHRvOgovLy8gICBQQ190b19SRFJfR2V0UGFyYW1ldGVycwovLy8gICBQQ190b19SRFJfUmVzZXRQYXJhbWV0ZXJzCi8vLyAgIFBDX3RvX1JEUl9TZXRQYXJhbWV0ZXJzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFJEUnRvUENQYXJhbWV0ZXJzKCB2b2lkICkKewogICAgdW5zaWduZWQgaW50IGk7CgogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICAvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfUEFSQU1FVEVSUzsKCiAgICAvL2NjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yICA9IDA7CgogICAgaWYoIGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzFdID09IFBST1RPQ09MX1RPICkgewoKICAgICAgICAvLyBUPTAKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgPSBzaXplb2YoU19jY2lkX3Byb3RvY29sX3QwKTsKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSBQUk9UT0NPTF9UTzsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAvLyBUPTEKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgPSBzaXplb2YoU19jY2lkX3Byb3RvY29sX3QxKTsKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSBQUk9UT0NPTF9UMTsKICAgIH0KCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCArPSBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoOwoKICAgIGZvciggaT0wOyBpPGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGg7IGkrKyApIHsKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbaV0gPSBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVtpXTsKICAgIH0KCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZXNwb25zZSBQaXBlLCBCdWxrLUlOIE1lc3NhZ2VzCi8vLyBBbnN3ZXIgdG86Ci8vLyAgIFBDX3RvX1JEUl9Fc2NhcGUKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUkRSdG9QQ0VzY2FwZSggdW5zaWduZWQgY2hhciBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKmRhdGFfc2VuZF9mcm9tX0NDSUQgKQp7CiAgICB1bnNpZ25lZCBpbnQgaTsKCiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIC8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19FU0NBUEU7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gbGVuZ3RoOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yICA9IDA7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljID0gMDsgIC8vIGJSRlUKCiAgICBmb3IoIGk9MDsgaTxsZW5ndGg7IGkrKyApIHsKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbaV0gPSBkYXRhX3NlbmRfZnJvbV9DQ0lEW2ldOwogICAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gUmVzcG9uc2UgUGlwZSwgQnVsay1JTiBNZXNzYWdlcwovLy8gQW5zd2VyIHRvOiAKLy8vICAgUENfdG9fUkRSX1NldERhdGFSYXRlQW5kQ2xvY2tGcmVxdWVuY3kKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUkRSdG9QQ0RhdGFSYXRlQW5kQ2xvY2tGcmVxdWVuY3koIHVuc2lnbmVkIGludCBkd0Nsb2NrRnJlcXVlbmN5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGR3RGF0YVJhdGUgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIC8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19EQVRBUkFURUFORENMT0NLRlJFUVVFTkNZOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICA9IDg7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgID0gMDsKCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSAwOyAgLy8gYlJGVQoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVswXSA9IGR3Q2xvY2tGcmVxdWVuY3k7CiAgICAKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVs0XSA9IGR3RGF0YVJhdGU7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBQb3dlciBPbiBDb21tYW5kIC0gQ29sZCBSZXNldCAmIFdhcm0gUmVzZXQgCi8vLyBSZXR1cm4gdGhlIEFUUiB0byB0aGUgaG9zdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSSWNjUG93ZXJPbiggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CiAgICBpZiggQ0NJRF9GRUFUVVJFU19BVVRPX1ZPTFQgPT0gKGNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMgJiBDQ0lEX0ZFQVRVUkVTX0FVVE9fVk9MVCkgKSB7CgogICAgICAgIC8vYlBvd2VyU2VsZWN0ID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzA7CiAgICAgICAgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzAgPSBWT0xUU19BVVRPOwogICAgfQoKICAgIElTTzc4MTZfd2FybV9yZXNldCgpOwovLyAgICBJU083ODE2X2NvbGRfcmVzZXQoKTsKCiAgICAvLyBmb3IgZW11bGF0aW9uIG9ubHkgLy9KQ0IgCiAgICBpZiAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wICE9IFZPTFRTXzVfMCApIHsKCiAgICAgICAgVFJBQ0VfRVJST1IoIlBPV0VSX05PVF9TVVBQT1JURURcblxyIik7CiAgICB9CgogICAgZWxzZSB7CgogICAgICAgIFJEUnRvUENEYXRhYmxvY2tfQVRSKCk7CgogICAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gUG93ZXIgT2ZmIENvbW1hbmQgLSBTZXQgdGhlIElDQyBpbiBhbiBpbmFjdGl2ZSBzdGF0ZQovLy8gUmV0dXJuIHRoZSBzbG90IHN0YXR1cyB0byB0aGUgaG9zdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSSWNjUG93ZXJPZmYoIHZvaWQgKQp7CiAgICB1bnNpZ25lZCBjaGFyIGJTdGF0dXM7CgogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBJU083ODE2X0ljY1Bvd2VyT2ZmKCk7CgogICAgLy9KQ0Igc3R1YgogICAgYlN0YXR1cyA9IElDQ19CU19QUkVTRU5UX05PVEFDVElWQVRFRDsKCiAgICAvLyBTZXQgdGhlIHNsb3QgdG8gYW4gaW5hY3RpdmUgc3RhdHVzCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciA9IDA7CgogICAgLy8gaWYgZXJyb3IsIHNlZSBUYWJsZSA2LjEtMiBlcnJvcnMKCiAgICAvLyBSZXR1cm4gdGhlIHNsb3Qgc3RhdHVzIHRvIHRoZSBob3N0CiAgICBSRFJ0b1BDU2xvdFN0YXR1cygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gR2V0IHNsb3Qgc3RhdHVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJHZXRTbG90U3RhdHVzKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciA9IDA7CgogICAgLy8gUmV0dXJuIHRoZSBzbG90IHN0YXR1cyB0byB0aGUgaG9zdAogICAgUkRSdG9QQ1Nsb3RTdGF0dXMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIElmIHRoZSBjb21tYW5kIGhlYWRlciBpcyB2YWxpZCwgYW4gQVBEVSBjb21tYW5kIGlzIHJlY2VpdmVkIGFuZCBjYW4gYmUgcmVhZAovLy8gYnkgdGhlIGFwcGxpY2F0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJYZnJCbG9jayggdm9pZCApCnsKICAgIHVuc2lnbmVkIGNoYXIgaW5kZXhNZXNzYWdlID0gMDsKCiAgICAvL1RSQUNFX0RFQlVHKCIuIik7CgogICAgLy8gQ2hlY2sgdGhlIGJsb2NrIGxlbmd0aAogICAgaWYgKCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC53TGVuZ3RoID4gKGNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3TWF4Q0NJRE1lc3NhZ2VMZW5ndGgtMTApICkgewoKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMTsKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgID0gMDsKICAgIH0KICAgIC8vIGNoZWNrIGJCV0kKICAgIGVsc2UgaWYgKCAwICE9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wICkgewoKICAgICAgICAgVFJBQ0VfRVJST1IoIkJhZCBiQldJXG5cciIpOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIC8vIEFQRFUgb3IgVFBEVQogICAgICAgIHN3aXRjaChjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUy0+Y2NpZC5kd0ZlYXR1cmVzIAogICAgICAgICAgICAgICYgKENDSURfRkVBVFVSRVNfRVhDX1RQRFV8Q0NJRF9GRUFUVVJFU19FWENfU0FQRFV8Q0NJRF9GRUFUVVJFU19FWENfQVBEVSkpIHsKCiAgICAgICAgICAgIGNhc2UgQ0NJRF9GRUFUVVJFU19FWENfVFBEVToKICAgICAgICAgICAgICAgIGlmIChjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsxXSA9PSBQUk9UT0NPTF9UTykgewogICAgICAgICAgICAgICAgICAgIFRSQUNFX0lORk8oIkFQRFUgY21kOiAleCAleCAleCAuLiIsIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMF0sIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMV0sY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVsyXSApOwoKICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGNvbW1hbmRlIEFQRFUKICAgICAgICAgICAgICAgICAgICBpbmRleE1lc3NhZ2UgPSBJU083ODE2X1hmckJsb2NrVFBEVV9UMCggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVSAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQud0xlbmd0aCApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzFdID09IFBST1RPQ09MX1QxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0lORk8oIk5vdCBzdXBwb3J0ZWQgVD0xXG5cciIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfSU5GTygiTm90IHN1cHBvcnRlZCAweCV4XG5cciIsIGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzFdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgQ0NJRF9GRUFUVVJFU19FWENfQVBEVToKICAgICAgICAgICAgICAgIFRSQUNFX0lORk8oIk5vdCBzdXBwb3J0ZWQgQ0NJRF9GRUFUVVJFU19FWENfQVBEVVxuXHIiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICB9CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCA9IGluZGV4TWVzc2FnZTsKICAgIFRSQUNFX0RFQlVHKCJVU0I6IDB4JVgsIDB4JVgsIDB4JVgsIDB4JVgsIDB4JVhcblxyIiwgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzBdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVsyXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVs0XSApOwogICAgIFJEUnRvUENEYXRhYmxvY2soKTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyByZXR1cm4gcGFyYW1ldGVycyBieSB0aGUgY29tbWFuZDogUkRSX3RvX1BDX1BhcmFtZXRlcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUkdldFBhcmFtZXRlcnMoIHZvaWQgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIC8vIFdlIHN1cHBvcnQgb25seSBvbmUgc2xvdAoKICAgIC8vIGJtSWNjU3RhdHVzCiAgICBpZiggSVNPNzgxNl9TdGF0dXNSZXNldCgpICkgewogICAgICAgIC8vIDA6IEFuIElDQyBpcyBwcmVzZW50IGFuZCBhY3RpdmUgKHBvd2VyIGlzIG9uIGFuZCBzdGFibGUsIFJTVCBpcyBpbmFjdGl2ZQogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gMTogQW4gSUNDIGlzIHByZXNlbnQgYW5kIGluYWN0aXZlIChub3QgYWN0aXZhdGVkIG9yIHNodXQgZG93biBieSBoYXJkd2FyZSBlcnJvcikKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMTsKICAgIH0KCiAgICBSRFJ0b1BDUGFyYW1ldGVycygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIHJlc2V0cyB0aGUgc2xvdCBwYXJhbWV0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJSZXNldFBhcmFtZXRlcnMoIHZvaWQgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIGNjaWREcml2ZXIuU2xvdFN0YXR1cyA9IElDQ19OT1RfUFJFU0VOVDsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSBjY2lkRHJpdmVyLlNsb3RTdGF0dXM7CgogICAgUkRSdG9QQ1BhcmFtZXRlcnMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgcGFyYW1ldGVycyBmb3IgYSBnaXZlbiBzbG90LgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSU2V0UGFyYW1ldGVycyggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgY2NpZERyaXZlci5TbG90U3RhdHVzID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNsb3Q7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gY2NpZERyaXZlci5TbG90U3RhdHVzOwogICAgLy8gTm90IGFsbCBmZWF0dXJlIHN1cHBvcnRlZAoKICAgIFJEUnRvUENQYXJhbWV0ZXJzKCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGNvbW1hbmQgYWxsb3dzIHRoZSBDQ0lEIG1hbnVmYWN0dXJlciB0byBkZWZpbmUgYW5kIGFjY2VzcyBleHRlbmRlZCAKLy8vIGZlYXR1cmVzLiAKLy8vIEluZm9ybWF0aW9uIHNlbnQgdmlhIHRoaXMgY29tbWFuZCBpcyBwcm9jZXNzZWQgYnkgdGhlIENDSUQgY29udHJvbCBsb2dpYy4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUkVzY2FwZSggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgLy8gSWYgbmVlZGVkIGJ5IHRoZSB1c2VyCiAgICBJU083ODE2X0VzY2FwZSgpOwoKICAgIC8vIHN0dWIsIHJldHVybiBhbGwgdmFsdWUgc2VuZAogICAgUkRSdG9QQ0VzY2FwZSggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQud0xlbmd0aCwgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVSk7ICAgIAp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIHN0b3BzIG9yIHJlc3RhcnRzIHRoZSBjbG9jay4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUklDQ0Nsb2NrKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBpZiggMCA9PSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCApIHsKICAgICAgICAvLyByZXN0YXJ0cyB0aGUgY2xvY2sKICAgICAgICBJU083ODE2X1Jlc3RhcnRDbG9jaygpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gc3RvcCBjbG9jayBpbiB0aGUgc3RhdGUgc2hvd24gaW4gdGhlIGJDbG9ja1N0b3AgZmllbGQKICAgICAgICBJU083ODE2X1N0b3BDbG9jaygpOwogICAgfQoKICAgIFJEUnRvUENTbG90U3RhdHVzKCApOyAgICAKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBjaGFuZ2VzIHRoZSBwYXJhbWV0ZXJzIHVzZWQgdG8gcGVyZm9ybSB0aGUgdHJhbnNwb3J0YXRpb24gb2YgCi8vLyBBUERVIG1lc3NhZ2VzIGJ5IHRoZSBUPTAgcHJvdG9jb2wuIAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSdG9BUERVKCB2b2lkICkKewogICAgdW5zaWduZWQgY2hhciBibUNoYW5nZXM7CiAgICB1bnNpZ25lZCBjaGFyIGJDbGFzc0dldFJlc3BvbnNlOwogICAgdW5zaWduZWQgY2hhciBiQ2xhc3NFbnZlbG9wZTsKCiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIGlmKCBjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUy0+Y2NpZC5kd0ZlYXR1cmVzID09IChDQ0lEX0ZFQVRVUkVTX0VYQ19TQVBEVXxDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVKSApIHsKCiAgICAgICAgYm1DaGFuZ2VzID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzA7CiAgICAgICAgYkNsYXNzR2V0UmVzcG9uc2UgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMTsKICAgICAgICBiQ2xhc3NFbnZlbG9wZSA9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18yOwoKICAgICAgICBJU083ODE2X3RvQVBEVSgpOwogICAgfQoKICAgIFJEUnRvUENTbG90U3RhdHVzKCk7ICAgIAp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBpcyBhIGNvbW1hbmQgbWVzc2FnZSB0byBhbGxvdyBlbnRlcmluZyB0aGUgUElOIGZvciB2ZXJpZmljYXRpb24gb3IKLy8vIG1vZGlmaWNhdGlvbi4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUlNlY3VyZSggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgVFJBQ0VfREVCVUcoIkZvciB1c2VyXG5cciIpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gbWFuYWdlIG1vdG9yaXplZCB0eXBlIENDSUQgZnVuY3Rpb25hbGl0eS4gCi8vLyBUaGUgTG9jayBDYXJkIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaG9sZCB0aGUgSUNDLiAKLy8vIFRoaXMgcHJldmVudHMgYW4gSUNDIGZyb20gYmVpbmcgZWFzaWx5IHJlbW92ZWQgZnJvbSB0aGUgQ0NJRC4gCi8vLyBUaGUgVW5sb2NrIENhcmQgZnVuY3Rpb24gaXMgdXNlZCB0byByZW1vdmUgdGhlIGhvbGQgaW5pdGlhdGVkIGJ5IHRoZSBMb2NrIAovLy8gQ2FyZCBmdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSTWVjaGFuaWNhbCggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CiAgICBUUkFDRV9ERUJVRygiTm90IGltcGxlbWVudGVkXG5cciIpOwoKICAgIFJEUnRvUENTbG90U3RhdHVzKCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGNvbW1hbmQgaXMgdXNlZCB3aXRoIHRoZSBDb250cm9sIHBpcGUgQWJvcnQgcmVxdWVzdCB0byB0ZWxsIHRoZSBDQ0lEIAovLy8gdG8gc3RvcCBhbnkgY3VycmVudCB0cmFuc2ZlciBhdCB0aGUgc3BlY2lmaWVkIHNsb3QgYW5kIHJldHVybiB0byBhIHN0YXRlIAovLy8gd2hlcmUgdGhlIHNsb3QgaXMgcmVhZHkgdG8gYWNjZXB0IGEgbmV3IGNvbW1hbmQgcGlwZSBCdWxrLU9VVCBtZXNzYWdlLgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSQWJvcnQoIHZvaWQgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIFJEUnRvUENTbG90U3RhdHVzKCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBtYW51YWxseSBzZXQgdGhlIGRhdGEgcmF0ZSBhbmQgY2xvY2sgZnJlcXVlbmN5IG9mIAovLy8gYSBzcGVjaWZpYyBzbG90LgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSU2V0RGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeSggdm9pZCApCnsKICAgIHVuc2lnbmVkIGludCBkd0Nsb2NrRnJlcXVlbmN5OwogICAgdW5zaWduZWQgaW50IGR3RGF0YVJhdGU7CgogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBkd0Nsb2NrRnJlcXVlbmN5ID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVswXQogICAgICAgICAgICAgICAgICAgICArIChjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzFdPDw4KQogICAgICAgICAgICAgICAgICAgICArIChjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzJdPDwxNikKICAgICAgICAgICAgICAgICAgICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVszXTw8MjQpOwoKICAgIGR3RGF0YVJhdGUgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzRdCiAgICAgICAgICAgICAgICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbNV08PDgpCiAgICAgICAgICAgICAgICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbNl08PDE2KQogICAgICAgICAgICAgICArIChjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzddPDwyNCk7CgogICAgSVNPNzgxNl9TZXREYXRhUmF0ZWFuZENsb2NrRnJlcXVlbmN5KCBkd0Nsb2NrRnJlcXVlbmN5LCBkd0RhdGFSYXRlICk7CgogICAgUkRSdG9QQ0RhdGFSYXRlQW5kQ2xvY2tGcmVxdWVuY3koIGR3Q2xvY2tGcmVxdWVuY3ksIGR3RGF0YVJhdGUgKTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZXBvcnQgdGhlIENNRF9OT1RfU1VQUE9SVEVEIGVycm9yIHRvIHRoZSBob3N0Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIHZDQ0lEQ29tbWFuZE5vdFN1cHBvcnRlZCggdm9pZCApCnsKICAgIC8vIENvbW1hbmQgbm90IHN1cHBvcnRlZAogICAgLy8gdkNDSURSZXBvcnRFcnJvcihDTURfTk9UX1NVUFBPUlRFRCk7CgogICAgVFJBQ0VfREVCVUcoIkNNRF9OT1RfU1VQUE9SVEVEXG5cciIpOwoKICAgIC8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19TTE9UU1RBVFVTOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgICAgID0gMDsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyAgICA9IDA7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyB8PSBJQ0NfQ1NfRkFJTEVEOwoKICAgIC8vIFNlbmQgdGhlIHJlc3BvbnNlIHRvIHRoZSBob3N0CiAgICAvL3ZDQ0lEU2VuZFJlc3BvbnNlKCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBTZW50IENDSUQgcmVzcG9uc2Ugb24gVVNCCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIHZDQ0lEU2VuZFJlc3BvbnNlKCB2b2lkICkKewogICAgdW5zaWduZWQgY2hhciBiU3RhdHVzOwogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBkbyB7CiAgICAgICAgYlN0YXR1cyA9IFVTQkRfV3JpdGUoIENDSURfRVBUX0RBVEFfSU4sICh2b2lkKikmY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCwgMCwgMCApOwoKICAgICAgICBUUkFDRV9ERUJVRygiYlN0YXR1czogMHgleFxuXHIiLCBiU3RhdHVzKTsKCiAgICB9IHdoaWxlIChiU3RhdHVzICE9IFVTQkRfU1RBVFVTX1NVQ0NFU1MpOwp9CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vICBEZXNjcmlwdGlvbjogQ0NJRCBDb21tYW5kIGRpc3BhdGNoZXIKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgQ0NJRENvbW1hbmREaXNwYXRjaGVyKCB2b2lkICkKewogICAgdW5zaWduZWQgY2hhciBNZXNzYWdlVG9TZW5kID0gMDsKCiAgICBUUkFDRV9ERUJVRygiQ29tbWFuZDogMHglWCAweCV4IDB4JVggMHglWCAweCVYIDB4JVggMHglWFxuXHJcblxyIiwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYk1lc3NhZ2VUeXBlLAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC53TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2xvdCwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNlcSwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzAsCiAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18xLAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMik7CgogICAgLy8gQ2hlY2sgdGhlIHNsb3QgbnVtYmVyCiAgICBpZiAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTbG90ID4gMCApIHsKCiAgICAgICAgVFJBQ0VfRVJST1IoIkJBRF9TTE9UX05VTUJFUlxuXHIiKTsKICAgIH0KCiAgICBUUkFDRV9JTkZPKCJ0eXA9MHglWFxuXHIiLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iTWVzc2FnZVR5cGUpOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTZXEgID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNlcTsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTbG90ID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNsb3Q7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNpemVUb1NlbmQgPSBzaXplb2YoU19jY2lkX2J1bGtfaW5faGVhZGVyKS0oQUJEQVRBX1NJWkUrMSk7CgoKICAgIC8vIENvbW1hbmQgZGlzcGF0Y2hlcgogICAgc3dpdGNoICggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYk1lc3NhZ2VUeXBlICkgewoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9JQ0NQT1dFUk9OOgogICAgICAgICAgICBQQ3RvUkRSSWNjUG93ZXJPbigpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX0lDQ1BPV0VST0ZGOgogICAgICAgICAgICBQQ3RvUkRSSWNjUG93ZXJPZmYoKTsKICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9HRVRTTE9UU1RBVFVTOgogICAgICAgICAgICBQQ3RvUkRSR2V0U2xvdFN0YXR1cygpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX1hGUkJMT0NLOgogICAgICAgICAgICBQQ3RvUkRSWGZyQmxvY2soKTsKICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9HRVRQQVJBTUVURVJTOgogICAgICAgICAgICBQQ3RvUkRSR2V0UGFyYW1ldGVycygpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX1JFU0VUUEFSQU1FVEVSUzoKICAgICAgICAgICAgUEN0b1JEUlJlc2V0UGFyYW1ldGVycygpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX1NFVFBBUkFNRVRFUlM6CiAgICAgICAgICAgIFBDdG9SRFJTZXRQYXJhbWV0ZXJzKCk7CiAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ19UT19SRFJfRVNDQVBFOgogICAgICAgICAgICBQQ3RvUkRSRXNjYXBlKCk7CiAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ19UT19SRFJfSUNDQ0xPQ0s6CiAgICAgICAgICAgIFBDdG9SRFJJQ0NDbG9jaygpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX1QwQVBEVToKICAgICAgICAgICAgLy8gT25seSBDQ0lEcyByZXBvcnRpbmcgYSBzaG9ydCBvciBleHRlbmRlZCBBUERVIGxldmVsIGluIHRoZSBkd0ZlYXR1cmVzIAogICAgICAgICAgICAvLyBmaWVsZCBvZiB0aGUgQ0NJRCBjbGFzcyBkZXNjcmlwdG9yIG1heSB0YWtlIHRoaXMgY29tbWFuZCBpbnRvIGFjY291bnQuCiAgICAgICAgICAgIGlmKCAoQ0NJRF9GRUFUVVJFU19FWENfU0FQRFUgPT0gKENDSURfRkVBVFVSRVNfRVhDX1NBUERVJmNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMpKQogICAgICAgICAgICB8fCAoQ0NJRF9GRUFUVVJFU19FWENfQVBEVSAgPT0gKENDSURfRkVBVFVSRVNfRVhDX0FQRFUgJmNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMpKSApIHsKCiAgICAgICAgICAgICAgICAvLyBjb21tYW5kIHN1cHBvcnRlZAogICAgICAgICAgICAgICAgUEN0b1JEUnRvQVBEVSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gY29tbWFuZCBub3Qgc3VwcG9ydGVkCiAgICAgICAgICAgICAgICBUUkFDRV9JTkZPKCJOb3Qgc3VwcG9ydGVkOiBQQ19UT19SRFJfVDBBUERVXG5cciIpOwogICAgICAgICAgICAgICAgdkNDSURDb21tYW5kTm90U3VwcG9ydGVkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9TRUNVUkU6CiAgICAgICAgICAgIFBDdG9SRFJTZWN1cmUoKTsKICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9NRUNIQU5JQ0FMOgogICAgICAgICAgICBQQ3RvUkRSTWVjaGFuaWNhbCgpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX0FCT1JUOgogICAgICAgICAgICBQQ3RvUkRSQWJvcnQoKTsKICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9TRVREQVRBUkFURUFORENMT0NLRlJFUVVFTkNZOgogICAgICAgICAgICBQQ3RvUkRSU2V0RGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeSgpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFRSQUNFX0RFQlVHKCJkZWZhdWx0OiBOb3Qgc3VwcG9ydGVkOiAweCVYXG5cciIsIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJNZXNzYWdlVHlwZSk7CiAgICAgICAgICAgIHZDQ0lEQ29tbWFuZE5vdFN1cHBvcnRlZCgpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgfQoKICAgIGlmKCBNZXNzYWdlVG9TZW5kID09IDEgKSB7CiAgICAgICAgdkNDSURTZW5kUmVzcG9uc2UoKTsKICAgIH0KfQoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBTRVRVUCByZXF1ZXN0IGhhbmRsZXIgZm9yIGEgQ0NJRCBkZXZpY2UKLy8vIFxwYXJhbSBwUmVxdWVzdCBQb2ludGVyIHRvIGEgVVNCR2VuZXJpY1JlcXVlc3QgaW5zdGFuY2UKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgQ0NJRF9SZXF1ZXN0SGFuZGxlcihjb25zdCBVU0JHZW5lcmljUmVxdWVzdCAqcFJlcXVlc3QpCnsKICAgIFRSQUNFX0RFQlVHKCJDQ0lEX1JIbFxuXHIiKTsKCiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2xhc3MgcmVxdWVzdAogICAgaWYgKFVTQkdlbmVyaWNSZXF1ZXN0X0dldFR5cGUocFJlcXVlc3QpID09IFVTQkdlbmVyaWNSZXF1ZXN0X0NMQVNTKSB7CgogICAgICAgIC8vIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIHN1cHBvcnRlZAogICAgICAgIHN3aXRjaCAoVVNCR2VuZXJpY1JlcXVlc3RfR2V0UmVxdWVzdChwUmVxdWVzdCkpIHsKCiAgICAgICAgICAgIGNhc2UgQ0NJREdlbmVyaWNSZXF1ZXN0X0FCT1JUOgogICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoIkNDSURHZW5lcmljUmVxdWVzdF9BQk9SVFxuXHIiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBDQ0lER2VuZXJpY1JlcXVlc3RfR0VUX0NMT0NLX0ZSRVFVRU5DSUVTOgogICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoIk5vdCBzdXBwb3J0ZWQ6IENDSURHZW5lcmljUmVxdWVzdF9HRVRfQ0xPQ0tfRlJFUVVFTkNJRVNcblxyIik7CiAgICAgICAgICAgICAgICAvLyBBIENDSUQgd2l0aCBiTnVtQ2xvY2tTdXBwb3J0ZWQgZXF1YWwgdG8gMDBoIGRvZXMgbm90IGhhdmUgCiAgICAgICAgICAgICAgICAvLyB0byBzdXBwb3J0IHRoaXMgcmVxdWVzdAogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIENDSURHZW5lcmljUmVxdWVzdF9HRVRfREFUQV9SQVRFUzoKICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKCJOb3Qgc3VwcG9ydGVkOiBDQ0lER2VuZXJpY1JlcXVlc3RfR0VUX0RBVEFfUkFURVNcblxyIik7CiAgICAgICAgICAgICAgICAvLyBBIENDSUQgd2l0aCBiTnVtRGF0YVJhdGVzU3VwcG9ydGVkIGVxdWFsIHRvIDAwaCBkb2VzIG5vdCBoYXZlIAogICAgICAgICAgICAgICAgLy8gdG8gc3VwcG9ydCB0aGlzIHJlcXVlc3QuCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBUUkFDRV9XQVJOSU5HKCAiQ0NJRERyaXZlcl9SZXF1ZXN0SGFuZGxlcjogVW5zdXBwb3J0ZWQgcmVxdWVzdCAoJWQpXG5cciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JHZW5lcmljUmVxdWVzdF9HZXRSZXF1ZXN0KHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICBVU0JEX1N0YWxsKDApOwogICAgICAgIH0KICAgIH0KCiAgICBlbHNlIGlmIChVU0JHZW5lcmljUmVxdWVzdF9HZXRUeXBlKHBSZXF1ZXN0KSA9PSBVU0JHZW5lcmljUmVxdWVzdF9TVEFOREFSRCkgewoKICAgICAgICAvLyBGb3J3YXJkIHJlcXVlc3QgdG8gdGhlIHN0YW5kYXJkIGhhbmRsZXIKICAgICAgICBVU0JERHJpdmVyX1JlcXVlc3RIYW5kbGVyKCYoY2NpZERyaXZlci51c2JkRHJpdmVyKSwgcFJlcXVlc3QpOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIC8vIFVuc3VwcG9ydGVkIHJlcXVlc3QgdHlwZQogICAgICAgIFRSQUNFX1dBUk5JTkcoICJDQ0lERHJpdmVyX1JlcXVlc3RIYW5kbGVyOiBVbnN1cHBvcnRlZCByZXF1ZXN0IHR5cGUgKCVkKVxuXHIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCR2VuZXJpY1JlcXVlc3RfR2V0VHlwZShwUmVxdWVzdCkpOwogICAgICAgIFVTQkRfU3RhbGwoMCk7CiAgICB9Cn0KCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgIEV4cG9ydGVkIGZ1bmN0aW9ucwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIE9wdGlvbmFsIGNhbGxiYWNrIHJlLWltcGxlbWVudGF0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNpZiAwCiNpZiAhZGVmaW5lZChOT0FVVE9DQUxMQkFDSykKLy8gbm90IHN0YXRpYyBmdW5jdGlvbgp2b2lkIFVTQkRDYWxsYmFja3NfUmVxdWVzdFJlY2VpdmVkKGNvbnN0IFVTQkdlbmVyaWNSZXF1ZXN0ICpyZXF1ZXN0KQp7CiAgICBDQ0lEX1JlcXVlc3RIYW5kbGVyKHJlcXVlc3QpOwp9CiNlbmRpZgojZW5kaWYKCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gSGFuZGxlcyBTbWFydENhcnQgcmVxdWVzdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIENDSURfU21hcnRDYXJkUmVxdWVzdCggdm9pZCApCnsKICAgIHVuc2lnbmVkIGNoYXIgYlN0YXR1czsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgZG8gewoKICAgICAgICBiU3RhdHVzID0gQ0NJRF9SZWFkKCAodm9pZCopJmNjaWREcml2ZXIuc0NjaWRDb21tYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihTX2NjaWRfYnVsa19vdXRfaGVhZGVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVHJhbnNmZXJDYWxsYmFjaykmQ0NJRENvbW1hbmREaXNwYXRjaGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikwICk7CgovLyAgICAgICAgVFJBQ0VfREVCVUcoImJTdGF0OiAleFxuXHIiLCBiU3RhdHVzKTsKICAgIH0gCiAgICB3aGlsZSAoYlN0YXR1cyAhPSBVU0JEX1NUQVRVU19TVUNDRVNTKTsKfQoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZWFkcyBkYXRhIGZyb20gdGhlIERhdGEgT1VUIGVuZHBvaW50Ci8vLyBccGFyYW0gcEJ1ZmZlciAgIEJ1ZmZlciB0byBzdG9yZSB0aGUgcmVjZWl2ZWQgZGF0YQovLy8gXHBhcmFtIGRMZW5ndGggICBkYXRhIGJ1ZmZlciBsZW5ndGgKLy8vIFxwYXJhbSBmQ2FsbGJhY2sgT3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24KLy8vIFxwYXJhbSBwQXJndW1lbnQgT3B0aW9uYWwgcGFyYW1ldGVyIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KLy8vIFxyZXR1cm4gVVNCRF9TVEFUVVNfTE9DS0VEIG9yIFVTQkRfU1RBVFVTX1NVQ0NFU1MKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdW5zaWduZWQgY2hhciBDQ0lEX1JlYWQodm9pZCAqcEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyQ2FsbGJhY2sgZkNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQXJndW1lbnQpCnsKICAgIHJldHVybiBVU0JEX1JlYWQoQ0NJRF9FUFRfREFUQV9PVVQsIHBCdWZmZXIsIGRMZW5ndGgsIGZDYWxsYmFjaywgcEFyZ3VtZW50KTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFNlbmRzIGRhdGEgdGhyb3VnaCB0aGUgRGF0YSBJTiBlbmRwb2ludAovLy8gXHBhcmFtIHBCdWZmZXIgICBCdWZmZXIgaG9sZGluZyB0aGUgZGF0YSB0byB0cmFuc21pdAovLy8gXHBhcmFtIGRMZW5ndGggICBMZW5ndGggb2YgZGF0YSBidWZmZXIKLy8vIFxwYXJhbSBmQ2FsbGJhY2sgT3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24KLy8vIFxwYXJhbSBwQXJndW1lbnQgT3B0aW9uYWwgcGFyYW1ldGVyIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KLy8vIFxyZXR1cm4gVVNCRF9TVEFUVVNfTE9DS0VEIG9yIFVTQkRfU1RBVFVTX1NVQ0NFU1MKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdW5zaWduZWQgY2hhciBDQ0lEX1dyaXRlKHZvaWQgKnBCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZExlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyQ2FsbGJhY2sgZkNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEFyZ3VtZW50KQp7CiAgICByZXR1cm4gVVNCRF9Xcml0ZShDQ0lEX0VQVF9EQVRBX0lOLCBwQnVmZmVyLCBkTGVuZ3RoLCBmQ2FsbGJhY2ssIHBBcmd1bWVudCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBTZW5kcyBkYXRhIHRocm91Z2ggdGhlIGludGVycnVwdCBlbmRwb2ludCwgSUNDIGluc2VydGlvbiBldmVudAovLy8gUkRSX3RvX1BDX05vdGlmeVNsb3RDaGFuZ2UKLy8vIFxyZXR1cm4gVVNCRF9TVEFUVVNfTE9DS0VEIG9yIFVTQkRfU1RBVFVTX1NVQ0NFU1MKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdW5zaWduZWQgY2hhciBDQ0lEX0luc2VydGlvbiggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgLy8gQnVpbGQgdGhlIEludGVycnVwdC1JTiBtZXNzYWdlCiAgICBjY2lkRHJpdmVyLkJ1ZmZlcklOVFswXSA9IFJEUl9UT19QQ19OT1RJRllTTE9UQ0hBTkdFOwogICAgY2NpZERyaXZlci5CdWZmZXJJTlRbMV0gPSBJQ0NfSU5TRVJURURfRVZFTlQ7CiAgICBjY2lkRHJpdmVyLlNsb3RTdGF0dXMgICA9IElDQ19JTlNFUlRFRF9FVkVOVDsKCiAgICAvLyBOb3RpZnkgdGhlIGhvc3QgdGhhdCBhIElDQyBpcyBpbnNlcnRlZAogICAgcmV0dXJuIFVTQkRfV3JpdGUoIENDSURfRVBUX05PVElGSUNBVElPTiwgY2NpZERyaXZlci5CdWZmZXJJTlQsIDIsIDAsIDAgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFNlbmRzIGRhdGEgdGhyb3VnaCB0aGUgaW50ZXJydXB0IGVuZHBvaW50LCBJQ0MgcmVtb3ZhbCBldmVudAovLy8gUkRSX3RvX1BDX05vdGlmeVNsb3RDaGFuZ2UKLy8vIFxyZXR1cm4gVVNCRF9TVEFUVVNfTE9DS0VEIG9yIFVTQkRfU1RBVFVTX1NVQ0NFU1MKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdW5zaWduZWQgY2hhciBDQ0lEX1JlbW92YWwoIHZvaWQgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIC8vIEJ1aWxkIHRoZSBJbnRlcnJ1cHQtSU4gbWVzc2FnZQogICAgY2NpZERyaXZlci5CdWZmZXJJTlRbMF0gPSBSRFJfVE9fUENfTk9USUZZU0xPVENIQU5HRTsKICAgIGNjaWREcml2ZXIuQnVmZmVySU5UWzFdID0gSUNDX05PVF9QUkVTRU5UOwogICAgY2NpZERyaXZlci5TbG90U3RhdHVzICAgPSBJQ0NfTk9UX1BSRVNFTlQ7CgogICAgLy8gTm90aWZ5IHRoZSBob3N0IHRoYXQgYSBJQ0MgaXMgaW5zZXJ0ZWQKICAgIHJldHVybiBVU0JEX1dyaXRlKCBDQ0lEX0VQVF9OT1RJRklDQVRJT04sIGNjaWREcml2ZXIuQnVmZmVySU5ULCAyLCAwLCAwICk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBJbnRlcnJ1cHQtSU4gTWVzc2FnZXMKLy8vIFRoaXMgbWVzc2FnZSBpcyBzZW50IHdoZW4gYW55IGJpdCBpbiB0aGUgYkhhcmR3YXJlRXJyb3JDb2RlIGZpZWxkIGlzIHNldC4gCi8vLyBJZiB0aGlzIG1lc3NhZ2UgaXMgc2VudCB3aGVuIHRoZXJlIGlzIG5vIJNvdXRzdGFuZGluZ5QgY29tbWFuZCwgdGhlIGJTZXEgCi8vLyBmaWVsZCB3aWxsIGJlIHVuZGVmaW5lZC4KLy8vIFxwYXJhbSBiU2xvdCBJQ0Mgc2xvdCBudW1iZXIKLy8vIFxwYXJhbSBiU2VxICBTZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGJ1bGsgT1VUIGNvbW1hbmQgd2hlbiB0aGUgaGFyZHdhcmUgZXJyb3IKLy8vIG9jY3VyZWQKLy8vIFxwYXJhbSBiSGFyZHdhcmVFcnJvckNvZGUgSGFyZHdhcmUgZXJyb3IgY29kZQovLy8gXHJldHVybiBVU0JEX1NUQVRVU19MT0NLRUQgb3IgVVNCRF9TVEFUVVNfU1VDQ0VTUwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp1bnNpZ25lZCBjaGFyIFJEUnRvUENIYXJkd2FyZUVycm9yKCB1bnNpZ25lZCBjaGFyIGJTbG90LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBiU2VxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBiSGFyZHdhcmVFcnJvckNvZGUgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIC8vIEJ1aWxkIHRoZSBJbnRlcnJ1cHQtSU4gbWVzc2FnZQogICAgY2NpZERyaXZlci5CdWZmZXJJTlRbMF0gPSBSRFJfVE9fUENfSEFSRFdBUkVFUlJPUjsKICAgIGNjaWREcml2ZXIuQnVmZmVySU5UWzFdID0gYlNsb3Q7CiAgICBjY2lkRHJpdmVyLkJ1ZmZlcklOVFsyXSA9IGJTZXE7CiAgICBjY2lkRHJpdmVyLkJ1ZmZlcklOVFszXSA9IGJIYXJkd2FyZUVycm9yQ29kZTsKCiAgICAvLyBOb3RpZnkgdGhlIGhvc3QgdGhhdCBhIElDQyBpcyBpbnNlcnRlZAogICAgcmV0dXJuIFVTQkRfV3JpdGUoIENDSURfRVBUX05PVElGSUNBVElPTiwgY2NpZERyaXZlci5CdWZmZXJJTlQsIDQsIDAsIDAgKTsKfQoKCg==