LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgICAgICAgIEFUTUVMIE1pY3JvY29udHJvbGxlciBTb2Z0d2FyZSBTdXBwb3J0IAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24KICoKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93LgogKgogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFx1bml0Ci8vLwovLy8gIVB1cnBvc2UKLy8vIAovLy8gQ0NJRCBkcml2ZXIKLy8vIAovLy8gIVVzYWdlCi8vLyAKLy8vIEV4cGxhbmF0aW9uIG9uIHRoZSB1c2FnZSBvZiB0aGUgY29kZSBtYWRlIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBoZWFkZXIgZmlsZS4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgIEhlYWRlcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpbmNsdWRlICJib2FyZC5oIgojaW5jbHVkZSA8VVNCRERyaXZlci5oPgojaW5jbHVkZSA8VVNCUmVxdWVzdHMuaD4KI2luY2x1ZGUgPFVTQkRlc2NyaXB0b3JzLmg+Ci8vI2luY2x1ZGUgPHVzYi9kZXZpY2UvZGZ1L2RmdS5oPgojaW5jbHVkZSA8Y2NpZGRyaXZlcmRlc2NyaXB0b3JzLmg+CgovLyBGSVhNRTogUmVtb3ZlIERGVSByZWxhdGVkIHN0dWZmIAovKiBubyBERlUgYm9vdGxvYWRlciBpcyBiZWluZyB1c2VkICovCiNkZWZpbmUgREZVX05VTV9JRiAgICAgIDAKI2RlZmluZSBERlVfSUZfREVTQ1JJUFRPUlNfU1RSVUNUCiNkZWZpbmUgREZVX0lGX0RFU0NSSVBUT1JTCgojZGVmaW5lIERGVV9OVU1fU1RSSU5HUyAwCiNkZWZpbmUgREZVX1NUUklOR19ERVNDUklQVE9SUwoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgTG9jYWwgZGVmaW5pdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8vIENvbnN0YW50czogSURzOiBEZXZpY2UgcHJvZHVjdCBJRC4KLy8jZGVmaW5lIENDSUREcml2ZXJEZXNjcmlwdG9yc19QUk9EVUNUSUQgICAgICAgMHg2MTI5CiNkZWZpbmUgQ0NJRERyaXZlckRlc2NyaXB0b3JzX1BST0RVQ1RJRCAgICAgICBTSU1UUkFDRV9QUk9EVUNUX0lECi8vLyBDb25zdGFudHM6IElEczogRGV2aWNlIHZlbmRvciBJRC4KI2RlZmluZSBDQ0lERHJpdmVyRGVzY3JpcHRvcnNfVkVORE9SSUQgICAgICAgIEFUTUVMX1ZFTkRPUl9JRAovLyNkZWZpbmUgQ0NJRERyaXZlckRlc2NyaXB0b3JzX1ZFTkRPUklEICAgICAgICAweDAzRUIKLy8vIENvbnN0YW50czogSURzOiBEZXZpY2UgcmVsZWFzZSBudW1iZXIuCiNkZWZpbmUgQ0NJRERyaXZlckRlc2NyaXB0b3JzX1JFTEVBU0UgICAgICAgICAweDAxMDAKCi8vLyBSZXR1cm5zIHRoZSBtaW5pbXVtIGJldHdlZW4gdHdvIHZhbHVlcy4KI2RlZmluZSBNSU4oYSwgYikgICAgICAgKChhIDwgYikgPyBhIDogYikKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgVHlwZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBEcml2ZXIgc3RydWN0dXJlIGZvciBhbiBDQ0lEIGRldmljZQp0eXBlZGVmIHN0cnVjdCB7CgogICAgLy8vIFN0YW5kYXJkIFVTQiBkZXZpY2UgZHJpdmVyIGluc3RhbmNlCiAgICBVU0JERHJpdmVyICAgICAgICAgICAgIHVzYmREcml2ZXI7CiAgICAvLy8gQ0NJRCBtZXNzYWdlCiAgICBTX2NjaWRfYnVsa19pbl9oZWFkZXIgIHNDY2lkTWVzc2FnZTsKICAgIC8vLyBDQ0lEIGNvbW1hbmQKICAgIFNfY2NpZF9idWxrX291dF9oZWFkZXIgc0NjaWRDb21tYW5kOwogICAgLy8vIEludGVycnVwdCBtZXNzYWdlIGFuc3dlcgogICAgdW5zaWduZWQgY2hhciAgICAgICAgICBCdWZmZXJJTlRbNF07CiAgICAvLy8gQnVmZmVyIGRhdGEgb2YgbWVzc2FnZQogICAgdW5zaWduZWQgY2hhciAgICAgICAgICBQcm90b2NvbERhdGFTdHJ1Y3R1cmVbMTBdOwogICAgLy8vIFByb3RvY29sIHVzZWQKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgYlByb3RvY29sOwogICAgLy8vIFNsb3RTdGF0dXMKICAgIC8vLyBCaXQgMCA9IFNsb3QgMCBjdXJyZW50IHN0YXRlCiAgICAvLy8gQml0IDEgPSBTbG90IDAgY2hhbmdlZCBzdGF0dXMKICAgIC8vLyBCaXQgMiA9IFNsb3QgMSBjdXJyZW50IHN0YXRlCiAgICAvLy8gQml0IDMgPSBTbG90IDEgY2hhbmdlZCBzdGF0dXMKICAgIC8vLyBCaXQgNCA9IFNsb3QgMiBjdXJyZW50IHN0YXRlCiAgICAvLy8gQml0IDUgPSBTbG90IDIgY2hhbmdlZCBzdGF0dXMKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgU2xvdFN0YXR1czsKCn0gQ0NJRERyaXZlcjsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgICAgTG9jYWwgdmFyaWFibGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy8gU3RhdGljIGluc3RhbmNlIG9mIHRoZSBDQ0lEIGRldmljZSBkcml2ZXIuCnN0YXRpYyBDQ0lERHJpdmVyIGNjaWREcml2ZXI7CnN0YXRpYyBDQ0lERHJpdmVyQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JzICpjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUzsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgSW50ZXJuYWwgZnVuY3Rpb25zCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gSW5pdGlhbGl6ZXMgdGhlIENDSUQgZGV2aWNlIGRyaXZlci4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBDQ0lERHJpdmVyX0luaXRpYWxpemUoIHZvaWQgKQp7CiAgICBjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUyA9IChDQ0lERHJpdmVyQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JzICopIGNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0FycltDRkdfTlVNX0NDSURdOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gUmVzcG9uc2UgUGlwZSwgQnVsay1JTiBNZXNzYWdlcwovLy8gUmV0dXJuIHRoZSBTbG90IFN0YXR1cyB0byB0aGUgaG9zdAovLy8gQW5zd2VyIHRvOgovLy8gICBQQ190b19SRFJfSWNjUG93ZXJPZmYKLy8vICAgUENfdG9fUkRSX0dldFNsb3RTdGF0dXMKLy8vICAgUENfdG9fUkRSX0ljY0Nsb2NrCi8vLyAgIFBDX3RvX1JEUl9UMEFQRFUKLy8vICAgUENfdG9fUkRSX01lY2hhbmljYWwKLy8vICAgUENfdG9fUkRSX0Fib3J0IGFuZCBDbGFzcyBzcGVjaWZpYyBBQk9SVCByZXF1ZXN0Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFJEUnRvUENTbG90U3RhdHVzKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICAvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfU0xPVFNUQVRVUzsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICA9IDA7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzICAgPSBjY2lkRHJpdmVyLlNsb3RTdGF0dXM7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgICAgPSAwOwogICAgLy8gMDBoIENsb2NrIHJ1bm5pbmcKICAgIC8vIDAxaCBDbG9jayBzdG9wcGVkIGluIHN0YXRlIEwKICAgIC8vIDAyaCBDbG9jayBzdG9wcGVkIGluIHN0YXRlIEgKICAgIC8vIDAzaCBDbG9jayBzdG9wcGVkIGluIGFuIHVua25vd24gc3RhdGUKICAgIC8vIEFsbCBvdGhlciB2YWx1ZXMgYXJlIFJlc2VydmVkIGZvciBGdXR1cmUgVXNlLgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljID0gMDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlc3BvbnNlIFBpcGUsIEJ1bGstSU4gTWVzc2FnZXMKLy8vIEFuc3dlciB0byBQQ190b19SRFJfSWNjUG93ZXJPbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDRGF0YWJsb2NrX0FUUiggdm9pZCApCnsKICAgIHVuc2lnbmVkIGNoYXIgaTsKICAgIHVuc2lnbmVkIGNoYXIgQXRyW0FUUl9TSVpFX01BWF07CiAgICB1bnNpZ25lZCBjaGFyIGxlbmd0aDsKICAgIHVpbnQzMl90IHN0YXR1czsgCgogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBzdGF0dXMgPSBJU083ODE2X0RhdGFibG9ja19BVFIoIEF0ciwgJmxlbmd0aCApOwovLyAgICBJU083ODE2X0RlY29kZV9BVFIoIEF0ciApOwoKICAgIGlmIChzdGF0dXMgPT0gMCkgewogICAgICAgIFRSQUNFX0RFQlVHKCJUaW1lb3V0IG9jY3VyZWQgd2hpbGUgcmVhZGluZyBBVFIiKTsKLy8gRklYTUU6IHJlYWN0IHByb3Blcmx5IHRvIHRpbWVvdXQuLgovLyAgICAgICAgcmV0dXJuOwogICAgfQoKLy8gRklYTUU6IE1vcmUgdGVzdHM/IElzIGJQcm90b2NvbCA9IEF0clszXSA/CiAgICBpZiggbGVuZ3RoID4gNSApIHsKICAgICAgICBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsxXSA9IEF0clszXSYweDBGOyAvLyBURCgxKQogICAgICAgIGNjaWREcml2ZXIuYlByb3RvY29sID0gQXRyWzNdJjB4MEY7ICAgICAgICAgICAvLyBURCgxKQogICAgICAgIFRSQUNFX0lORk8oIlByb3RvY29sIGRhdGEgc3RydWN0dXJlOiAweCV4LCBiUHJvdG9jb2w6IDB4JXhcblxyIiwKICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0sIGNjaWREcml2ZXIuYlByb3RvY29sKTsKICAgIH0KCiAgICAvLyBTX2NjaWRfcHJvdG9jb2xfdDAKICAgIC8vIGJtRmluZGV4RGluZGV4CiAgICBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVswXSA9IEF0clsyXTsgICAgIC8vIFRBKDEpCgogICAgLy8gYm1UQ0NLU1QwCiAgICAvLyBGb3IgVD0wICxCMCCWIDBiLCBCNy0yIJYgMDAwMDAwYgogICAgLy8gQjEgliBDb252ZW50aW9uIHVzZWQgKGIxPTAgZm9yIGRpcmVjdCwgYjE9MSBmb3IgaW52ZXJzZSkKCiAgICAvLyBiR3VhcmRUaW1lVDAKICAgIC8vIEV4dHJhIEd1YXJkdGltZSBiZXR3ZWVuIHR3byBjaGFyYWN0ZXJzLiBBZGQgMCB0byAyNTQgZXR1IHRvIHRoZSBub3JtYWwgCiAgICAvLyBndWFyZHRpbWUgb2YgMTJldHUuIEZGaCBpcyB0aGUgc2FtZSBhcyAwMGguCiAgICBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsyXSA9IEF0cls0XTsgICAgIC8vIFRDKDEpCiAgICAvLyBBVDkxQ19CQVNFX1VTMC0+VVNfVFRHUiA9IDA7ICAvLyBUQzEKCiAgICAvLyBiV2FpdGluZ0ludGVnZXJUMAogICAgLy8gV0kgZm9yIFQ9MCB1c2VkIHRvIGRlZmluZSBXV1QKICAgIGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzNdID0gQXRyWzddOyAgICAgLy8gVEMoMikKCiAgICAvLyBiQ2xvY2tTdG9wCiAgICAvLyBJQ0MgQ2xvY2sgU3RvcCBTdXBwb3J0CiAgICAvLyAwMCA9IFN0b3BwaW5nIHRoZSBDbG9jayBpcyBub3QgYWxsb3dlZAogICAgLy8gMDEgPSBTdG9wIHdpdGggQ2xvY2sgc2lnbmFsIExvdwogICAgLy8gMDIgPSBTdG9wIHdpdGggQ2xvY2sgc2lnbmFsIEhpZ2gKICAgIC8vIDAzID0gU3RvcCB3aXRoIENsb2NrIGVpdGhlciBIaWdoIG9yIExvdwogICAgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbNF0gPSAweDAwOyAgICAgICAvLyAwIHRvIDMKCiAgICAvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfREFUQUJMT0NLOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgICAgID0gbGVuZ3RoOyAgLy8gU2l6ZSBvZiBBVFIKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTaXplVG9TZW5kICs9IGxlbmd0aDsgIC8vIFNpemUgb2YgQVRSCiAgICAvLyBiQ2hhaW5QYXJhbWV0ZXI6IDAwIHRoZSByZXNwb25zZSBBUERVIGJlZ2lucyBhbmQgZW5kcyBpbiB0aGlzIGNvbW1hbmQKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyAgICA9IDA7CgogICAgZm9yKCBpPTA7IGk8bGVuZ3RoOyBpKysgKSB7CgogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVtpXSAgPSBBdHJbaV07CiAgICB9CgogICAgLy8gU2V0IHRoZSBzbG90IHRvIGFuIGFjdGl2ZSBzdGF0dXMKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yID0gMDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlc3BvbnNlIFBpcGUsIEJ1bGstSU4gTWVzc2FnZXMKLy8vIEluIG90aGVyIGNhc2VzLCB0aGUgcmVzcG9uc2UgbWVzc2FnZSBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6IAovLy8gVGhlIHJlc3BvbnNlIGRhdGEgd2lsbCBjb250YWluIHRoZSBvcHRpb25hbCBkYXRhIHJldHVybmVkIGJ5IHRoZSBJQ0MsIAovLy8gZm9sbG93ZWQgYnkgdGhlIDIgYnl0ZS1zaXplIHN0YXR1cyB3b3JkcyBTVzEtU1cyLgovLy8KLy8vIEFuc3dlciB0bzoKLy8vICAgUENfdG9fUkRSX1hmckJsb2NrCi8vLyAgIFBDX3RvX1JEUl9TZWN1cmUKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUkRSdG9QQ0RhdGFibG9jayggdm9pZCApCnsKICAgIC8vVFJBQ0VfREVCVUcoIi4iKTsKCiAgICAvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfREFUQUJMT0NLOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNpemVUb1NlbmQgKz0gY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aDsKICAgIC8vIGJDaGFpblBhcmFtZXRlcjogMDAgdGhlIHJlc3BvbnNlIEFQRFUgYmVnaW5zIGFuZCBlbmRzIGluIHRoaXMgY29tbWFuZAogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljID0gMDsKCiAgICAvLyBTZXQgdGhlIHNsb3QgdG8gYW4gYWN0aXZlIHN0YXR1cwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgPSAwOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gUmVzcG9uc2UgUGlwZSwgQnVsay1JTiBNZXNzYWdlcwovLy8gQW5zd2VyIHRvOgovLy8gICBQQ190b19SRFJfR2V0UGFyYW1ldGVycwovLy8gICBQQ190b19SRFJfUmVzZXRQYXJhbWV0ZXJzCi8vLyAgIFBDX3RvX1JEUl9TZXRQYXJhbWV0ZXJzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFJEUnRvUENQYXJhbWV0ZXJzKCB2b2lkICkKewogICAgdW5zaWduZWQgaW50IGk7CgogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICAvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfUEFSQU1FVEVSUzsKCiAgICAvL2NjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yICA9IDA7CgogICAgaWYoIGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzFdID09IFBST1RPQ09MX1RPICkgewoKICAgICAgICAvLyBUPTAKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgPSBzaXplb2YoU19jY2lkX3Byb3RvY29sX3QwKTsKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSBQUk9UT0NPTF9UTzsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAvLyBUPTEKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgPSBzaXplb2YoU19jY2lkX3Byb3RvY29sX3QxKTsKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSBQUk9UT0NPTF9UMTsKICAgIH0KCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCArPSBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoOwoKICAgIGZvciggaT0wOyBpPGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGg7IGkrKyApIHsKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbaV0gPSBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVtpXTsKICAgIH0KCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZXNwb25zZSBQaXBlLCBCdWxrLUlOIE1lc3NhZ2VzCi8vLyBBbnN3ZXIgdG86Ci8vLyAgIFBDX3RvX1JEUl9Fc2NhcGUKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUkRSdG9QQ0VzY2FwZSggdW5zaWduZWQgY2hhciBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKmRhdGFfc2VuZF9mcm9tX0NDSUQgKQp7CiAgICB1bnNpZ25lZCBpbnQgaTsKCiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIC8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19FU0NBUEU7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gbGVuZ3RoOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yICA9IDA7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljID0gMDsgIC8vIGJSRlUKCiAgICBmb3IoIGk9MDsgaTxsZW5ndGg7IGkrKyApIHsKICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbaV0gPSBkYXRhX3NlbmRfZnJvbV9DQ0lEW2ldOwogICAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gUmVzcG9uc2UgUGlwZSwgQnVsay1JTiBNZXNzYWdlcwovLy8gQW5zd2VyIHRvOiAKLy8vICAgUENfdG9fUkRSX1NldERhdGFSYXRlQW5kQ2xvY2tGcmVxdWVuY3kKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUkRSdG9QQ0RhdGFSYXRlQW5kQ2xvY2tGcmVxdWVuY3koIHVuc2lnbmVkIGludCBkd0Nsb2NrRnJlcXVlbmN5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGR3RGF0YVJhdGUgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIC8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19EQVRBUkFURUFORENMT0NLRlJFUVVFTkNZOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICA9IDg7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgID0gMDsKCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSAwOyAgLy8gYlJGVQoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVswXSA9IGR3Q2xvY2tGcmVxdWVuY3k7CiAgICAKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVs0XSA9IGR3RGF0YVJhdGU7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBQb3dlciBPbiBDb21tYW5kIC0gQ29sZCBSZXNldCAmIFdhcm0gUmVzZXQgCi8vLyBSZXR1cm4gdGhlIEFUUiB0byB0aGUgaG9zdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSSWNjUG93ZXJPbiggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CiAgICBpZiggQ0NJRF9GRUFUVVJFU19BVVRPX1ZPTFQgPT0gKGNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMgJiBDQ0lEX0ZFQVRVUkVTX0FVVE9fVk9MVCkgKSB7CgogICAgICAgIC8vYlBvd2VyU2VsZWN0ID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzA7CiAgICAgICAgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzAgPSBWT0xUU19BVVRPOwogICAgfQoKICAgIElTTzc4MTZfd2FybV9yZXNldCgpOwovLyAgICBJU083ODE2X2NvbGRfcmVzZXQoKTsKCiAgICAvLyBmb3IgZW11bGF0aW9uIG9ubHkgLy9KQ0IgCiAgICBpZiAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wICE9IFZPTFRTXzVfMCApIHsKCiAgICAgICAgVFJBQ0VfRVJST1IoIlBPV0VSX05PVF9TVVBQT1JURURcblxyIik7CiAgICB9CgogICAgZWxzZSB7CgogICAgICAgIFJEUnRvUENEYXRhYmxvY2tfQVRSKCk7CgogICAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gUG93ZXIgT2ZmIENvbW1hbmQgLSBTZXQgdGhlIElDQyBpbiBhbiBpbmFjdGl2ZSBzdGF0ZQovLy8gUmV0dXJuIHRoZSBzbG90IHN0YXR1cyB0byB0aGUgaG9zdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSSWNjUG93ZXJPZmYoIHZvaWQgKQp7CiAgICB1bnNpZ25lZCBjaGFyIGJTdGF0dXM7CgogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBJU083ODE2X0ljY1Bvd2VyT2ZmKCk7CgogICAgLy9KQ0Igc3R1YgogICAgYlN0YXR1cyA9IElDQ19CU19QUkVTRU5UX05PVEFDVElWQVRFRDsKCiAgICAvLyBTZXQgdGhlIHNsb3QgdG8gYW4gaW5hY3RpdmUgc3RhdHVzCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciA9IDA7CgogICAgLy8gaWYgZXJyb3IsIHNlZSBUYWJsZSA2LjEtMiBlcnJvcnMKCiAgICAvLyBSZXR1cm4gdGhlIHNsb3Qgc3RhdHVzIHRvIHRoZSBob3N0CiAgICBSRFJ0b1BDU2xvdFN0YXR1cygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gR2V0IHNsb3Qgc3RhdHVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJHZXRTbG90U3RhdHVzKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciA9IDA7CgogICAgLy8gUmV0dXJuIHRoZSBzbG90IHN0YXR1cyB0byB0aGUgaG9zdAogICAgUkRSdG9QQ1Nsb3RTdGF0dXMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIElmIHRoZSBjb21tYW5kIGhlYWRlciBpcyB2YWxpZCwgYW4gQVBEVSBjb21tYW5kIGlzIHJlY2VpdmVkIGFuZCBjYW4gYmUgcmVhZAovLy8gYnkgdGhlIGFwcGxpY2F0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJYZnJCbG9jayggdm9pZCApCnsKICAgIHVpbnQxNl90IG1zZ2xlbiA9IDA7CiAgICB1aW50MzJfdCByZXQ7CgogICAgLy9UUkFDRV9ERUJVRygiLiIpOwoKICAgIC8vIENoZWNrIHRoZSBibG9jayBsZW5ndGgKICAgIGlmICggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQud0xlbmd0aCA+IChjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUy0+Y2NpZC5kd01heENDSURNZXNzYWdlTGVuZ3RoLTEwKSApIHsKCiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDE7CiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yICA9IDA7CiAgICB9CiAgICAvLyBjaGVjayBiQldJCiAgICBlbHNlIGlmICggMCAhPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCApIHsKCiAgICAgICAgIFRSQUNFX0VSUk9SKCJCYWQgYkJXSVxuXHIiKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAvLyBBUERVIG9yIFRQRFUKICAgICAgICBzd2l0Y2goY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdGZWF0dXJlcyAKICAgICAgICAgICAgICAmIChDQ0lEX0ZFQVRVUkVTX0VYQ19UUERVfENDSURfRkVBVFVSRVNfRVhDX1NBUERVfENDSURfRkVBVFVSRVNfRVhDX0FQRFUpKSB7CgogICAgICAgICAgICBjYXNlIENDSURfRkVBVFVSRVNfRVhDX1RQRFU6CiAgICAgICAgICAgICAgICBpZiAoY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0gPT0gUFJPVE9DT0xfVE8pIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV9JTkZPKCJBUERVIGNtZDogJXggJXggJXggLi4iLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzBdLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzFdLGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMl0gKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBjb21tYW5kZSBBUERVCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gSVNPNzgxNl9YZnJCbG9ja1RQRFVfVDAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFUgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC53TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2dsZW4gKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfRVJST1IoIkFQRFUgY291bGQgbm90IGJlIHNlbnQ6IChVU19DU1IgPSAweCV4KSIsIHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0gPT0gUFJPVE9DT0xfVDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfSU5GTygiTm90IHN1cHBvcnRlZCBUPTFcblxyIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9JTkZPKCJOb3Qgc3VwcG9ydGVkIDB4JXhcblxyIiwgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVOgogICAgICAgICAgICAgICAgVFJBQ0VfSU5GTygiTm90IHN1cHBvcnRlZCBDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVXG5cciIpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgIH0KCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoID0gbXNnbGVuOwogICAgVFJBQ0VfREVCVUcoIlVTQjogMHglWCwgMHglWCwgMHglWCwgMHglWCwgMHglWFxuXHIiLCBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbMF0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVsxXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzJdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzRdICk7CiAgICAgUkRSdG9QQ0RhdGFibG9jaygpOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIHJldHVybiBwYXJhbWV0ZXJzIGJ5IHRoZSBjb21tYW5kOiBSRFJfdG9fUENfUGFyYW1ldGVycwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSR2V0UGFyYW1ldGVycyggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgLy8gV2Ugc3VwcG9ydCBvbmx5IG9uZSBzbG90CgogICAgLy8gYm1JY2NTdGF0dXMKICAgIGlmKCBJU083ODE2X1N0YXR1c1Jlc2V0KCkgKSB7CiAgICAgICAgLy8gMDogQW4gSUNDIGlzIHByZXNlbnQgYW5kIGFjdGl2ZSAocG93ZXIgaXMgb24gYW5kIHN0YWJsZSwgUlNUIGlzIGluYWN0aXZlCiAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyAxOiBBbiBJQ0MgaXMgcHJlc2VudCBhbmQgaW5hY3RpdmUgKG5vdCBhY3RpdmF0ZWQgb3Igc2h1dCBkb3duIGJ5IGhhcmR3YXJlIGVycm9yKQogICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAxOwogICAgfQoKICAgIFJEUnRvUENQYXJhbWV0ZXJzKCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGNvbW1hbmQgcmVzZXRzIHRoZSBzbG90IHBhcmFtZXRlcnMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUlJlc2V0UGFyYW1ldGVycyggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgY2NpZERyaXZlci5TbG90U3RhdHVzID0gSUNDX05PVF9QUkVTRU5UOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IGNjaWREcml2ZXIuU2xvdFN0YXR1czsKCiAgICBSRFJ0b1BDUGFyYW1ldGVycygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBwYXJhbWV0ZXJzIGZvciBhIGdpdmVuIHNsb3QuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJTZXRQYXJhbWV0ZXJzKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBjY2lkRHJpdmVyLlNsb3RTdGF0dXMgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2xvdDsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSBjY2lkRHJpdmVyLlNsb3RTdGF0dXM7CiAgICAvLyBOb3QgYWxsIGZlYXR1cmUgc3VwcG9ydGVkCgogICAgUkRSdG9QQ1BhcmFtZXRlcnMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBhbGxvd3MgdGhlIENDSUQgbWFudWZhY3R1cmVyIHRvIGRlZmluZSBhbmQgYWNjZXNzIGV4dGVuZGVkIAovLy8gZmVhdHVyZXMuIAovLy8gSW5mb3JtYXRpb24gc2VudCB2aWEgdGhpcyBjb21tYW5kIGlzIHByb2Nlc3NlZCBieSB0aGUgQ0NJRCBjb250cm9sIGxvZ2ljLgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSRXNjYXBlKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICAvLyBJZiBuZWVkZWQgYnkgdGhlIHVzZXIKICAgIElTTzc4MTZfRXNjYXBlKCk7CgogICAgLy8gc3R1YiwgcmV0dXJuIGFsbCB2YWx1ZSBzZW5kCiAgICBSRFJ0b1BDRXNjYXBlKCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC53TGVuZ3RoLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVKTsgICAgCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGNvbW1hbmQgc3RvcHMgb3IgcmVzdGFydHMgdGhlIGNsb2NrLgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSSUNDQ2xvY2soIHZvaWQgKQp7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIGlmKCAwID09IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wICkgewogICAgICAgIC8vIHJlc3RhcnRzIHRoZSBjbG9jawogICAgICAgIElTTzc4MTZfUmVzdGFydENsb2NrKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBzdG9wIGNsb2NrIGluIHRoZSBzdGF0ZSBzaG93biBpbiB0aGUgYkNsb2NrU3RvcCBmaWVsZAogICAgICAgIElTTzc4MTZfU3RvcENsb2NrKCk7CiAgICB9CgogICAgUkRSdG9QQ1Nsb3RTdGF0dXMoICk7ICAgIAp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIGNoYW5nZXMgdGhlIHBhcmFtZXRlcnMgdXNlZCB0byBwZXJmb3JtIHRoZSB0cmFuc3BvcnRhdGlvbiBvZiAKLy8vIEFQRFUgbWVzc2FnZXMgYnkgdGhlIFQ9MCBwcm90b2NvbC4gCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJ0b0FQRFUoIHZvaWQgKQp7CiAgICB1bnNpZ25lZCBjaGFyIGJtQ2hhbmdlczsKICAgIHVuc2lnbmVkIGNoYXIgYkNsYXNzR2V0UmVzcG9uc2U7CiAgICB1bnNpZ25lZCBjaGFyIGJDbGFzc0VudmVsb3BlOwoKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgaWYoIGNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMgPT0gKENDSURfRkVBVFVSRVNfRVhDX1NBUERVfENDSURfRkVBVFVSRVNfRVhDX0FQRFUpICkgewoKICAgICAgICBibUNoYW5nZXMgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMDsKICAgICAgICBiQ2xhc3NHZXRSZXNwb25zZSA9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18xOwogICAgICAgIGJDbGFzc0VudmVsb3BlID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzI7CgogICAgICAgIElTTzc4MTZfdG9BUERVKCk7CiAgICB9CgogICAgUkRSdG9QQ1Nsb3RTdGF0dXMoKTsgICAgCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGlzIGEgY29tbWFuZCBtZXNzYWdlIHRvIGFsbG93IGVudGVyaW5nIHRoZSBQSU4gZm9yIHZlcmlmaWNhdGlvbiBvcgovLy8gbW9kaWZpY2F0aW9uLgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSU2VjdXJlKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICBUUkFDRV9ERUJVRygiRm9yIHVzZXJcblxyIik7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBtYW5hZ2UgbW90b3JpemVkIHR5cGUgQ0NJRCBmdW5jdGlvbmFsaXR5LiAKLy8vIFRoZSBMb2NrIENhcmQgZnVuY3Rpb24gaXMgdXNlZCB0byBob2xkIHRoZSBJQ0MuIAovLy8gVGhpcyBwcmV2ZW50cyBhbiBJQ0MgZnJvbSBiZWluZyBlYXNpbHkgcmVtb3ZlZCBmcm9tIHRoZSBDQ0lELiAKLy8vIFRoZSBVbmxvY2sgQ2FyZCBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbW92ZSB0aGUgaG9sZCBpbml0aWF0ZWQgYnkgdGhlIExvY2sgCi8vLyBDYXJkIGZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJNZWNoYW5pY2FsKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKICAgIFRSQUNFX0RFQlVHKCJOb3QgaW1wbGVtZW50ZWRcblxyIik7CgogICAgUkRSdG9QQ1Nsb3RTdGF0dXMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBpcyB1c2VkIHdpdGggdGhlIENvbnRyb2wgcGlwZSBBYm9ydCByZXF1ZXN0IHRvIHRlbGwgdGhlIENDSUQgCi8vLyB0byBzdG9wIGFueSBjdXJyZW50IHRyYW5zZmVyIGF0IHRoZSBzcGVjaWZpZWQgc2xvdCBhbmQgcmV0dXJuIHRvIGEgc3RhdGUgCi8vLyB3aGVyZSB0aGUgc2xvdCBpcyByZWFkeSB0byBhY2NlcHQgYSBuZXcgY29tbWFuZCBwaXBlIEJ1bGstT1VUIG1lc3NhZ2UuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJBYm9ydCggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgUkRSdG9QQ1Nsb3RTdGF0dXMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIG1hbnVhbGx5IHNldCB0aGUgZGF0YSByYXRlIGFuZCBjbG9jayBmcmVxdWVuY3kgb2YgCi8vLyBhIHNwZWNpZmljIHNsb3QuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJTZXREYXRhUmF0ZUFuZENsb2NrRnJlcXVlbmN5KCB2b2lkICkKewogICAgdW5zaWduZWQgaW50IGR3Q2xvY2tGcmVxdWVuY3k7CiAgICB1bnNpZ25lZCBpbnQgZHdEYXRhUmF0ZTsKCiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIGR3Q2xvY2tGcmVxdWVuY3kgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzBdCiAgICAgICAgICAgICAgICAgICAgICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMV08PDgpCiAgICAgICAgICAgICAgICAgICAgICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMl08PDE2KQogICAgICAgICAgICAgICAgICAgICArIChjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzNdPDwyNCk7CgogICAgZHdEYXRhUmF0ZSA9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbNF0KICAgICAgICAgICAgICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVs1XTw8OCkKICAgICAgICAgICAgICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVs2XTw8MTYpCiAgICAgICAgICAgICAgICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbN108PDI0KTsKCiAgICBJU083ODE2X1NldERhdGFSYXRlYW5kQ2xvY2tGcmVxdWVuY3koIGR3Q2xvY2tGcmVxdWVuY3ksIGR3RGF0YVJhdGUgKTsKCiAgICBSRFJ0b1BDRGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeSggZHdDbG9ja0ZyZXF1ZW5jeSwgZHdEYXRhUmF0ZSApOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlcG9ydCB0aGUgQ01EX05PVF9TVVBQT1JURUQgZXJyb3IgdG8gdGhlIGhvc3QKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgdkNDSURDb21tYW5kTm90U3VwcG9ydGVkKCB2b2lkICkKewogICAgLy8gQ29tbWFuZCBub3Qgc3VwcG9ydGVkCiAgICAvLyB2Q0NJRFJlcG9ydEVycm9yKENNRF9OT1RfU1VQUE9SVEVEKTsKCiAgICBUUkFDRV9ERUJVRygiQ01EX05PVF9TVVBQT1JURURcblxyIik7CgogICAgLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX1NMT1RTVEFUVVM7CiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgICAgPSAwOwogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljICAgID0gMDsKCiAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzIHw9IElDQ19DU19GQUlMRUQ7CgogICAgLy8gU2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIGhvc3QKICAgIC8vdkNDSURTZW5kUmVzcG9uc2UoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFNlbnQgQ0NJRCByZXNwb25zZSBvbiBVU0IKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgdkNDSURTZW5kUmVzcG9uc2UoIHZvaWQgKQp7CiAgICB1bnNpZ25lZCBjaGFyIGJTdGF0dXM7CiAgICBUUkFDRV9ERUJVRygiLiIpOwoKICAgIGRvIHsKICAgICAgICBiU3RhdHVzID0gVVNCRF9Xcml0ZSggQ0NJRF9FUFRfREFUQV9JTiwgKHZvaWQqKSZjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTaXplVG9TZW5kLCAwLCAwICk7CiAgICB9IHdoaWxlIChiU3RhdHVzICE9IFVTQkRfU1RBVFVTX1NVQ0NFU1MpOwoKICAgIFRSQUNFX0RFQlVHKCJiU3RhdHVzOiAweCV4XG5cciIsIGJTdGF0dXMpOwp9CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vICBEZXNjcmlwdGlvbjogQ0NJRCBDb21tYW5kIGRpc3BhdGNoZXIKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgQ0NJRENvbW1hbmREaXNwYXRjaGVyKCB2b2lkICkKewogICAgdW5zaWduZWQgY2hhciBNZXNzYWdlVG9TZW5kID0gMDsKCiAgICBUUkFDRV9ERUJVRygiQ29tbWFuZDogMHglWCAweCV4IDB4JVggMHglWCAweCVYIDB4JVggMHglWFxuXHJcblxyIiwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYk1lc3NhZ2VUeXBlLAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC53TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2xvdCwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNlcSwKICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzAsCiAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18xLAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMik7CgogICAgLy8gQ2hlY2sgdGhlIHNsb3QgbnVtYmVyCiAgICBpZiAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTbG90ID4gMCApIHsKCiAgICAgICAgVFJBQ0VfRVJST1IoIkJBRF9TTE9UX05VTUJFUlxuXHIiKTsKICAgIH0KCiAgICBUUkFDRV9JTkZPKCJ0eXA9MHglWFxuXHIiLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iTWVzc2FnZVR5cGUpOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwoKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTZXEgID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNlcTsKICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTbG90ID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNsb3Q7CgogICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNpemVUb1NlbmQgPSBzaXplb2YoU19jY2lkX2J1bGtfaW5faGVhZGVyKS0oQUJEQVRBX1NJWkUrMSk7CgoKICAgIC8vIENvbW1hbmQgZGlzcGF0Y2hlcgogICAgc3dpdGNoICggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYk1lc3NhZ2VUeXBlICkgewoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9JQ0NQT1dFUk9OOgogICAgICAgICAgICBQQ3RvUkRSSWNjUG93ZXJPbigpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX0lDQ1BPV0VST0ZGOgogICAgICAgICAgICBQQ3RvUkRSSWNjUG93ZXJPZmYoKTsKICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9HRVRTTE9UU1RBVFVTOgogICAgICAgICAgICBQQ3RvUkRSR2V0U2xvdFN0YXR1cygpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX1hGUkJMT0NLOgogICAgICAgICAgICBQQ3RvUkRSWGZyQmxvY2soKTsKICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9HRVRQQVJBTUVURVJTOgogICAgICAgICAgICBQQ3RvUkRSR2V0UGFyYW1ldGVycygpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX1JFU0VUUEFSQU1FVEVSUzoKICAgICAgICAgICAgUEN0b1JEUlJlc2V0UGFyYW1ldGVycygpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX1NFVFBBUkFNRVRFUlM6CiAgICAgICAgICAgIFBDdG9SRFJTZXRQYXJhbWV0ZXJzKCk7CiAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ19UT19SRFJfRVNDQVBFOgogICAgICAgICAgICBQQ3RvUkRSRXNjYXBlKCk7CiAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ19UT19SRFJfSUNDQ0xPQ0s6CiAgICAgICAgICAgIFBDdG9SRFJJQ0NDbG9jaygpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX1QwQVBEVToKICAgICAgICAgICAgLy8gT25seSBDQ0lEcyByZXBvcnRpbmcgYSBzaG9ydCBvciBleHRlbmRlZCBBUERVIGxldmVsIGluIHRoZSBkd0ZlYXR1cmVzIAogICAgICAgICAgICAvLyBmaWVsZCBvZiB0aGUgQ0NJRCBjbGFzcyBkZXNjcmlwdG9yIG1heSB0YWtlIHRoaXMgY29tbWFuZCBpbnRvIGFjY291bnQuCiAgICAgICAgICAgIGlmKCAoQ0NJRF9GRUFUVVJFU19FWENfU0FQRFUgPT0gKENDSURfRkVBVFVSRVNfRVhDX1NBUERVJmNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMpKQogICAgICAgICAgICB8fCAoQ0NJRF9GRUFUVVJFU19FWENfQVBEVSAgPT0gKENDSURfRkVBVFVSRVNfRVhDX0FQRFUgJmNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMpKSApIHsKCiAgICAgICAgICAgICAgICAvLyBjb21tYW5kIHN1cHBvcnRlZAogICAgICAgICAgICAgICAgUEN0b1JEUnRvQVBEVSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gY29tbWFuZCBub3Qgc3VwcG9ydGVkCiAgICAgICAgICAgICAgICBUUkFDRV9JTkZPKCJOb3Qgc3VwcG9ydGVkOiBQQ19UT19SRFJfVDBBUERVXG5cciIpOwogICAgICAgICAgICAgICAgdkNDSURDb21tYW5kTm90U3VwcG9ydGVkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9TRUNVUkU6CiAgICAgICAgICAgIFBDdG9SRFJTZWN1cmUoKTsKICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9NRUNIQU5JQ0FMOgogICAgICAgICAgICBQQ3RvUkRSTWVjaGFuaWNhbCgpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENfVE9fUkRSX0FCT1JUOgogICAgICAgICAgICBQQ3RvUkRSQWJvcnQoKTsKICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDX1RPX1JEUl9TRVREQVRBUkFURUFORENMT0NLRlJFUVVFTkNZOgogICAgICAgICAgICBQQ3RvUkRSU2V0RGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeSgpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFRSQUNFX0RFQlVHKCJkZWZhdWx0OiBOb3Qgc3VwcG9ydGVkOiAweCVYXG5cciIsIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJNZXNzYWdlVHlwZSk7CiAgICAgICAgICAgIHZDQ0lEQ29tbWFuZE5vdFN1cHBvcnRlZCgpOwogICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgfQoKICAgIGlmKCBNZXNzYWdlVG9TZW5kID09IDEgKSB7CiAgICAgICAgdkNDSURTZW5kUmVzcG9uc2UoKTsKICAgIH0KfQoKCiNpZiAwCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBTRVRVUCByZXF1ZXN0IGhhbmRsZXIgZm9yIGEgQ0NJRCBkZXZpY2UKLy8vIFxwYXJhbSBwUmVxdWVzdCBQb2ludGVyIHRvIGEgVVNCR2VuZXJpY1JlcXVlc3QgaW5zdGFuY2UKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgQ0NJRF9SZXF1ZXN0SGFuZGxlcihjb25zdCBVU0JHZW5lcmljUmVxdWVzdCAqcFJlcXVlc3QpCnsKICAgIFRSQUNFX0RFQlVHKCJDQ0lEX1JIbFxuXHIiKTsKCiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2xhc3MgcmVxdWVzdAogICAgaWYgKFVTQkdlbmVyaWNSZXF1ZXN0X0dldFR5cGUocFJlcXVlc3QpID09IFVTQkdlbmVyaWNSZXF1ZXN0X0NMQVNTKSB7CgogICAgICAgIC8vIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIHN1cHBvcnRlZAogICAgICAgIHN3aXRjaCAoVVNCR2VuZXJpY1JlcXVlc3RfR2V0UmVxdWVzdChwUmVxdWVzdCkpIHsKCiAgICAgICAgICAgIGNhc2UgQ0NJREdlbmVyaWNSZXF1ZXN0X0FCT1JUOgogICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoIkNDSURHZW5lcmljUmVxdWVzdF9BQk9SVFxuXHIiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBDQ0lER2VuZXJpY1JlcXVlc3RfR0VUX0NMT0NLX0ZSRVFVRU5DSUVTOgogICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoIk5vdCBzdXBwb3J0ZWQ6IENDSURHZW5lcmljUmVxdWVzdF9HRVRfQ0xPQ0tfRlJFUVVFTkNJRVNcblxyIik7CiAgICAgICAgICAgICAgICAvLyBBIENDSUQgd2l0aCBiTnVtQ2xvY2tTdXBwb3J0ZWQgZXF1YWwgdG8gMDBoIGRvZXMgbm90IGhhdmUgCiAgICAgICAgICAgICAgICAvLyB0byBzdXBwb3J0IHRoaXMgcmVxdWVzdAogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIENDSURHZW5lcmljUmVxdWVzdF9HRVRfREFUQV9SQVRFUzoKICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKCJOb3Qgc3VwcG9ydGVkOiBDQ0lER2VuZXJpY1JlcXVlc3RfR0VUX0RBVEFfUkFURVNcblxyIik7CiAgICAgICAgICAgICAgICAvLyBBIENDSUQgd2l0aCBiTnVtRGF0YVJhdGVzU3VwcG9ydGVkIGVxdWFsIHRvIDAwaCBkb2VzIG5vdCBoYXZlIAogICAgICAgICAgICAgICAgLy8gdG8gc3VwcG9ydCB0aGlzIHJlcXVlc3QuCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBUUkFDRV9XQVJOSU5HKCAiQ0NJRERyaXZlcl9SZXF1ZXN0SGFuZGxlcjogVW5zdXBwb3J0ZWQgcmVxdWVzdCAoJWQpXG5cciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JHZW5lcmljUmVxdWVzdF9HZXRSZXF1ZXN0KHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICBVU0JEX1N0YWxsKDApOwogICAgICAgIH0KICAgIH0KCiAgICBlbHNlIGlmIChVU0JHZW5lcmljUmVxdWVzdF9HZXRUeXBlKHBSZXF1ZXN0KSA9PSBVU0JHZW5lcmljUmVxdWVzdF9TVEFOREFSRCkgewoKICAgICAgICAvLyBGb3J3YXJkIHJlcXVlc3QgdG8gdGhlIHN0YW5kYXJkIGhhbmRsZXIKICAgICAgICBVU0JERHJpdmVyX1JlcXVlc3RIYW5kbGVyKCYoY2NpZERyaXZlci51c2JkRHJpdmVyKSwgcFJlcXVlc3QpOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIC8vIFVuc3VwcG9ydGVkIHJlcXVlc3QgdHlwZQogICAgICAgIFRSQUNFX1dBUk5JTkcoICJDQ0lERHJpdmVyX1JlcXVlc3RIYW5kbGVyOiBVbnN1cHBvcnRlZCByZXF1ZXN0IHR5cGUgKCVkKVxuXHIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCR2VuZXJpY1JlcXVlc3RfR2V0VHlwZShwUmVxdWVzdCkpOwogICAgICAgIFVTQkRfU3RhbGwoMCk7CiAgICB9Cn0KCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgIEV4cG9ydGVkIGZ1bmN0aW9ucwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIE9wdGlvbmFsIGNhbGxiYWNrIHJlLWltcGxlbWVudGF0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNpZiAhZGVmaW5lZChOT0FVVE9DQUxMQkFDSykKLy8gbm90IHN0YXRpYyBmdW5jdGlvbgp2b2lkIFVTQkRDYWxsYmFja3NfUmVxdWVzdFJlY2VpdmVkKGNvbnN0IFVTQkdlbmVyaWNSZXF1ZXN0ICpyZXF1ZXN0KQp7CiAgICBDQ0lEX1JlcXVlc3RIYW5kbGVyKHJlcXVlc3QpOwp9CiNlbmRpZgojZW5kaWYKCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gSGFuZGxlcyBTbWFydENhcnQgcmVxdWVzdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIENDSURfU21hcnRDYXJkUmVxdWVzdCggdm9pZCApCnsKICAgIHVuc2lnbmVkIGNoYXIgYlN0YXR1czsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgZG8gewoKICAgICAgICBiU3RhdHVzID0gQ0NJRF9SZWFkKCAodm9pZCopJmNjaWREcml2ZXIuc0NjaWRDb21tYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihTX2NjaWRfYnVsa19vdXRfaGVhZGVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVHJhbnNmZXJDYWxsYmFjaykmQ0NJRENvbW1hbmREaXNwYXRjaGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikwICk7CiAgICB9IAogICAgd2hpbGUgKGJTdGF0dXMgIT0gVVNCRF9TVEFUVVNfU1VDQ0VTUyk7CiAgICBUUkFDRV9ERUJVRygiYlN0YXQ6ICV4XG5cciIsIGJTdGF0dXMpOwp9CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlYWRzIGRhdGEgZnJvbSB0aGUgRGF0YSBPVVQgZW5kcG9pbnQKLy8vIFxwYXJhbSBwQnVmZmVyICAgQnVmZmVyIHRvIHN0b3JlIHRoZSByZWNlaXZlZCBkYXRhCi8vLyBccGFyYW0gZExlbmd0aCAgIGRhdGEgYnVmZmVyIGxlbmd0aAovLy8gXHBhcmFtIGZDYWxsYmFjayBPcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbgovLy8gXHBhcmFtIHBBcmd1bWVudCBPcHRpb25hbCBwYXJhbWV0ZXIgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbgovLy8gXHJldHVybiBVU0JEX1NUQVRVU19MT0NLRUQgb3IgVVNCRF9TVEFUVVNfU1VDQ0VTUwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp1bnNpZ25lZCBjaGFyIENDSURfUmVhZCh2b2lkICpwQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZExlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXJDYWxsYmFjayBmQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBBcmd1bWVudCkKewogICAgcmV0dXJuIFVTQkRfUmVhZChDQ0lEX0VQVF9EQVRBX09VVCwgcEJ1ZmZlciwgZExlbmd0aCwgZkNhbGxiYWNrLCBwQXJndW1lbnQpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gU2VuZHMgZGF0YSB0aHJvdWdoIHRoZSBEYXRhIElOIGVuZHBvaW50Ci8vLyBccGFyYW0gcEJ1ZmZlciAgIEJ1ZmZlciBob2xkaW5nIHRoZSBkYXRhIHRvIHRyYW5zbWl0Ci8vLyBccGFyYW0gZExlbmd0aCAgIExlbmd0aCBvZiBkYXRhIGJ1ZmZlcgovLy8gXHBhcmFtIGZDYWxsYmFjayBPcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbgovLy8gXHBhcmFtIHBBcmd1bWVudCBPcHRpb25hbCBwYXJhbWV0ZXIgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbgovLy8gXHJldHVybiBVU0JEX1NUQVRVU19MT0NLRUQgb3IgVVNCRF9TVEFUVVNfU1VDQ0VTUwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp1bnNpZ25lZCBjaGFyIENDSURfV3JpdGUodm9pZCAqcEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXJDYWxsYmFjayBmQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQXJndW1lbnQpCnsKICAgIHJldHVybiBVU0JEX1dyaXRlKENDSURfRVBUX0RBVEFfSU4sIHBCdWZmZXIsIGRMZW5ndGgsIGZDYWxsYmFjaywgcEFyZ3VtZW50KTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFNlbmRzIGRhdGEgdGhyb3VnaCB0aGUgaW50ZXJydXB0IGVuZHBvaW50LCBJQ0MgaW5zZXJ0aW9uIGV2ZW50Ci8vLyBSRFJfdG9fUENfTm90aWZ5U2xvdENoYW5nZQovLy8gXHJldHVybiBVU0JEX1NUQVRVU19MT0NLRUQgb3IgVVNCRF9TVEFUVVNfU1VDQ0VTUwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp1bnNpZ25lZCBjaGFyIENDSURfSW5zZXJ0aW9uKCB2b2lkICkKewogICAgVFJBQ0VfREVCVUcoIi4iKTsKCiAgICAvLyBCdWlsZCB0aGUgSW50ZXJydXB0LUlOIG1lc3NhZ2UKICAgIGNjaWREcml2ZXIuQnVmZmVySU5UWzBdID0gUkRSX1RPX1BDX05PVElGWVNMT1RDSEFOR0U7CiAgICBjY2lkRHJpdmVyLkJ1ZmZlcklOVFsxXSA9IElDQ19JTlNFUlRFRF9FVkVOVDsKICAgIGNjaWREcml2ZXIuU2xvdFN0YXR1cyAgID0gSUNDX0lOU0VSVEVEX0VWRU5UOwoKICAgIC8vIE5vdGlmeSB0aGUgaG9zdCB0aGF0IGEgSUNDIGlzIGluc2VydGVkCiAgICByZXR1cm4gVVNCRF9Xcml0ZSggQ0NJRF9FUFRfTk9USUZJQ0FUSU9OLCBjY2lkRHJpdmVyLkJ1ZmZlcklOVCwgMiwgMCwgMCApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gU2VuZHMgZGF0YSB0aHJvdWdoIHRoZSBpbnRlcnJ1cHQgZW5kcG9pbnQsIElDQyByZW1vdmFsIGV2ZW50Ci8vLyBSRFJfdG9fUENfTm90aWZ5U2xvdENoYW5nZQovLy8gXHJldHVybiBVU0JEX1NUQVRVU19MT0NLRUQgb3IgVVNCRF9TVEFUVVNfU1VDQ0VTUwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp1bnNpZ25lZCBjaGFyIENDSURfUmVtb3ZhbCggdm9pZCApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgLy8gQnVpbGQgdGhlIEludGVycnVwdC1JTiBtZXNzYWdlCiAgICBjY2lkRHJpdmVyLkJ1ZmZlcklOVFswXSA9IFJEUl9UT19QQ19OT1RJRllTTE9UQ0hBTkdFOwogICAgY2NpZERyaXZlci5CdWZmZXJJTlRbMV0gPSBJQ0NfTk9UX1BSRVNFTlQ7CiAgICBjY2lkRHJpdmVyLlNsb3RTdGF0dXMgICA9IElDQ19OT1RfUFJFU0VOVDsKCiAgICAvLyBOb3RpZnkgdGhlIGhvc3QgdGhhdCBhIElDQyBpcyBpbnNlcnRlZAogICAgcmV0dXJuIFVTQkRfV3JpdGUoIENDSURfRVBUX05PVElGSUNBVElPTiwgY2NpZERyaXZlci5CdWZmZXJJTlQsIDIsIDAsIDAgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIEludGVycnVwdC1JTiBNZXNzYWdlcwovLy8gVGhpcyBtZXNzYWdlIGlzIHNlbnQgd2hlbiBhbnkgYml0IGluIHRoZSBiSGFyZHdhcmVFcnJvckNvZGUgZmllbGQgaXMgc2V0LiAKLy8vIElmIHRoaXMgbWVzc2FnZSBpcyBzZW50IHdoZW4gdGhlcmUgaXMgbm8gk291dHN0YW5kaW5nlCBjb21tYW5kLCB0aGUgYlNlcSAKLy8vIGZpZWxkIHdpbGwgYmUgdW5kZWZpbmVkLgovLy8gXHBhcmFtIGJTbG90IElDQyBzbG90IG51bWJlcgovLy8gXHBhcmFtIGJTZXEgIFNlcXVlbmNlIG51bWJlciBvZiB0aGUgYnVsayBPVVQgY29tbWFuZCB3aGVuIHRoZSBoYXJkd2FyZSBlcnJvcgovLy8gb2NjdXJlZAovLy8gXHBhcmFtIGJIYXJkd2FyZUVycm9yQ29kZSBIYXJkd2FyZSBlcnJvciBjb2RlCi8vLyBccmV0dXJuIFVTQkRfU1RBVFVTX0xPQ0tFRCBvciBVU0JEX1NUQVRVU19TVUNDRVNTCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnVuc2lnbmVkIGNoYXIgUkRSdG9QQ0hhcmR3YXJlRXJyb3IoIHVuc2lnbmVkIGNoYXIgYlNsb3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJTZXEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJIYXJkd2FyZUVycm9yQ29kZSApCnsKICAgIFRSQUNFX0RFQlVHKCIuIik7CgogICAgLy8gQnVpbGQgdGhlIEludGVycnVwdC1JTiBtZXNzYWdlCiAgICBjY2lkRHJpdmVyLkJ1ZmZlcklOVFswXSA9IFJEUl9UT19QQ19IQVJEV0FSRUVSUk9SOwogICAgY2NpZERyaXZlci5CdWZmZXJJTlRbMV0gPSBiU2xvdDsKICAgIGNjaWREcml2ZXIuQnVmZmVySU5UWzJdID0gYlNlcTsKICAgIGNjaWREcml2ZXIuQnVmZmVySU5UWzNdID0gYkhhcmR3YXJlRXJyb3JDb2RlOwoKICAgIC8vIE5vdGlmeSB0aGUgaG9zdCB0aGF0IGEgSUNDIGlzIGluc2VydGVkCiAgICByZXR1cm4gVVNCRF9Xcml0ZSggQ0NJRF9FUFRfTk9USUZJQ0FUSU9OLCBjY2lkRHJpdmVyLkJ1ZmZlcklOVCwgNCwgMCwgMCApOwp9CgoK