IyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KIyAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKIwojIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTUsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAojIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKIyBhcmUgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL2NvcHlyaWdodC5odG1sLgojCiMgWW91IG1heSBvcHQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlIGFuZC9vciBzZWxsCiMgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiMgZnVybmlzaGVkIHRvIGRvIHNvLCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENPUFlJTkcgZmlsZS4KIwojIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGNVUkwvbGliY3VybCBDTWFrZSBzY3JpcHQKIyBieSBUZXRldGVzdCBhbmQgU3VrZW5kZXIgKEJlbm9pdCBOZWlsKQoKIyBUT0RPOgojIFRoZSBvdXRwdXQgLnNvIGZpbGUgbGFja3MgdGhlIHNvbmFtZSBudW1iZXIgd2hpY2ggd2UgY3VycmVudGx5IGhhdmUgd2l0aGluIHRoZSBsaWIvTWFrZWZpbGUuYW0gZmlsZQojIEFkZCBmdWxsICg0IG9yIDUgbGlicykgU1NMIHN1cHBvcnQKIyBBZGQgSU5TVEFMTCB0YXJnZXQgKEVYVFJBX0RJU1QgdmFyaWFibGVzIGluIE1ha2VmaWxlLmFtIG1heSBiZSBtb3ZlZCB0byBNYWtlZmlsZS5pbmMgc28gdGhhdCBDTWFrZS9DUGFjayBpcyBhd2FyZSBvZiB3aGF0J3MgdG8gaW5jbHVkZSkuCiMgQWRkIENUZXN0cyg/KQojIENoZWNrIG9uIGFsbCBwb3NzaWJsZSBwbGF0Zm9ybXMKIyBUZXN0IHdpdGggYXMgbWFueSBjb25maWd1cmF0aW9ucyBwb3NzaWJsZSAoV2l0aCBvciB3aXRob3V0IGFueSBvcHRpb24pCiMgQ3JlYXRlIHNjcmlwdHMgdGhhdCBoZWxwIGtlZXBpbmcgdGhlIENNYWtlIGJ1aWxkIHN5c3RlbSB1cCB0byBkYXRlICh0byByZWR1Y2UgbWFpbnRlbmFuY2UpLiBBY2NvcmRpbmcgdG8gVGV0ZXRlc3Q6CiMgIC0gbGlzdHMgb2YgaGVhZGVycyB0aGF0ICdjb25maWd1cmUnIGNoZWNrcyBmb3I7CiMgIC0gY3VybC1zcGVjaWZpYyB0ZXN0cyAodGhlIG9uZXMgdGhhdCBhcmUgaW4gbTQvY3VybC0qLm00IGZpbGVzKTsKIyAgLSAobW9zdCBvYnZpb3VzIHRoaW5nOikgY3VybCB2ZXJzaW9uIG51bWJlcnMuCiMgQWRkIGRvY3VtZW50YXRpb24gc3VicHJvamVjdAojCiMgVG8gY2hlY2s6CiMgKEZyb20gRGFuaWVsIFN0ZW5iZXJnKSBUaGUgY21ha2UgYnVpbGQgc2VsZWN0ZWQgdG8gcnVuIGdjYyB3aXRoIC1mUElDIG9uIG15IGJveCB3aGlsZSB0aGUgcGxhaW4gY29uZmlndXJlIHNjcmlwdCBkaWQgbm90LgojIChGcm9tIERhbmllbCBTdGVuYmVyZykgVGhlIGdjYyBjb21tYW5kIGxpbmUgdXNlIG5laXRoZXIgLWcgbm9yIGFueSAtTyBvcHRpb25zLiBBcyBhIGRldmVsb3BlciwgSSBhbHNvIHRyZWFzdXJlIG91ciBjb25maWd1cmUgc2NyaXB0cydzIC0tZW5hYmxlLWRlYnVnIG9wdGlvbiB0aGF0IHNldHMgYSBsb25nIHJhbmdlIG9mICJwaWNreSIgY29tcGlsZXIgb3B0aW9ucy4KY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCBGQVRBTF9FUlJPUikKc2V0KENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2U7JHtDTUFLRV9NT0RVTEVfUEFUSH0iKQppbmNsdWRlKFV0aWxpdGllcykKaW5jbHVkZShNYWNyb3MpCgpwcm9qZWN0KCBDVVJMIEMgKQoKbWVzc2FnZShXQVJOSU5HICJ0aGUgY3VybCBjbWFrZSBidWlsZCBzeXN0ZW0gaXMgcG9vcmx5IG1haW50YWluZWQuIEJlIGF3YXJlIikKCmZpbGUgKFJFQUQgJHtDVVJMX1NPVVJDRV9ESVJ9L2luY2x1ZGUvY3VybC9jdXJsdmVyLmggQ1VSTF9WRVJTSU9OX0hfQ09OVEVOVFMpCnN0cmluZyAoUkVHRVggTUFUQ0ggIiNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OIFwiW15cIl0qIgogIENVUkxfVkVSU0lPTiAke0NVUkxfVkVSU0lPTl9IX0NPTlRFTlRTfSkKc3RyaW5nIChSRUdFWCBSRVBMQUNFICJbXlwiXStcIiIgIiIgQ1VSTF9WRVJTSU9OICR7Q1VSTF9WRVJTSU9OfSkKc3RyaW5nIChSRUdFWCBNQVRDSCAiI2RlZmluZSBMSUJDVVJMX1ZFUlNJT05fTlVNIDB4WzAtOWEtZkEtRl0rIgogIENVUkxfVkVSU0lPTl9OVU0gJHtDVVJMX1ZFUlNJT05fSF9DT05URU5UU30pCnN0cmluZyAoUkVHRVggUkVQTEFDRSAiW14wXSsweCIgIiIgQ1VSTF9WRVJTSU9OX05VTSAke0NVUkxfVkVSU0lPTl9OVU19KQoKaW5jbHVkZV9yZWd1bGFyX2V4cHJlc3Npb24oIl4uKiQiKSAgICAjIFN1a2VuZGVyOiBJcyBpdCBuZWNlc3Nhcnk/CgojIFNldHVwIHBhY2thZ2UgbWV0YS1kYXRhCiMgU0VUKFBBQ0tBR0UgImN1cmwiKQptZXNzYWdlKFNUQVRVUyAiY3VybCB2ZXJzaW9uPVske0NVUkxfVkVSU0lPTn1dIikKIyBTRVQoUEFDS0FHRV9UQVJOQU1FICJjdXJsIikKIyBTRVQoUEFDS0FHRV9OQU1FICJjdXJsIikKIyBTRVQoUEFDS0FHRV9WRVJTSU9OICItIikKIyBTRVQoUEFDS0FHRV9TVFJJTkcgImN1cmwtIikKIyBTRVQoUEFDS0FHRV9CVUdSRVBPUlQgImEgc3VpdGFibGUgY3VybCBtYWlsaW5nIGxpc3QgPT4gaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsLyIpCnNldChPUEVSQVRJTkdfU1lTVEVNICIke0NNQUtFX1NZU1RFTV9OQU1FfSIpCnNldChPUyAiXCIke0NNQUtFX1NZU1RFTV9OQU1FfVwiIikKCmluY2x1ZGVfZGlyZWN0b3JpZXMoJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvY3VybCkKaW5jbHVkZV9kaXJlY3RvcmllcyggJHtDVVJMX1NPVVJDRV9ESVJ9L2luY2x1ZGUgKQoKb3B0aW9uKEJVSUxEX0NVUkxfRVhFICJTZXQgdG8gT04gdG8gYnVpbGQgY1VSTCBleGVjdXRhYmxlLiIgT04pCm9wdGlvbihCVUlMRF9DVVJMX1RFU1RTICJTZXQgdG8gT04gdG8gYnVpbGQgY1VSTCB0ZXN0cy4iIE9OKQpvcHRpb24oQ1VSTF9TVEFUSUNMSUIgIlNldCB0byBPTiB0byBidWlsZCBsaWJjdXJsIHdpdGggc3RhdGljIGxpbmtpbmcuIiBPRkYpCm9wdGlvbihFTkFCTEVfQVJFUyAiU2V0IHRvIE9OIHRvIGVuYWJsZSBjLWFyZXMgc3VwcG9ydCIgT0ZGKQpvcHRpb24oRU5BQkxFX1RIUkVBREVEX1JFU09MVkVSICJTZXQgdG8gT04gdG8gZW5hYmxlIFBPU0lYIHRocmVhZGVkIEROUyBsb29rdXAiIE9GRikKCm9wdGlvbihFTkFCTEVfREVCVUcgIlNldCB0byBPTiB0byBlbmFibGUgY3VybCBkZWJ1ZyBmZWF0dXJlcyIgT0ZGKQpvcHRpb24oRU5BQkxFX0NVUkxERUJVRyAiU2V0IHRvIE9OIHRvIGJ1aWxkIHdpdGggVHJhY2tNZW1vcnkgZmVhdHVyZSBlbmFibGVkIiBPRkYpCgppZiAoRU5BQkxFX0RFQlVHKQogICMgREVCVUdCVUlMRCB3aWxsIGJlIGRlZmluZWQgb25seSBmb3IgRGVidWcgYnVpbGRzCiAgaWYoTk9UIENNQUtFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDMuMCkKICAgIHNldF9wcm9wZXJ0eShESVJFQ1RPUlkgQVBQRU5EIFBST1BFUlRZIENPTVBJTEVfREVGSU5JVElPTlMgJDwkPENPTkZJRzpEZWJ1Zz46REVCVUdCVUlMRD4pCiAgZWxzZSgpCiAgICBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORCBQUk9QRVJUWSBDT01QSUxFX0RFRklOSVRJT05TX0RFQlVHIERFQlVHQlVJTEQpCiAgZW5kaWYoKQogIHNldChFTkFCTEVfQ1VSTERFQlVHIE9OKQplbmRpZigpCgppZiAoRU5BQkxFX0NVUkxERUJVRykKICBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORCBQUk9QRVJUWSBDT01QSUxFX0RFRklOSVRJT05TIENVUkxERUJVRykKZW5kaWYoKQoKIyBpbml0aWFsaXplIENVUkxfTElCUwpzZXQoQ1VSTF9MSUJTICIiKQoKaWYoRU5BQkxFX1RIUkVBREVEX1JFU09MVkVSIEFORCBFTkFCTEVfQVJFUykKICBtZXNzYWdlKEZBVEFMX0VSUk9SICJPcHRpb25zIEVOQUJMRV9USFJFQURFRF9SRVNPTFZFUiBhbmQgRU5BQkxFX0FSRVMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSIpCmVuZGlmKCkKCmlmKEVOQUJMRV9BUkVTKQogIHNldChVU0VfQVJFUyAxKQogIGZpbmRfcGFja2FnZShDQVJFUyBSRVFVSVJFRCkKICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtDQVJFU19MSUJSQVJZfSApCiAgc2V0KENVUkxfTElCUyAke0NVUkxfTElCU30gJHtDQVJFU19MSUJSQVJZfSkKZW5kaWYoKQoKb3B0aW9uKEJVSUxEX0RBU0hCT0FSRF9SRVBPUlRTICJTZXQgdG8gT04gdG8gYWN0aXZhdGUgcmVwb3J0aW5nIG9mIGNVUkwgYnVpbGRzIGhlcmUgaHR0cDovL3d3dy5jZGFzaC5vcmcvQ0Rhc2hQdWJsaWMvaW5kZXgucGhwP3Byb2plY3Q9Q1VSTCIgT0ZGKQppZihCVUlMRF9EQVNIQk9BUkRfUkVQT1JUUykKICAjSU5DTFVERShEYXJ0KQogIGluY2x1ZGUoQ1Rlc3QpCmVuZGlmKEJVSUxEX0RBU0hCT0FSRF9SRVBPUlRTKQoKaWYoTVNWQykKICBvcHRpb24oQlVJTERfUkVMRUFTRV9ERUJVR19ESVJTICJTZXQgT0ZGIHRvIGJ1aWxkIGVhY2ggY29uZmlndXJhdGlvbiB0byBhIHNlcGFyYXRlIGRpcmVjdG9yeSIgT0ZGKQogIG1hcmtfYXNfYWR2YW5jZWQoQlVJTERfUkVMRUFTRV9ERUJVR19ESVJTKQplbmRpZigpCgpvcHRpb24oQ1VSTF9ISURERU5fU1lNQk9MUyAiU2V0IHRvIE9OIHRvIGhpZGUgbGliY3VybCBpbnRlcm5hbCBzeW1ib2xzICg9aGlkZSBhbGwgc3ltYm9scyB0aGF0IGFyZW4ndCBvZmZpY2lhbGx5IGV4dGVybmFsKS4iIE9OKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfSElEREVOX1NZTUJPTFMpCgojIElGKFdJTjMyKQojIE9QVElPTihDVVJMX1dJTkRPV1NfU1NQSSAiVXNlIHdpbmRvd3MgbGlicmFyaWVzIHRvIGFsbG93IE5UTE0gYXV0aGVudGljYXRpb24gd2l0aG91dCBvcGVuc3NsIiBPTikKIyBNQVJLX0FTX0FEVkFOQ0VEKENVUkxfV0lORE9XU19TU1BJKQojIEVORElGKCkKCm9wdGlvbihIVFRQX09OTFkgImRpc2FibGVzIGFsbCBwcm90b2NvbHMgZXhjZXB0IEhUVFAgKFRoaXMgb3ZlcnJpZGVzIGFsbCBDVVJMX0RJU0FCTEVfKiBvcHRpb25zKSIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKEhUVFBfT05MWSkKb3B0aW9uKENVUkxfRElTQUJMRV9GVFAgImRpc2FibGVzIEZUUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9GVFApCm9wdGlvbihDVVJMX0RJU0FCTEVfTERBUCAiZGlzYWJsZXMgTERBUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9MREFQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1RFTE5FVCAiZGlzYWJsZXMgVGVsbmV0IiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1RFTE5FVCkKb3B0aW9uKENVUkxfRElTQUJMRV9ESUNUICJkaXNhYmxlcyBESUNUIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0RJQ1QpCm9wdGlvbihDVVJMX0RJU0FCTEVfRklMRSAiZGlzYWJsZXMgRklMRSIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9GSUxFKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1RGVFAgImRpc2FibGVzIFRGVFAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVEZUUCkKb3B0aW9uKENVUkxfRElTQUJMRV9IVFRQICJkaXNhYmxlcyBIVFRQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0hUVFApCgpvcHRpb24oQ1VSTF9ESVNBQkxFX0xEQVBTICJ0byBkaXNhYmxlIExEQVBTIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0xEQVBTKQoKb3B0aW9uKENVUkxfRElTQUJMRV9SVFNQICJ0byBkaXNhYmxlIFJUU1AiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfUlRTUCkKb3B0aW9uKENVUkxfRElTQUJMRV9QUk9YWSAidG8gZGlzYWJsZSBwcm94eSIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9QUk9YWSkKb3B0aW9uKENVUkxfRElTQUJMRV9QT1AzICJ0byBkaXNhYmxlIFBPUDMiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfUE9QMykKb3B0aW9uKENVUkxfRElTQUJMRV9JTUFQICJ0byBkaXNhYmxlIElNQVAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfSU1BUCkKb3B0aW9uKENVUkxfRElTQUJMRV9TTVRQICJ0byBkaXNhYmxlIFNNVFAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfU01UUCkKb3B0aW9uKENVUkxfRElTQUJMRV9HT1BIRVIgInRvIGRpc2FibGUgR29waGVyIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0dPUEhFUikKCmlmKEhUVFBfT05MWSkKICBzZXQoQ1VSTF9ESVNBQkxFX0ZUUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVAgT04pCiAgc2V0KENVUkxfRElTQUJMRV9MREFQUyBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX1RFTE5FVCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0RJQ1QgT04pCiAgc2V0KENVUkxfRElTQUJMRV9GSUxFIE9OKQogIHNldChDVVJMX0RJU0FCTEVfVEZUUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX1JUU1AgT04pCiAgc2V0KENVUkxfRElTQUJMRV9QT1AzIE9OKQogIHNldChDVVJMX0RJU0FCTEVfSU1BUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX1NNVFAgT04pCiAgc2V0KENVUkxfRElTQUJMRV9HT1BIRVIgT04pCmVuZGlmKCkKCm9wdGlvbihDVVJMX0RJU0FCTEVfQ09PS0lFUyAidG8gZGlzYWJsZSBjb29raWVzIHN1cHBvcnQiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfQ09PS0lFUykKCm9wdGlvbihDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEggInRvIGRpc2FibGUgY3J5cHRvZ3JhcGhpYyBhdXRoZW50aWNhdGlvbiIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCkKb3B0aW9uKENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MgInRvIGRpc2FibGUgdmVyYm9zZSBzdHJpbmdzIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUykKb3B0aW9uKERJU0FCTEVEX1RIUkVBRFNBRkUgIlNldCB0byBleHBsaWNpdGx5IHNwZWNpZnkgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhyZWFkLXNhZmUgZnVuY3Rpb25zIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoRElTQUJMRURfVEhSRUFEU0FGRSkKb3B0aW9uKEVOQUJMRV9JUFY2ICJEZWZpbmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIElQdjYgc3VwcG9ydCIgT04pCm1hcmtfYXNfYWR2YW5jZWQoRU5BQkxFX0lQVjYpCmlmKEVOQUJMRV9JUFY2KQogIGluY2x1ZGUoQ2hlY2tTdHJ1Y3RIYXNNZW1iZXIpCiAgY2hlY2tfc3RydWN0X2hhc19tZW1iZXIoInN0cnVjdCBzb2NrYWRkcl9pbjYiIHNpbjZfYWRkciAibmV0aW5ldC9pbi5oIgogICAgICAgICAgICAgICAgICAgICAgICAgIEhBVkVfU09DS0FERFJfSU42X1NJTjZfQUREUikKICBjaGVja19zdHJ1Y3RfaGFzX21lbWJlcigic3RydWN0IHNvY2thZGRyX2luNiIgc2luNl9zY29wZV9pZCAibmV0aW5ldC9pbi5oIgogICAgICAgICAgICAgICAgICAgICAgICAgIEhBVkVfU09DS0FERFJfSU42X1NJTjZfU0NPUEVfSUQpCiAgaWYoTk9UIEhBVkVfU09DS0FERFJfSU42X1NJTjZfQUREUikKICAgIG1lc3NhZ2UoV0FSTklORyAic3RydWN0IHNvY2thZGRyX2luNiBub3QgYXZhaWxhYmxlLCBkaXNhYmxpbmcgSVB2NiBzdXBwb3J0IikKICAgICMgRm9yY2UgdGhlIGZlYXR1cmUgb2ZmIGFzIHRoaXMgbmFtZSBpcyB1c2VkIGFzIGd1YXJkIG1hY3JvLi4uCiAgICBzZXQoRU5BQkxFX0lQVjYgT0ZGCiAgICAgICAgQ0FDSEUgQk9PTCAiRGVmaW5lIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBJUHY2IHN1cHBvcnQiIEZPUkNFKQogIGVuZGlmKCkKZW5kaWYoKQoKb3B0aW9uKEVOQUJMRV9NQU5VQUwgInRvIHByb3ZpZGUgdGhlIGJ1aWx0LWluIG1hbnVhbCIgT04pCnVuc2V0KFVTRV9NQU5VQUwgQ0FDSEUpICMgVE9ETzogY2FjaGUgTlJPRkYvTlJPRkZfTUFOT1BUL1VTRV9NQU5VQUwgdmFycz8KaWYoRU5BQkxFX01BTlVBTCkKICBmaW5kX3Byb2dyYW0oTlJPRkYgTkFNRVMgZ25yb2ZmIG5yb2ZmKQogIGlmKE5ST0ZGKQogICAgIyBOZWVkIGEgd2F5IHRvIHdyaXRlIHRvIHN0ZGluLCB0aGlzIHdpbGwgZG8KICAgIGZpbGUoV1JJVEUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiICJ0ZXN0IikKICAgICMgVGVzdHMgZm9yIGEgdmFsaWQgbnJvZmYgb3B0aW9uIHRvIGdlbmVyYXRlIGEgbWFucGFnZQogICAgZm9yZWFjaChfTUFOT1BUICItbWFuIiAiLW1hbmRvYyIpCiAgICAgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICIke05ST0ZGfSIgJHtfTUFOT1BUfQogICAgICAgIE9VVFBVVF9WQVJJQUJMRSBOUk9GRl9NQU5PUFRfT1VUUFVUCiAgICAgICAgSU5QVVRfRklMRSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L25yb2ZmLWlucHV0LnR4dCIKICAgICAgICBFUlJPUl9RVUlFVCkKICAgICAgIyBTYXZlIHRoZSBvcHRpb24gaWYgaXQgd2FzIHZhbGlkCiAgICAgIGlmKE5ST0ZGX01BTk9QVF9PVVRQVVQpCiAgICAgICAgbWVzc2FnZSgiRm91bmQgKm5yb2ZmIG9wdGlvbjogLS0gJHtfTUFOT1BUfSIpCiAgICAgICAgc2V0KE5ST0ZGX01BTk9QVCAke19NQU5PUFR9KQogICAgICAgIHNldChVU0VfTUFOVUFMIDEpCiAgICAgICAgYnJlYWsoKQogICAgICBlbmRpZigpCiAgICBlbmRmb3JlYWNoKCkKICAgICMgTm8gbmVlZCBmb3IgdGhlIHRlbXBvcmFyeSBmaWxlCiAgICBmaWxlKFJFTU9WRSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L25yb2ZmLWlucHV0LnR4dCIpCiAgICBpZihOT1QgVVNFX01BTlVBTCkKICAgICAgbWVzc2FnZShXQVJOSU5HICJGb3VuZCBubyAqbnJvZmYgb3B0aW9uIHRvIGdldCBwbGFpbnRleHQgZnJvbSBtYW4gcGFnZXMiKQogICAgZW5kaWYoKQogIGVsc2UoKQogICAgbWVzc2FnZShXQVJOSU5HICJGb3VuZCBubyAqbnJvZmYgcHJvZ3JhbSIpCiAgZW5kaWYoKQplbmRpZigpCgojIFdlIG5lZWQgYW5zaSBjLWZsYWdzLCBlc3BlY2lhbGx5IG9uIEhQCnNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0FOU0lfQ0ZMQUdTfSAke0NNQUtFX0NfRkxBR1N9IikKc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICR7Q01BS0VfQU5TSV9DRkxBR1N9KQoKIyBEaXNhYmxlIHdhcm5pbmdzIG9uIEJvcmxhbmQgdG8gYXZvaWQgY2hhbmdpbmcgM3JkIHBhcnR5IGNvZGUuCmlmKEJPUkxBTkQpCiAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gLXctIikKZW5kaWYoQk9STEFORCkKCiMgSWYgd2UgYXJlIG9uIEFJWCwgZG8gdGhlIF9BTExfU09VUkNFIG1hZ2ljCmlmKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgQUlYKQogIHNldChfQUxMX1NPVVJDRSAxKQplbmRpZigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTIEFJWCkKCiMgSW5jbHVkZSBhbGwgdGhlIG5lY2Vzc2FyeSBmaWxlcyBmb3IgbWFjcm9zCmluY2x1ZGUgKENoZWNrRnVuY3Rpb25FeGlzdHMpCmluY2x1ZGUgKENoZWNrSW5jbHVkZUZpbGUpCmluY2x1ZGUgKENoZWNrSW5jbHVkZUZpbGVzKQppbmNsdWRlIChDaGVja0xpYnJhcnlFeGlzdHMpCmluY2x1ZGUgKENoZWNrU3ltYm9sRXhpc3RzKQppbmNsdWRlIChDaGVja1R5cGVTaXplKQppbmNsdWRlIChDaGVja0NTb3VyY2VDb21waWxlcykKCiMgT24gd2luZG93cyBwcmVsb2FkIHNldHRpbmdzCmlmKFdJTjMyKQogIHNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAiJHtDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OU30gLURfV0lOU09DS0FQSV8iKQogIGluY2x1ZGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NNYWtlL1BsYXRmb3Jtcy9XaW5kb3dzQ2FjaGUuY21ha2UpCmVuZGlmKFdJTjMyKQoKaWYoRU5BQkxFX1RIUkVBREVEX1JFU09MVkVSKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInB0aHJlYWQuaCIgSEFWRV9QVEhSRUFEX0gpCiAgaWYoSEFWRV9QVEhSRUFEX0gpCiAgICBzZXQoQ01BS0VfVEhSRUFEX1BSRUZFUl9QVEhSRUFEIDEpCiAgICBmaW5kX3BhY2thZ2UoVGhyZWFkcykKICAgIGlmKENNQUtFX1VTRV9QVEhSRUFEU19JTklUKQogICAgICBzZXQoQ1VSTF9MSUJTICR7Q1VSTF9MSUJTfSAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQogICAgICBzZXQoVVNFX1RIUkVBRFNfUE9TSVggMSkKICAgIGVuZGlmKCkKICBlbmRpZigpCmVuZGlmKCkKCiMgQ2hlY2sgZm9yIGFsbCBuZWVkZWQgbGlicmFyaWVzCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiZGwiICAgICBkbG9wZW4gICAgICAgSEFWRV9MSUJETCkKY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJzb2NrZXQiIGNvbm5lY3QgICAgICBIQVZFX0xJQlNPQ0tFVCkKY2hlY2tfbGlicmFyeV9leGlzdHMoImMiIGdldGhvc3RieW5hbWUgIiIgTk9UX05FRURfTElCTlNMKQoKIyBZZWxsb3d0YWIgWmV0YSBuZWVkcyBkaWZmZXJlbnQgbGlicmFyaWVzIHRoYW4gQmVPUyA1LgppZihCRU9TKQogIHNldChOT1RfTkVFRF9MSUJOU0wgMSkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImJpbmQiIGdldGhvc3RieW5hbWUgSEFWRV9MSUJCSU5EKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiYm5ldGFwaSIgY2xvc2Vzb2NrZXQgSEFWRV9MSUJCTkVUQVBJKQplbmRpZihCRU9TKQoKaWYoTk9UIE5PVF9ORUVEX0xJQk5TTCkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIm5zbCIgICAgZ2V0aG9zdGJ5bmFtZSAgSEFWRV9MSUJOU0wpCmVuZGlmKE5PVCBOT1RfTkVFRF9MSUJOU0wpCgpjaGVja19mdW5jdGlvbl9leGlzdHMoZ2V0aG9zdG5hbWUgSEFWRV9HRVRIT1NUTkFNRSkKCmlmKFdJTjMyKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgid3MyXzMyIiBnZXRjaCAgICAgICAgSEFWRV9MSUJXUzJfMzIpCiAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJ3aW5tbSIgIGdldGNoICAgICAgICBIQVZFX0xJQldJTk1NKQplbmRpZigpCgpvcHRpb24oQ01BS0VfVVNFX09QRU5TU0wgIlVzZSBPcGVuU1NMIGNvZGUuIEV4cGVyaW1lbnRhbCIgT04pCm1hcmtfYXNfYWR2YW5jZWQoQ01BS0VfVVNFX09QRU5TU0wpCgpzZXQoVVNFX09QRU5TU0wgT0ZGKQpzZXQoSEFWRV9MSUJDUllQVE8gT0ZGKQpzZXQoSEFWRV9MSUJTU0wgT0ZGKQoKaWYoQ01BS0VfVVNFX09QRU5TU0wpCiAgZmluZF9wYWNrYWdlKE9wZW5TU0wpCiAgaWYoT1BFTlNTTF9GT1VORCkKICAgIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke09QRU5TU0xfTElCUkFSSUVTfSkKICAgIHNldChVU0VfT1BFTlNTTCBPTikKICAgIHNldChIQVZFX0xJQkNSWVBUTyBPTikKICAgIHNldChIQVZFX0xJQlNTTCBPTikKICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtPUEVOU1NMX0lOQ0xVREVfRElSfSkKICAgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke09QRU5TU0xfSU5DTFVERV9ESVJ9KQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL2NyeXB0by5oIiBIQVZFX09QRU5TU0xfQ1JZUFRPX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvZW5naW5lLmgiIEhBVkVfT1BFTlNTTF9FTkdJTkVfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9lcnIuaCIgICAgSEFWRV9PUEVOU1NMX0VSUl9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL3BlbS5oIiAgICBIQVZFX09QRU5TU0xfUEVNX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvcGtjczEyLmgiIEhBVkVfT1BFTlNTTF9QS0NTMTJfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9yc2EuaCIgICAgSEFWRV9PUEVOU1NMX1JTQV9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL3NzbC5oIiAgICBIQVZFX09QRU5TU0xfU1NMX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wveDUwOS5oIiAgIEhBVkVfT1BFTlNTTF9YNTA5X0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvcmFuZC5oIiAgIEhBVkVfT1BFTlNTTF9SQU5EX0gpCiAgZW5kaWYoKQplbmRpZigpCgppZihOT1QgQ1VSTF9ESVNBQkxFX0xEQVApCgogIGlmKFdJTjMyKQogICAgb3B0aW9uKFVTRV9XSU4zMl9MREFQICJVc2UgV2luZG93cyBMREFQIGltcGxlbWVudGF0aW9uIiBPTikKICAgIGlmKFVTRV9XSU4zMl9MREFQKQogICAgICBjaGVja19saWJyYXJ5X2V4aXN0cygid2xkYXAzMiIgY2xkYXBfb3BlbiAiIiBIQVZFX1dMREFQMzIpCiAgICAgIGlmKE5PVCBIQVZFX1dMREFQMzIpCiAgICAgICAgc2V0KFVTRV9XSU4zMl9MREFQIE9GRikKICAgICAgZW5kaWYoKQogICAgZW5kaWYoKQogIGVuZGlmKCkKCiAgb3B0aW9uKENNQUtFX1VTRV9PUEVOTERBUCAiVXNlIE9wZW5MREFQIGNvZGUuIiBPRkYpCiAgbWFya19hc19hZHZhbmNlZChDTUFLRV9VU0VfT1BFTkxEQVApCiAgc2V0KENNQUtFX0xEQVBfTElCICJsZGFwIiBDQUNIRSBTVFJJTkcgIk5hbWUgb3IgZnVsbCBwYXRoIHRvIGxkYXAgbGlicmFyeSIpCiAgc2V0KENNQUtFX0xCRVJfTElCICJsYmVyIiBDQUNIRSBTVFJJTkcgIk5hbWUgb3IgZnVsbCBwYXRoIHRvIGxiZXIgbGlicmFyeSIpCgogIGlmKENNQUtFX1VTRV9PUEVOTERBUCBBTkQgVVNFX1dJTjMyX0xEQVApCiAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDYW5ub3QgdXNlIFVTRV9XSU4zMl9MREFQIGFuZCBDTUFLRV9VU0VfT1BFTkxEQVAgYXQgdGhlIHNhbWUgdGltZSIpCiAgZW5kaWYoKQogIAogICMgTm93IHRoYXQgd2Uga25vdywgd2UncmUgbm90IHVzaW5nIHdpbmRvd3MgTERBUC4uLgogIGlmKE5PVCBVU0VfV0lOMzJfTERBUCkKICAgICMgQ2hlY2sgZm9yIExEQVAKICAgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtPUEVOU1NMX0xJQlJBUklFU30pCiAgICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoJHtDTUFLRV9MREFQX0xJQn0gbGRhcF9pbml0IEhBVkVfTElCTERBUCkKICAgIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgke0NNQUtFX0xCRVJfTElCfSBiZXJfaW5pdCBIQVZFX0xJQkxCRVIpCiAgZWxzZSgpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3aW5sZGFwLmgiIEhBVkVfV0lOTERBUF9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luYmVyLmgiICBIQVZFX1dJTkJFUl9IKQogIGVuZGlmKCkKICAKICBzZXQoQ01BS0VfTERBUF9JTkNMVURFX0RJUiAiIiBDQUNIRSBTVFJJTkcgIlBhdGggdG8gTERBUCBpbmNsdWRlIGRpcmVjdG9yeSIpCiAgaWYoQ01BS0VfTERBUF9JTkNMVURFX0RJUikKICAgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0NNQUtFX0xEQVBfSU5DTFVERV9ESVJ9KQogIGVuZGlmKCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsZGFwLmgiICAgICAgICAgICBIQVZFX0xEQVBfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsYmVyLmgiICAgICAgICAgICBIQVZFX0xCRVJfSCkKCiAgaWYoTk9UIEhBVkVfTERBUF9IKQogICAgbWVzc2FnZShTVEFUVVMgIkxEQVBfSCBub3QgZm91bmQgQ1VSTF9ESVNBQkxFX0xEQVAgc2V0IE9OIikKICAgIHNldChDVVJMX0RJU0FCTEVfTERBUCBPTiBDQUNIRSBCT09MICIiIEZPUkNFKQogIGVsc2VpZihOT1QgSEFWRV9MSUJMREFQKQogICAgbWVzc2FnZShTVEFUVVMgIkxEQVAgbGlicmFyeSAnJHtDTUFLRV9MREFQX0xJQn0nIG5vdCBmb3VuZCBDVVJMX0RJU0FCTEVfTERBUCBzZXQgT04iKQogICAgc2V0KENVUkxfRElTQUJMRV9MREFQIE9OIENBQ0hFIEJPT0wgIiIgRk9SQ0UpCiAgZWxzZSgpCiAgICBpZihDTUFLRV9VU0VfT1BFTkxEQVApCiAgICAgIHNldChVU0VfT1BFTkxEQVAgT04pCiAgICBlbmRpZigpCiAgICBpZihDTUFLRV9MREFQX0lOQ0xVREVfRElSKQogICAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfTERBUF9JTkNMVURFX0RJUn0pCiAgICBlbmRpZigpCiAgICBzZXQoTkVFRF9MQkVSX0ggT04pCiAgICBzZXQoX0hFQURFUl9MSVNUKQogICAgaWYoSEFWRV9XSU5ET1dTX0gpCiAgICAgIGxpc3QoQVBQRU5EIF9IRUFERVJfTElTVCAid2luZG93cy5oIikKICAgIGVuZGlmKCkKICAgIGlmKEhBVkVfU1lTX1RZUEVTX0gpCiAgICAgIGxpc3QoQVBQRU5EIF9IRUFERVJfTElTVCAic3lzL3R5cGVzLmgiKQogICAgZW5kaWYoKQogICAgbGlzdChBUFBFTkQgX0hFQURFUl9MSVNUICJsZGFwLmgiKQoKICAgIHNldChfU1JDX1NUUklORyAiIikKICAgIGZvcmVhY2goX0hFQURFUiAke19IRUFERVJfTElTVH0pCiAgICAgIHNldChfSU5DTFVERV9TVFJJTkcgIiR7X0lOQ0xVREVfU1RSSU5HfSNpbmNsdWRlIDwke19IRUFERVJ9PlxuIikKICAgIGVuZGZvcmVhY2goKQoKICAgIHNldChfU1JDX1NUUklORwogICAgICAiCiAgICAgICR7X0lOQ0xVREVfU1RSSU5HfQogICAgICBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQogICAgICB7CiAgICAgICAgQmVyVmFsdWUgKmJ2cCA9IE5VTEw7CiAgICAgICAgQmVyRWxlbWVudCAqYmVwID0gYmVyX2luaXQoYnZwKTsKICAgICAgICBiZXJfZnJlZShiZXAsIDEpOwogICAgICAgIHJldHVybiAwOwogICAgICB9IgogICAgKQogICAgc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TICIke0NNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TfSAtRExEQVBfREVQUkVDQVRFRD0xIikKICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0NNQUtFX0xEQVBfTElCfSkKICAgIGlmKEhBVkVfTElCTEJFUikKICAgICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICR7Q01BS0VfTEJFUl9MSUJ9KQogICAgZW5kaWYoKQogICAgY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIiR7X1NSQ19TVFJJTkd9IiBOT1RfTkVFRF9MQkVSX0gpCgogICAgaWYoTk9UX05FRURfTEJFUl9IKQogICAgICBzZXQoTkVFRF9MQkVSX0ggT0ZGKQogICAgZWxzZSgpCiAgICAgIHNldChDVVJMX1RFU1RfREVGSU5FUyAiJHtDVVJMX1RFU1RfREVGSU5FU30gLURORUVEX0xCRVJfSCIpCiAgICBlbmRpZigpCiAgZW5kaWYoKQoKZW5kaWYoKQoKIyBObyBsZGFwLCBubyBsZGFwcy4KaWYoQ1VSTF9ESVNBQkxFX0xEQVApCiAgaWYoTk9UIENVUkxfRElTQUJMRV9MREFQUykKICAgIG1lc3NhZ2UoU1RBVFVTICJMREFQIG5lZWRzIHRvIGJlIGVuYWJsZWQgdG8gc3VwcG9ydCBMREFQUyIpCiAgICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVBTIE9OIENBQ0hFIEJPT0wgIiIgRk9SQ0UpCiAgZW5kaWYoKQplbmRpZigpCgppZihOT1QgQ1VSTF9ESVNBQkxFX0xEQVBTKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxkYXBfc3NsLmgiIEhBVkVfTERBUF9TU0xfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsZGFwc3NsLmgiICBIQVZFX0xEQVBTU0xfSCkKZW5kaWYoKQoKIyBDaGVjayBmb3IgaWRuCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiaWRuIiBpZG5hX3RvX2FzY2lpX2x6IEhBVkVfTElCSUROKQoKIyBDaGVjayBmb3Igc3ltYm9sIGRsb3BlbiAoc2FtZSBhcyBIQVZFX0xJQkRMKQpjaGVja19saWJyYXJ5X2V4aXN0cygiJHtDVVJMX0xJQlN9IiBkbG9wZW4gIiIgSEFWRV9ETE9QRU4pCgpvcHRpb24oQ1VSTF9aTElCICJTZXQgdG8gT04gdG8gZW5hYmxlIGJ1aWxkaW5nIGNVUkwgd2l0aCB6bGliIHN1cHBvcnQuIiBPTikKc2V0KEhBVkVfTElCWiBPRkYpCnNldChIQVZFX1pMSUJfSCBPRkYpCnNldChIQVZFX1pMSUIgT0ZGKQppZihDVVJMX1pMSUIpCiAgZmluZF9wYWNrYWdlKFpMSUIgUVVJRVQpCiAgaWYoWkxJQl9GT1VORCkKICAgIHNldChIQVZFX1pMSUJfSCBPTikKICAgIHNldChIQVZFX1pMSUIgT04pCiAgICBzZXQoSEFWRV9MSUJaIE9OKQogICAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7WkxJQl9MSUJSQVJJRVN9KQogICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1pMSUJfSU5DTFVERV9ESVJTfSkKICBlbmRpZigpCmVuZGlmKCkKCiNsaWJTU0gyCm9wdGlvbihDTUFLRV9VU0VfTElCU1NIMiAiVXNlIGxpYlNTSDIiIE9OKQptYXJrX2FzX2FkdmFuY2VkKENNQUtFX1VTRV9MSUJTU0gyKQpzZXQoVVNFX0xJQlNTSDIgT0ZGKQpzZXQoSEFWRV9MSUJTU0gyIE9GRikKc2V0KEhBVkVfTElCU1NIMl9IIE9GRikKCmlmKENNQUtFX1VTRV9MSUJTU0gyKQogIGZpbmRfcGFja2FnZShMaWJTU0gyKQogIGlmKExJQlNTSDJfRk9VTkQpCiAgICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtMSUJTU0gyX0xJQlJBUll9KQogICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0xJQlNTSDJfTElCUkFSWX0pCiAgICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgIiR7TElCU1NIMl9JTkNMVURFX0RJUn0iKQogICAgaW5jbHVkZV9kaXJlY3RvcmllcygiJHtMSUJTU0gyX0lOQ0xVREVfRElSfSIpCiAgICBzZXQoSEFWRV9MSUJTU0gyIE9OKQogICAgc2V0KFVTRV9MSUJTU0gyIE9OKQoKICAgICMgZmluZF9wYWNrYWdlIGhhcyBhbHJlYWR5IGZvdW5kIHRoZSBoZWFkZXJzCiAgICBzZXQoSEFWRV9MSUJTU0gyX0ggT04pCiAgICBzZXQoQ1VSTF9JTkNMVURFUyAke0NVUkxfSU5DTFVERVN9ICIke0xJQlNTSDJfSU5DTFVERV9ESVJ9L2xpYnNzaDIuaCIpCiAgICBzZXQoQ1VSTF9URVNUX0RFRklORVMgIiR7Q1VSTF9URVNUX0RFRklORVN9IC1ESEFWRV9MSUJTU0gyX0giKQoKICAgICMgbm93IGNoZWNrIGZvciBzcGVjaWZpYyBsaWJzc2gyIHN5bWJvbHMgYXMgdGhleSB3ZXJlIGFkZGVkIGluIGRpZmZlcmVudCB2ZXJzaW9ucwogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgImxpYnNzaDIuaCIpCiAgICBjaGVja19mdW5jdGlvbl9leGlzdHMobGlic3NoMl92ZXJzaW9uICAgICAgICAgICBIQVZFX0xJQlNTSDJfVkVSU0lPTikKICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsaWJzc2gyX2luaXQgICAgICAgICAgICAgIEhBVkVfTElCU1NIMl9JTklUKQogICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGxpYnNzaDJfZXhpdCAgICAgICAgICAgICAgSEFWRV9MSUJTU0gyX0VYSVQpCiAgICBjaGVja19mdW5jdGlvbl9leGlzdHMobGlic3NoMl9zY3Bfc2VuZDY0ICAgICAgICBIQVZFX0xJQlNTSDJfU0NQX1NFTkQ2NCkKICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsaWJzc2gyX3Nlc3Npb25faGFuZHNoYWtlIEhBVkVfTElCU1NIMl9TRVNTSU9OX0hBTkRTSEFLRSkKICAgIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICIiKQoKICBlbmRpZihMSUJTU0gyX0ZPVU5EKQplbmRpZihDTUFLRV9VU0VfTElCU1NIMikKCm9wdGlvbihDTUFLRV9VU0VfR1NTQVBJICJVc2UgR1NTQVBJIGltcGxlbWVudGF0aW9uIChyaWdodCBub3cgb25seSBIZWltZGFsIGlzIHN1cHBvcnRlZCB3aXRoIENNYWtlIGJ1aWxkKSIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENNQUtFX1VTRV9HU1NBUEkpCgppZihDTUFLRV9VU0VfR1NTQVBJKQogIGZpbmRfcGFja2FnZShHU1MpCgogIHNldChIQVZFX0dTU19BUEkgJHtHU1NfRk9VTkR9KQogIGlmKEdTU19GT1VORCkKCiAgICBtZXNzYWdlKFNUQVRVUyAiRm91bmQgJHtHU1NfRkxBVk9VUn0gR1NTQVBJIHZlcnNpb246IFwiJHtHU1NfVkVSU0lPTn1cIiIpCgogICAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7R1NTX0lOQ0xVREVfRElSfSkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImdzc2FwaS9nc3NhcGkuaCIgIEhBVkVfR1NTQVBJX0dTU0FQSV9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZ3NzYXBpL2dzc2FwaV9nZW5lcmljLmgiIEhBVkVfR1NTQVBJX0dTU0FQSV9HRU5FUklDX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJnc3NhcGkvZ3NzYXBpX2tyYjUuaCIgSEFWRV9HU1NBUElfR1NTQVBJX0tSQjVfSCkKCiAgICBpZihHU1NfRkxBVk9VUiBTVFJFUVVBTCAiSGVpbWRhbCIpCiAgICAgIHNldChIQVZFX0dTU0hFSU1EQUwgT04pCiAgICBlbHNlKCkgIyBNSVQKICAgICAgc2V0KEhBVkVfR1NTTUlUIE9OKQogICAgICBzZXQoX0lOQ0xVREVfTElTVCAiIikKICAgICAgaWYoSEFWRV9HU1NBUElfR1NTQVBJX0gpCiAgICAgICAgbGlzdChBUFBFTkQgX0lOQ0xVREVfTElTVCAiZ3NzYXBpL2dzc2FwaS5oIikKICAgICAgZW5kaWYoKQogICAgICBpZihIQVZFX0dTU0FQSV9HU1NBUElfR0VORVJJQ19IKQogICAgICAgIGxpc3QoQVBQRU5EIF9JTkNMVURFX0xJU1QgImdzc2FwaS9nc3NhcGlfZ2VuZXJpYy5oIikKICAgICAgZW5kaWYoKQogICAgICBpZihIQVZFX0dTU0FQSV9HU1NBUElfS1JCNV9IKQogICAgICAgIGxpc3QoQVBQRU5EIF9JTkNMVURFX0xJU1QgImdzc2FwaS9nc3NhcGlfa3JiNS5oIikKICAgICAgZW5kaWYoKQoKICAgICAgc3RyaW5nKFJFUExBQ0UgIjsiICIgIiBfQ09NUElMRVJfRkxBR1NfU1RSICIke0dTU19DT01QSUxFUl9GTEFHU30iKQogICAgICBzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIF9MSU5LRVJfRkxBR1NfU1RSICIke0dTU19MSU5LRVJfRkxBR1N9IikKCiAgICAgIGZvcmVhY2goX2RpciAke0dTU19MSU5LX0RJUkVDVE9SSUVTfSkKICAgICAgICBzZXQoX0xJTktFUl9GTEFHU19TVFIgIiR7X0xJTktFUl9GTEFHU19TVFJ9IC1MXCIke19kaXJ9XCIiKQogICAgICBlbmRmb3JlYWNoKCkKCiAgICAgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiJHtfQ09NUElMRVJfRkxBR1NfU1RSfSAke19MSU5LRVJfRkxBR1NfU1RSfSIpCiAgICAgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtHU1NfTElCUkFSSUVTfSkKICAgICAgY2hlY2tfc3ltYm9sX2V4aXN0cygiR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UiICR7X0lOQ0xVREVfTElTVH0gSEFWRV9HU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSkKICAgICAgaWYoTk9UIEhBVkVfR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UpCiAgICAgICAgc2V0KEhBVkVfT0xEX0dTU01JVCBPTikKICAgICAgZW5kaWYoKQoKICAgIGVuZGlmKCkKCiAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7R1NTX0lOQ0xVREVfRElSfSkKICAgIGxpbmtfZGlyZWN0b3JpZXMoJHtHU1NfTElOS19ESVJFQ1RPUklFU30pCiAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAke0dTU19DT01QSUxFUl9GTEFHU30iKQogICAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU30gJHtHU1NfTElOS0VSX0ZMQUdTfSIpCiAgICBzZXQoQ01BS0VfRVhFX0xJTktFUl9GTEFHUyAiJHtDTUFLRV9FWEVfTElOS0VSX0ZMQUdTfSAke0dTU19MSU5LRVJfRkxBR1N9IikKICAgIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke0dTU19MSUJSQVJJRVN9KQoKICBlbHNlKCkKICAgIG1lc3NhZ2UoV0FSTklORyAiR1NTQVBJIHN1cHBvcnQgaGFzIGJlZW4gcmVxdWVzdGVkIGJ1dCBubyBzdXBwb3J0aW5nIGxpYnJhcmllcyBmb3VuZC4gU2tpcHBpbmcuIikKICBlbmRpZigpCmVuZGlmKCkKCm9wdGlvbihFTkFCTEVfVU5JWF9TT0NLRVRTICJEZWZpbmUgaWYgeW91IHdhbnQgVW5peCBkb21haW4gc29ja2V0cyBzdXBwb3J0IiBPTikKaWYoRU5BQkxFX1VOSVhfU09DS0VUUykKICBpbmNsdWRlKENoZWNrU3RydWN0SGFzTWVtYmVyKQogIGNoZWNrX3N0cnVjdF9oYXNfbWVtYmVyKCJzdHJ1Y3Qgc29ja2FkZHJfdW4iIHN1bl9wYXRoICJzeXMvdW4uaCIgVVNFX1VOSVhfU09DS0VUUykKZWxzZSgpCiAgdW5zZXQoVVNFX1VOSVhfU09DS0VUUyBDQUNIRSkKZW5kaWYoKQoKIyBDaGVjayBmb3IgaGVhZGVyIGZpbGVzCmlmKE5PVCBVTklYKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbmRvd3MuaCIgICAgICBIQVZFX1dJTkRPV1NfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3aW5zb2NrLmgiICAgICAgSEFWRV9XSU5TT0NLX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid3MydGNwaXAuaCIgICAgIEhBVkVfV1MyVENQSVBfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3aW5zb2NrMi5oIiAgICAgSEFWRV9XSU5TT0NLMl9IKQplbmRpZihOT1QgVU5JWCkKCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGlvLmgiICAgICAgICAgIEhBVkVfU1RESU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaW50dHlwZXMuaCIgICAgICAgSEFWRV9JTlRUWVBFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvZmlsaW8uaCIgICAgICBIQVZFX1NZU19GSUxJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvaW9jdGwuaCIgICAgICBIQVZFX1NZU19JT0NUTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvcGFyYW0uaCIgICAgICBIQVZFX1NZU19QQVJBTV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvcG9sbC5oIiAgICAgICBIQVZFX1NZU19QT0xMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9yZXNvdXJjZS5oIiAgIEhBVkVfU1lTX1JFU09VUkNFX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zZWxlY3QuaCIgICAgIEhBVkVfU1lTX1NFTEVDVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvc29ja2V0LmgiICAgICBIQVZFX1NZU19TT0NLRVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3NvY2tpby5oIiAgICAgSEFWRV9TWVNfU09DS0lPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zdGF0LmgiICAgICAgIEhBVkVfU1lTX1NUQVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3RpbWUuaCIgICAgICAgSEFWRV9TWVNfVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdHlwZXMuaCIgICAgICBIQVZFX1NZU19UWVBFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdWlvLmgiICAgICAgICBIQVZFX1NZU19VSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3VuLmgiICAgICAgICAgSEFWRV9TWVNfVU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3V0aW1lLmgiICAgICAgSEFWRV9TWVNfVVRJTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYWxsb2NhLmgiICAgICAgICAgSEFWRV9BTExPQ0FfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXJwYS9pbmV0LmgiICAgICAgSEFWRV9BUlBBX0lORVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXJwYS90ZnRwLmgiICAgICAgSEFWRV9BUlBBX1RGVFBfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXNzZXJ0LmgiICAgICAgICAgSEFWRV9BU1NFUlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiY3J5cHRvLmgiICAgICAgICAgSEFWRV9DUllQVE9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZGVzLmgiICAgICAgICAgICAgSEFWRV9ERVNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZXJyLmgiICAgICAgICAgICAgSEFWRV9FUlJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZXJybm8uaCIgICAgICAgICAgSEFWRV9FUlJOT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJmY250bC5oIiAgICAgICAgICBIQVZFX0ZDTlRMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlkbi1mcmVlLmgiICAgICAgIEhBVkVfSUROX0ZSRUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWZhZGRycy5oIiAgICAgICAgSEFWRV9JRkFERFJTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlvLmgiICAgICAgICAgICAgIEhBVkVfSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgia3JiLmgiICAgICAgICAgICAgSEFWRV9LUkJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGliZ2VuLmgiICAgICAgICAgSEFWRV9MSUJHRU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGltaXRzLmgiICAgICAgICAgSEFWRV9MSU1JVFNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibG9jYWxlLmgiICAgICAgICAgSEFWRV9MT0NBTEVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0L2lmLmgiICAgICAgICAgSEFWRV9ORVRfSUZfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0ZGIuaCIgICAgICAgICAgSEFWRV9ORVREQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRpbmV0L2luLmgiICAgICBIQVZFX05FVElORVRfSU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0aW5ldC90Y3AuaCIgICAgSEFWRV9ORVRJTkVUX1RDUF9IKQoKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicGVtLmgiICAgICAgICAgICAgSEFWRV9QRU1fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicG9sbC5oIiAgICAgICAgICAgSEFWRV9QT0xMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInB3ZC5oIiAgICAgICAgICAgIEhBVkVfUFdEX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInJzYS5oIiAgICAgICAgICAgIEhBVkVfUlNBX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNldGptcC5oIiAgICAgICAgIEhBVkVfU0VUSk1QX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNndHR5LmgiICAgICAgICAgIEhBVkVfU0dUVFlfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic2lnbmFsLmgiICAgICAgICAgSEFWRV9TSUdOQUxfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3NsLmgiICAgICAgICAgICAgSEFWRV9TU0xfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkYm9vbC5oIiAgICAgICAgSEFWRV9TVERCT09MX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGludC5oIiAgICAgICAgIEhBVkVfU1RESU5UX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGlvLmgiICAgICAgICAgIEhBVkVfU1RESU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkbGliLmgiICAgICAgICAgSEFWRV9TVERMSUJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RyaW5nLmgiICAgICAgICAgSEFWRV9TVFJJTkdfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RyaW5ncy5oIiAgICAgICAgSEFWRV9TVFJJTkdTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0cm9wdHMuaCIgICAgICAgIEhBVkVfU1RST1BUU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0ZXJtaW8uaCIgICAgICAgICBIQVZFX1RFUk1JT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0ZXJtaW9zLmgiICAgICAgICBIQVZFX1RFUk1JT1NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGltZS5oIiAgICAgICAgICAgSEFWRV9USU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRsZC5oIiAgICAgICAgICAgIEhBVkVfVExEX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInVuaXN0ZC5oIiAgICAgICAgIEhBVkVfVU5JU1REX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInV0aW1lLmgiICAgICAgICAgIEhBVkVfVVRJTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgieDUwOS5oIiAgICAgICAgICAgSEFWRV9YNTA5X0gpCgpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwcm9jZXNzLmgiICAgICAgICBIQVZFX1BST0NFU1NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkZGVmLmgiICAgICAgICAgSEFWRV9TVERERUZfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZGxmY24uaCIgICAgICAgICAgSEFWRV9ETEZDTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJtYWxsb2MuaCIgICAgICAgICBIQVZFX01BTExPQ19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJtZW1vcnkuaCIgICAgICAgICBIQVZFX01FTU9SWV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRpbmV0L2lmX2V0aGVyLmgiIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpbnQuaCIgICAgICAgIEhBVkVfU1RESU5UX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNvY2tpby5oIiAgICAgICAgSEFWRV9TT0NLSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3V0c25hbWUuaCIgICBIQVZFX1NZU19VVFNOQU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlkbmEuaCIgICAgICAgICAgSEFWRV9JRE5BX0gpCgoKCmNoZWNrX3R5cGVfc2l6ZShzaXplX3QgIFNJWkVPRl9TSVpFX1QpCmNoZWNrX3R5cGVfc2l6ZShzc2l6ZV90ICBTSVpFT0ZfU1NJWkVfVCkKY2hlY2tfdHlwZV9zaXplKCJsb25nIGxvbmciICBTSVpFT0ZfTE9OR19MT05HKQpjaGVja190eXBlX3NpemUoImxvbmciICBTSVpFT0ZfTE9ORykKY2hlY2tfdHlwZV9zaXplKCJzaG9ydCIgIFNJWkVPRl9TSE9SVCkKY2hlY2tfdHlwZV9zaXplKCJpbnQiICBTSVpFT0ZfSU5UKQpjaGVja190eXBlX3NpemUoIl9faW50NjQiICBTSVpFT0ZfX19JTlQ2NCkKY2hlY2tfdHlwZV9zaXplKCJsb25nIGRvdWJsZSIgIFNJWkVPRl9MT05HX0RPVUJMRSkKY2hlY2tfdHlwZV9zaXplKCJ0aW1lX3QiICBTSVpFT0ZfVElNRV9UKQppZihOT1QgSEFWRV9TSVpFT0ZfU1NJWkVfVCkKICBpZihTSVpFT0ZfTE9ORyBFUVVBTCBTSVpFT0ZfU0laRV9UKQogICAgc2V0KHNzaXplX3QgbG9uZykKICBlbmRpZihTSVpFT0ZfTE9ORyBFUVVBTCBTSVpFT0ZfU0laRV9UKQogIGlmKE5PVCBzc2l6ZV90IEFORCBTSVpFT0ZfX19JTlQ2NCBFUVVBTCBTSVpFT0ZfU0laRV9UKQogICAgc2V0KHNzaXplX3QgX19pbnQ2NCkKICBlbmRpZihOT1Qgc3NpemVfdCBBTkQgU0laRU9GX19fSU5UNjQgRVFVQUwgU0laRU9GX1NJWkVfVCkKZW5kaWYoTk9UIEhBVkVfU0laRU9GX1NTSVpFX1QpCgojIERpZmZlcmVudCBzaXplb2ZzLCBldGMuCgojICAgIGRlZmluZSBDVVJMX1NJWkVPRl9MT05HICAgICAgICA0CiMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgIGxvbmcgbG9uZwojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAibGxkIgojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibGx1IgojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9PRkZfVCAgICAgICAiJWxsZCIKIyAgICBkZWZpbmUgQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCAgOAojICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICBMTAojICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTEwKCnNldChDVVJMX1NJWkVPRl9MT05HICR7U0laRU9GX0xPTkd9KQoKaWYoU0laRU9GX0xPTkcgRVFVQUwgOCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCBsb25nKQogIHNldChDVVJMX1NJWkVPRl9DVVJMX09GRl9UIDgpCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsZCIpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgVUwpCmVuZGlmKFNJWkVPRl9MT05HIEVRVUFMIDgpCgppZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDgpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgImxvbmcgbG9uZyIpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgOCkKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImxsdSIpCiAgc2V0KENVUkxfRk9STUFUX09GRl9UICIlbGxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgVUxMKQplbmRpZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDgpCgppZihOT1QgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAke3NzaXplX3R9KQogIHNldChDVVJMX1NJWkVPRl9DVVJMX09GRl9UICR7U0laRU9GX1NTSVpFX1R9KQogICMgVE9ETzogbmVlZCBhZGp1c3RtZW50IGhlcmUuCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsZCIpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgTFUpCmVuZGlmKE5PVCBDVVJMX1RZUEVPRl9DVVJMX09GRl9UKQoKaWYoSEFWRV9TSVpFT0ZfTE9OR19MT05HKQogIHNldChIQVZFX0xPTkdMT05HIDEpCiAgc2V0KEhBVkVfTEwgMSkKZW5kaWYoSEFWRV9TSVpFT0ZfTE9OR19MT05HKQoKZmluZF9maWxlKFJBTkRPTV9GSUxFIHVyYW5kb20gL2RldikKbWFya19hc19hZHZhbmNlZChSQU5ET01fRklMRSkKCiMgQ2hlY2sgZm9yIHNvbWUgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQKaWYoSEFWRV9MSUJXUzJfMzIpCiAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyB3czJfMzIpCmVsc2VpZihIQVZFX0xJQlNPQ0tFVCkKICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTIHNvY2tldCkKZW5kaWYoKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhiYXNlbmFtZSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0JBU0VOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKHNvY2tldCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU09DS0VUKQpjaGVja19zeW1ib2xfZXhpc3RzKHBvbGwgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUE9MTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZWxlY3QgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFTEVDVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJkdXAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkRVUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJzdHIgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlNUUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJ0b2tfciAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlRPS19SKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmZ0aW1lICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRlRJTUUpCmNoZWNrX3N5bWJvbF9leGlzdHModW5hbWUgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9VTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJjYXNlY21wICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkNBU0VDTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyaWNtcCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJJQ01QKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmNtcGkgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSQ01QSSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJuY21waSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUk5DTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKGFsYXJtICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfQUxBUk0pCmlmKE5PVCBIQVZFX1NUUk5DTVBJKQogIHNldChIQVZFX1NUUkNNUEkpCmVuZGlmKE5PVCBIQVZFX1NUUk5DTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieWFkZHIgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZQUREUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnlhZGRyX3IgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZQUREUl9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHRpbWVvZmRheSAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUVElNRU9GREFZKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfYWRkciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9BRERSKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfbnRvYSAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9OVE9BKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfbnRvYV9yICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9OVE9BX1IpCmNoZWNrX3N5bWJvbF9leGlzdHModGNzZXRhdHRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UQ1NFVEFUVFIpCmNoZWNrX3N5bWJvbF9leGlzdHModGNnZXRhdHRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UQ0dFVEFUVFIpCmNoZWNrX3N5bWJvbF9leGlzdHMocGVycm9yICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoY2xvc2Vzb2NrZXQgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9DTE9TRVNPQ0tFVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXR2YnVmICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFZCVUYpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2lnc2V0am1wICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdTRVRKTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cGFzc19yICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRQQVNTX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RybGNhdCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJMQ0FUKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHB3dWlkICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUUFdVSUQpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0ZXVpZCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRFVUlEKQpjaGVja19zeW1ib2xfZXhpc3RzKHV0aW1lICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVVRJTUUpCmlmKENNQUtFX1VTRV9PUEVOU1NMKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoUkFORF9zdGF0dXMgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9SQU5EX1NUQVRVUykKICBjaGVja19zeW1ib2xfZXhpc3RzKFJBTkRfc2NyZWVuICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUkFORF9TQ1JFRU4pCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhSQU5EX2VnZCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1JBTkRfRUdEKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEgIiR7Q1VSTF9JTkNMVURFU30iCiAgICBIQVZFX0NSWVBUT19DTEVBTlVQX0FMTF9FWF9EQVRBKQogIGlmKEhBVkVfTElCQ1JZUFRPIEFORCBIQVZFX0xJQlNTTCkKICAgIHNldChVU0VfT1BFTlNTTCAxKQogIGVuZGlmKEhBVkVfTElCQ1JZUFRPIEFORCBIQVZFX0xJQlNTTCkKZW5kaWYoQ01BS0VfVVNFX09QRU5TU0wpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ210aW1lX3IgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HTVRJTUVfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhsb2NhbHRpbWVfciAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0xPQ0FMVElNRV9SKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnluYW1lICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnluYW1lX3IgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZTkFNRV9SKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWduYWwgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR05BTF9GVU5DKQpjaGVja19zeW1ib2xfZXhpc3RzKFNJR0FMUk0gICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0lHTkFMX01BQ1JPKQppZihIQVZFX1NJR05BTF9GVU5DIEFORCBIQVZFX1NJR05BTF9NQUNSTykKICBzZXQoSEFWRV9TSUdOQUwgMSkKZW5kaWYoSEFWRV9TSUdOQUxfRlVOQyBBTkQgSEFWRV9TSUdOQUxfTUFDUk8pCmNoZWNrX3N5bWJvbF9leGlzdHModW5hbWUgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RydG9sbCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSVE9MTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhfc3RydG9pNjQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9fU1RSVE9JNjQpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyZXJyb3JfciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRVJST1JfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdpbnRlcnJ1cHQgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdJTlRFUlJVUFQpCmNoZWNrX3N5bWJvbF9leGlzdHMocGVycm9yICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUEVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGZvcmsgICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZPUkspCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0YWRkcmluZm8gICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUQUREUklORk8pCmNoZWNrX3N5bWJvbF9leGlzdHMoZnJlZWFkZHJpbmZvICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlJFRUFERFJJTkZPKQpjaGVja19zeW1ib2xfZXhpc3RzKGZyZWVpZmFkZHJzICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZSRUVJRkFERFJTKQpjaGVja19zeW1ib2xfZXhpc3RzKHBpcGUgICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BJUEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZnRydW5jYXRlICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlRSVU5DQVRFKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHByb3RvYnluYW1lICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFBST1RPQllOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHJsaW1pdCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFJMSU1JVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpZG5fZnJlZSAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JRE5fRlJFRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpZG5hX3N0cmVycm9yICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JRE5BX1NUUkVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKHRsZF9zdHJlcnJvciAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1RMRF9TVFJFUlJPUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXRsb2NhbGUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRVRMT0NBTEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2V0cmxpbWl0ICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUUkxJTUlUKQpjaGVja19zeW1ib2xfZXhpc3RzKGZjbnRsICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZDTlRMKQpjaGVja19zeW1ib2xfZXhpc3RzKGlvY3RsICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lPQ1RMKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldHNvY2tvcHQgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFNPQ0tPUFQpCgojIHN5bWJvbCBleGlzdHMgaW4gd2luMzIsIGJ1dCBmdW5jdGlvbiBkb2VzIG5vdC4KY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGluZXRfcHRvbiBIQVZFX0lORVRfUFRPTikKCiMgc2lnYWN0aW9uIGFuZCBzaWdzZXRqbXAgYXJlIHNwZWNpYWwuIFVzZSBzcGVjaWFsIG1lY2hhbmlzbSBmb3IKIyBkZXRlY3RpbmcgdGhvc2UsIGJ1dCBvbmx5IGlmIHByZXZpb3VzIGF0dGVtcHQgZmFpbGVkLgppZihIQVZFX1NJR05BTF9IKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoc2lnYWN0aW9uICJzaWduYWwuaCIgSEFWRV9TSUdBQ1RJT04pCmVuZGlmKEhBVkVfU0lHTkFMX0gpCgppZihOT1QgSEFWRV9TSUdTRVRKTVApCiAgaWYoSEFWRV9TRVRKTVBfSCkKICAgIGNoZWNrX3N5bWJvbF9leGlzdHMoc2lnc2V0am1wICJzZXRqbXAuaCIgSEFWRV9NQUNST19TSUdTRVRKTVApCiAgICBpZihIQVZFX01BQ1JPX1NJR1NFVEpNUCkKICAgICAgc2V0KEhBVkVfU0lHU0VUSk1QIDEpCiAgICBlbmRpZihIQVZFX01BQ1JPX1NJR1NFVEpNUCkKICBlbmRpZihIQVZFX1NFVEpNUF9IKQplbmRpZihOT1QgSEFWRV9TSUdTRVRKTVApCgojIElmIHRoZXJlIGlzIG5vIHN0cmljbXAoKSwgZG8gbm90IGFsbG93IExEQVAgdG8gcGFyc2UgVVJMcwppZihOT1QgSEFWRV9TVFJJQ01QKQogIHNldChIQVZFX0xEQVBfVVJMX1BBUlNFIDEpCmVuZGlmKE5PVCBIQVZFX1NUUklDTVApCgojIERvIGN1cmwgc3BlY2lmaWMgdGVzdHMKZm9yZWFjaChDVVJMX1RFU1QKICAgIEhBVkVfRkNOVExfT19OT05CTE9DSwogICAgSEFWRV9JT0NUTFNPQ0tFVAogICAgSEFWRV9JT0NUTFNPQ0tFVF9DQU1FTAogICAgSEFWRV9JT0NUTFNPQ0tFVF9DQU1FTF9GSU9OQklPCiAgICBIQVZFX0lPQ1RMU09DS0VUX0ZJT05CSU8KICAgIEhBVkVfSU9DVExfRklPTkJJTwogICAgSEFWRV9JT0NUTF9TSU9DR0lGQUREUgogICAgSEFWRV9TRVRTT0NLT1BUX1NPX05PTkJMT0NLCiAgICBIQVZFX1NPQ0tBRERSX0lONl9TSU42X1NDT1BFX0lECiAgICBUSU1FX1dJVEhfU1lTX1RJTUUKICAgIEhBVkVfT19OT05CTE9DSwogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNQogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNwogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfOAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNV9SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzdfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfMwogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNQogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNgogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfM19SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82X1JFRU5UUkFOVAogICAgSEFWRV9TT0NLTEVOX1QKICAgIEhBVkVfSU5fQUREUl9UCiAgICBIQVZFX0JPT0xfVAogICAgU1REQ19IRUFERVJTCiAgICBSRVRTSUdUWVBFX1RFU1QKICAgIEhBVkVfSU5FVF9OVE9BX1JfREVDTAogICAgSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVAogICAgSEFWRV9HRVRBRERSSU5GTwogICAgSEFWRV9GSUxFX09GRlNFVF9CSVRTCiAgICApCiAgY3VybF9pbnRlcm5hbF90ZXN0KCR7Q1VSTF9URVNUfSkKZW5kZm9yZWFjaChDVVJMX1RFU1QpCmlmKEhBVkVfRklMRV9PRkZTRVRfQklUUykKICBzZXQoX0ZJTEVfT0ZGU0VUX0JJVFMgNjQpCmVuZGlmKEhBVkVfRklMRV9PRkZTRVRfQklUUykKZm9yZWFjaChDVVJMX1RFU1QKICAgIEhBVkVfR0xJQkNfU1RSRVJST1JfUgogICAgSEFWRV9QT1NJWF9TVFJFUlJPUl9SCiAgICApCiAgY3VybF9pbnRlcm5hbF90ZXN0X3J1bigke0NVUkxfVEVTVH0pCmVuZGZvcmVhY2goQ1VSTF9URVNUKQoKIyBDaGVjayBmb3IgcmVlbnRyYW50CmZvcmVhY2goQ1VSTF9URVNUCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82CiAgICBIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UKQogIGlmKE5PVCAke0NVUkxfVEVTVH0pCiAgICBpZigke0NVUkxfVEVTVH1fUkVFTlRSQU5UKQogICAgICBzZXQoTkVFRF9SRUVOVFJBTlQgMSkKICAgIGVuZGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgZW5kaWYoTk9UICR7Q1VSTF9URVNUfSkKZW5kZm9yZWFjaChDVVJMX1RFU1QpCgppZihORUVEX1JFRU5UUkFOVCkKICBmb3JlYWNoKENVUkxfVEVTVAogICAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81CiAgICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzcKICAgICAgSEFWRV9HRVRIT1NUQllBRERSX1JfOAogICAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zCiAgICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzUKICAgICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNikKICAgIHNldCgke0NVUkxfVEVTVH0gMCkKICAgIGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgICAgIHNldCgke0NVUkxfVEVTVH0gMSkKICAgIGVuZGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgZW5kZm9yZWFjaChDVVJMX1RFU1QpCmVuZGlmKE5FRURfUkVFTlRSQU5UKQoKaWYoSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVCkKICBzZXQoSEFWRV9JTkVUX05UT0FfUl9ERUNMIDEpCiAgc2V0KE5FRURfUkVFTlRSQU5UIDEpCmVuZGlmKEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQpCgojIFNvbWUgb3RoZXIgbWlub3IgdGVzdHMKCmlmKE5PVCBIQVZFX0lOX0FERFJfVCkKICBzZXQoaW5fYWRkcl90ICJ1bnNpZ25lZCBsb25nIikKZW5kaWYoTk9UIEhBVkVfSU5fQUREUl9UKQoKIyBGaXggbGlieiAvIHpsaWIuaAoKaWYoTk9UIENVUkxfU1BFQ0lBTF9MSUJaKQogIGlmKE5PVCBIQVZFX0xJQlopCiAgICBzZXQoSEFWRV9aTElCX0ggMCkKICBlbmRpZihOT1QgSEFWRV9MSUJaKQoKICBpZihOT1QgSEFWRV9aTElCX0gpCiAgICBzZXQoSEFWRV9MSUJaIDApCiAgZW5kaWYoTk9UIEhBVkVfWkxJQl9IKQplbmRpZihOT1QgQ1VSTF9TUEVDSUFMX0xJQlopCgppZihfRklMRV9PRkZTRVRfQklUUykKICBzZXQoX0ZJTEVfT0ZGU0VUX0JJVFMgNjQpCmVuZGlmKF9GSUxFX09GRlNFVF9CSVRTKQpzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiKQpzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2N1cmwvY3VybC5oIikKY2hlY2tfdHlwZV9zaXplKCJjdXJsX29mZl90IiBTSVpFT0ZfQ1VSTF9PRkZfVCkKc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMpCnNldChDTUFLRV9SRVFVSVJFRF9GTEFHUykKCgojIENoZWNrIGZvciBub25ibG9ja2luZwpzZXQoSEFWRV9ESVNBQkxFRF9OT05CTE9DS0lORyAxKQppZihIQVZFX0ZJT05CSU8gT1IKICAgIEhBVkVfSU9DVExTT0NLRVQgT1IKICAgIEhBVkVfSU9DVExTT0NLRVRfQ0FTRSBPUgogICAgSEFWRV9PX05PTkJMT0NLKQogIHNldChIQVZFX0RJU0FCTEVEX05PTkJMT0NLSU5HKQplbmRpZihIQVZFX0ZJT05CSU8gT1IKICBIQVZFX0lPQ1RMU09DS0VUIE9SCiAgSEFWRV9JT0NUTFNPQ0tFVF9DQVNFIE9SCiAgSEFWRV9PX05PTkJMT0NLKQoKaWYoUkVUU0lHVFlQRV9URVNUKQogIHNldChSRVRTSUdUWVBFIHZvaWQpCmVsc2UoUkVUU0lHVFlQRV9URVNUKQogIHNldChSRVRTSUdUWVBFIGludCkKZW5kaWYoUkVUU0lHVFlQRV9URVNUKQoKaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgQU5EIEFQUExFKQogIGluY2x1ZGUoQ2hlY2tDQ29tcGlsZXJGbGFnKQogIGNoZWNrX2NfY29tcGlsZXJfZmxhZygtV25vLWxvbmctZG91YmxlIEhBVkVfQ19GTEFHX1dub19sb25nX2RvdWJsZSkKICBpZihIQVZFX0NfRkxBR19Xbm9fbG9uZ19kb3VibGUpCiAgICAjIFRoZSBNYWMgdmVyc2lvbiBvZiBHQ0Mgd2FybnMgYWJvdXQgdXNlIG9mIGxvbmcgZG91YmxlLiAgRGlzYWJsZSBpdC4KICAgIGdldF9zb3VyY2VfZmlsZV9wcm9wZXJ0eShNUFJJTlRGX0NPTVBJTEVfRkxBR1MgbXByaW50Zi5jIENPTVBJTEVfRkxBR1MpCiAgICBpZihNUFJJTlRGX0NPTVBJTEVfRkxBR1MpCiAgICAgIHNldChNUFJJTlRGX0NPTVBJTEVfRkxBR1MgIiR7TVBSSU5URl9DT01QSUxFX0ZMQUdTfSAtV25vLWxvbmctZG91YmxlIikKICAgIGVsc2UoTVBSSU5URl9DT01QSUxFX0ZMQUdTKQogICAgICBzZXQoTVBSSU5URl9DT01QSUxFX0ZMQUdTICItV25vLWxvbmctZG91YmxlIikKICAgIGVuZGlmKE1QUklOVEZfQ09NUElMRV9GTEFHUykKICAgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyhtcHJpbnRmLmMgUFJPUEVSVElFUwogICAgICBDT01QSUxFX0ZMQUdTICR7TVBSSU5URl9DT01QSUxFX0ZMQUdTfSkKICBlbmRpZihIQVZFX0NfRkxBR19Xbm9fbG9uZ19kb3VibGUpCmVuZGlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIEFORCBBUFBMRSkKCmlmKEhBVkVfU09DS0xFTl9UKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCAic29ja2xlbl90IikKICBpZihXSU4zMikKICAgIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICJ3aW5zb2NrMi5oO3dzMnRjcGlwLmgiKQogIGVsc2VpZihIQVZFX1NZU19TT0NLRVRfSCkKICAgIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICJzeXMvc29ja2V0LmgiKQogIGVuZGlmKCkKICBjaGVja190eXBlX3NpemUoInNvY2tsZW5fdCIgQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QpCiAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMpCiAgaWYoTk9UIEhBVkVfQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QpCiAgICBtZXNzYWdlKEZBVEFMX0VSUk9SCiAgICAgIkNoZWNrIGZvciBzaXplb2Ygc29ja2xlbl90IGZhaWxlZCwgc2VlIENNYWtlRmlsZXMvQ01ha2Vycm9yLmxvZyIpCiAgZW5kaWYoKQplbHNlKCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgaW50KQogIHNldChDVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCAke1NJWkVPRl9JTlR9KQplbmRpZigpCgojIFRPRE8gdGVzdCB3aGljaCBvZiB0aGVzZSBoZWFkZXJzIGFyZSByZXF1aXJlZCBmb3IgdGhlIHR5cGVkZWZzIHVzZWQgaW4gY3VybGJ1aWxkLmgKaWYoV0lOMzIpCiAgc2V0KENVUkxfUFVMTF9XUzJUQ1BJUF9IICR7SEFWRV9XUzJUQ1BJUF9IfSkKZWxzZSgpCiAgc2V0KENVUkxfUFVMTF9TWVNfVFlQRVNfSCAke0hBVkVfU1lTX1RZUEVTX0h9KQogIHNldChDVVJMX1BVTExfU1lTX1NPQ0tFVF9IICR7SEFWRV9TWVNfU09DS0VUX0h9KQogIHNldChDVVJMX1BVTExfU1lTX1BPTExfSCAke0hBVkVfU1lTX1BPTExfSH0pCmVuZGlmKCkKc2V0KENVUkxfUFVMTF9TVERJTlRfSCAke0hBVkVfU1RESU5UX0h9KQpzZXQoQ1VSTF9QVUxMX0lOVFRZUEVTX0ggJHtIQVZFX0lOVFRZUEVTX0h9KQoKaW5jbHVkZShDTWFrZS9PdGhlclRlc3RzLmNtYWtlKQoKYWRkX2RlZmluaXRpb25zKC1ESEFWRV9DT05GSUdfSCkKCiMgRm9yIHdpbmRvd3MsIGRvIG5vdCBhbGxvdyB0aGUgY29tcGlsZXIgdG8gdXNlIGRlZmF1bHQgdGFyZ2V0IChWaXN0YSkuCmlmKFdJTjMyKQogIGFkZF9kZWZpbml0aW9ucygtRF9XSU4zMl9XSU5OVD0weDA1MDEpCmVuZGlmKFdJTjMyKQoKaWYoTVNWQykKICBhZGRfZGVmaW5pdGlvbnMoLURfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgLURfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFKQplbmRpZihNU1ZDKQoKIyBVZ2x5IChidXQgZnVuY3Rpb25hbCkgd2F5IHRvIGluY2x1ZGUgIk1ha2VmaWxlLmluYyIgYnkgdHJhbnNmb3JtaW5nIGl0ICg9IHJlZ2VuZXJhdGUgaXQpLgpmdW5jdGlvbihUUkFOU0ZPUk1fTUFLRUZJTEVfSU5DIElOUFVUX0ZJTEUgT1VUUFVUX0ZJTEUpCiAgZmlsZShSRUFEICR7SU5QVVRfRklMRX0gTUFLRUZJTEVfSU5DX1RFWFQpCiAgc3RyaW5nKFJFUExBQ0UgIiQodG9wX3NyY2RpcikiICAgIlwke0NVUkxfU09VUkNFX0RJUn0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQogIHN0cmluZyhSRVBMQUNFICIkKHRvcF9idWlsZGRpcikiICJcJHtDVVJMX0JJTkFSWV9ESVJ9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKCiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlxcXFxcbiIgIqchpyIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIihbYS16QS1aX11bYS16QS1aMC05X10qKVtcdCBdKj1bXHQgXSooW15cbl0qKSIgIlNFVChcXDEgXFwyKSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCiAgc3RyaW5nKFJFUExBQ0UgIqchpyIgIlxuIiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKCiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlxcJFxcKChbYS16QS1aX11bYS16QS1aMC05X10qKVxcKSIgIlwke1xcMX0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KSAgICAjIFJlcGxhY2UgJCgpIHdpdGggJHt9CiAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIkAoW2EtekEtWl9dW2EtekEtWjAtOV9dKilAIiAiXCR7XFwxfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pICAgICMgUmVwbGFjZSBAQCB3aXRoICR7fSwgZXZlbiBpZiB0aGF0IG1heSBub3QgYmUgcmVhZCBieSBDTWFrZSBzY3JpcHRzLgogIGZpbGUoV1JJVEUgJHtPVVRQVVRfRklMRX0gJHtNQUtFRklMRV9JTkNfVEVYVH0pCgplbmRmdW5jdGlvbigpCgphZGRfc3ViZGlyZWN0b3J5KGxpYikKaWYoQlVJTERfQ1VSTF9FWEUpCiAgYWRkX3N1YmRpcmVjdG9yeShzcmMpCmVuZGlmKCkKaWYoQlVJTERfQ1VSTF9URVNUUykKICBhZGRfc3ViZGlyZWN0b3J5KHRlc3RzKQplbmRpZigpCgojIFRPRE8gc3VwcG9ydCBHTlVUTFMsIE5TUywgUE9MQVJTU0wsIEFYVExTLCBDWUFTU0wsIFdJTlNTTCwgREFSV0lOU1NMCmlmKFVTRV9PUEVOU1NMKQogIHNldChTU0xfRU5BQkxFRCAxKQplbmRpZigpCgojIEhlbHBlciB0byBwb3B1bGF0ZSBhIGxpc3QgKF9pdGVtcykgd2l0aCBhIGxhYmVsIHdoZW4gY29uZGl0aW9ucyAodGhlIHJlbWFpbmluZwojIGFyZ3MpIGFyZSBzYXRpc2ZpZWQKZnVuY3Rpb24oX2FkZF9pZiBsYWJlbCkKICAjIFRPRE8gbmVlZCB0byBkaXNhYmxlIHBvbGljeSBDTVAwMDU0IChDTWFrZSAzLjEpIHRvIGFsbG93IHRoaXMgaW5kaXJlY3Rpb24KICBpZigke0FSR059KQogICAgc2V0KF9pdGVtcyAke19pdGVtc30gIiR7bGFiZWx9IiBQQVJFTlRfU0NPUEUpCiAgZW5kaWYoKQplbmRmdW5jdGlvbigpCgojIENsZWFyIGxpc3QgYW5kIHRyeSB0byBkZXRlY3QgYXZhaWxhYmxlIGZlYXR1cmVzCnNldChfaXRlbXMpCl9hZGRfaWYoIlNTTCIgICAgICAgICAgIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJJUHY2IiAgICAgICAgICBFTkFCTEVfSVBWNikKX2FkZF9pZigidW5peC1zb2NrZXRzIiAgVVNFX1VOSVhfU09DS0VUUykKX2FkZF9pZigibGlieiIgICAgICAgICAgSEFWRV9MSUJaKQpfYWRkX2lmKCJBc3luY2hETlMiICAgICBVU0VfQVJFUyBPUiBVU0VfVEhSRUFEU19QT1NJWCkKX2FkZF9pZigiSUROIiAgICAgICAgICAgSEFWRV9MSUJJRE4pCiMgVE9ETyBTU1AxIChXaW5TU0wpIGNoZWNrIGlzIG1pc3NpbmcKX2FkZF9pZigiU1NQSSIgICAgICAgICAgVVNFX1dJTkRPV1NfU1NQSSkKX2FkZF9pZigiR1NTLUFQSSIgICAgICAgSEFWRV9HU1NfQVBJKQojIFRPRE8gU1NQMSBtaXNzaW5nIGZvciBTUE5FR08KX2FkZF9pZigiU1BORUdPIiAgICAgICAgTk9UIENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCBBTkQKICAgICAgICAgICAgICAgICAgICAgICAgKEhBVkVfR1NTX0FQSSBPUiBVU0VfV0lORE9XU19TU1BJKSkKX2FkZF9pZigiS2VyYmVyb3MiICAgICAgTk9UIENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCBBTkQKICAgICAgICAgICAgICAgICAgICAgICAgKEhBVkVfR1NTX0FQSSBPUiBVU0VfV0lORE9XU19TU1BJKSkKIyBOVExNIHN1cHBvcnQgcmVxdWlyZXMgY3J5cHRvIGZ1bmN0aW9uIGFkYXB0aW9ucyBmcm9tIHZhcmlvdXMgU1NMIGxpYnMKIyBUT0RPIGFsdGVybmF0aXZlIFNTTCBsaWJzIHRlc3RzIGZvciBTU1AxLCBHTlVUTFMsIE5TUywgREFSV0lOU1NMCmlmKE5PVCBDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEggQU5EIChVU0VfT1BFTlNTTCBPUgogICBVU0VfV0lORE9XU19TU1BJIE9SIEdOVVRMU19FTkFCTEVEIE9SIE5TU19FTkFCTEVEIE9SIERBUldJTlNTTF9FTkFCTEVEKSkKICBfYWRkX2lmKCJOVExNIiAgICAgICAgMSkKICAjIFRPRE8gbWlzc2luZyBvcHRpb24gKGF1dG9jb25mOiAtLWVuYWJsZS1udGxtLXdiKQogIF9hZGRfaWYoIk5UTE1fV0IiICAgICBOT1QgQ1VSTF9ESVNBQkxFX0hUVFAgQU5EIE5UTE1fV0JfRU5BQkxFRCkKZW5kaWYoKQojIFRPRE8gbWlzc2luZyBvcHRpb24gKC0tZW5hYmxlLXRscy1zcnApLCBkZXBlbmRzIG9uIEdOVVRMU19TUlAvT1BFTlNTTF9TUlAKX2FkZF9pZigiVExTLVNSUCIgICAgICAgVVNFX1RMU19TUlApCiMgVE9ETyBvcHRpb24gLS13aXRoLW5naHR0cDIgdGVzdHMgZm9yIG5naHR0cDIgbGliIGFuZCBuZ2h0dHAyL25naHR0cDIuaCBoZWFkZXIKX2FkZF9pZigiSFRUUDIiICAgICAgICAgVVNFX05HSFRUUDIpCnN0cmluZyhSRVBMQUNFICI7IiAiICIgU1VQUE9SVF9GRUFUVVJFUyAiJHtfaXRlbXN9IikKbWVzc2FnZShTVEFUVVMgIkVuYWJsZWQgZmVhdHVyZXM6ICR7U1VQUE9SVF9GRUFUVVJFU30iKQoKIyBDbGVhciBsaXN0IGFuZCB0cnkgdG8gZGV0ZWN0IGF2YWlsYWJsZSBwcm90b2NvbHMKc2V0KF9pdGVtcykKX2FkZF9pZigiSFRUUCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9IVFRQKQpfYWRkX2lmKCJIVFRQUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0hUVFAgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJGVFAiICAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0ZUUCkKX2FkZF9pZigiRlRQUyIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9GVFAgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJGSUxFIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0ZJTEUpCl9hZGRfaWYoIlRFTE5FVCIgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfVEVMTkVUKQpfYWRkX2lmKCJMREFQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0xEQVApCiMgQ1VSTF9ESVNBQkxFX0xEQVAgaW1wbGllcyBDVVJMX0RJU0FCTEVfTERBUFMKIyBUT0RPIGNoZWNrIEhBVkVfTERBUF9TU0wgKGluIGF1dG9jb25mIHRoaXMgaXMgZW5hYmxlZCB3aXRoIC0tZW5hYmxlLWxkYXBzKQpfYWRkX2lmKCJMREFQUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0xEQVBTIEFORAogICAgICAgICAgICAgICAgICAgICAgICAoKFVTRV9PUEVOTERBUCBBTkQgU1NMX0VOQUJMRUQpIE9SCiAgICAgICAgICAgICAgICAgICAgICAgIChOT1QgVVNFX09QRU5MREFQIEFORCBIQVZFX0xEQVBfU1NMKSkpCl9hZGRfaWYoIkRJQ1QiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfRElDVCkKX2FkZF9pZigiVEZUUCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9URlRQKQpfYWRkX2lmKCJHT1BIRVIiICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0dPUEhFUikKX2FkZF9pZigiUE9QMyIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9QT1AzKQpfYWRkX2lmKCJQT1AzUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1BPUDMgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJJTUFQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0lNQVApCl9hZGRfaWYoIklNQVBTIiAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfSU1BUCBBTkQgU1NMX0VOQUJMRUQpCl9hZGRfaWYoIlNNVFAiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfU01UUCkKX2FkZF9pZigiU01UUFMiICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9TTVRQIEFORCBTU0xfRU5BQkxFRCkKX2FkZF9pZigiU0NQIiAgICAgICAgICAgVVNFX0xJQlNTSDIpCl9hZGRfaWYoIlNGVFAiICAgICAgICAgIFVTRV9MSUJTU0gyKQpfYWRkX2lmKCJSVFNQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1JUU1ApCl9hZGRfaWYoIlJUTVAiICAgICAgICAgIFVTRV9MSUJSVE1QKQpsaXN0KFNPUlQgX2l0ZW1zKQpzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIFNVUFBPUlRfUFJPVE9DT0xTICIke19pdGVtc30iKQptZXNzYWdlKFNUQVRVUyAiRW5hYmxlZCBwcm90b2NvbHM6ICR7U1VQUE9SVF9QUk9UT0NPTFN9IikKCiMgY3VybC1jb25maWcgbmVlZHMgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRvIGJlIHNldC4Kc2V0KENDICAgICAgICAgICAgICAgICAgICAgICIke0NNQUtFX0NfQ09NUElMRVJ9IikKIyBUT0RPIHByb2JhYmx5IHB1dCBhIC1ELi4uIG9wdGlvbnMgaGVyZT8Kc2V0KENPTkZJR1VSRV9PUFRJT05TICAgICAgICIiKQojIFRPRE8gd2hlbiB0byBzZXQgIi1EQ1VSTF9TVEFUSUNMSUIiIGZvciBDUFBGTEFHX0NVUkxfU1RBVElDTElCPwpzZXQoQ1BQRkxBR19DVVJMX1NUQVRJQ0xJQiAgIiIpCiMgVE9ETyBuZWVkIHRvIHNldCB0aGlzIChzZWUgQ1VSTF9DSEVDS19DQV9CVU5ETEUgaW4gYWNpbmNsdWRlLm00KQpzZXQoQ1VSTF9DQV9CVU5ETEUgICAgICAgICAgIiIpCnNldChDVVJMVkVSU0lPTiAgICAgICAgICAgICAiJHtDVVJMX1ZFUlNJT059IikKc2V0KEVOQUJMRV9TSEFSRUQgICAgICAgICAgICJ5ZXMiKQppZihDVVJMX1NUQVRJQ0xJQikKICAjIEJyb2tlbjogTElCQ1VSTF9MSUJTIGJlbG93OyAuYSBsaWIgaXMgbm90IGJ1aWx0CiAgbWVzc2FnZShXQVJOSU5HICJTdGF0aWMgbGlua2luZyBpcyBicm9rZW4hIikKICBzZXQoRU5BQkxFX1NUQVRJQyAgICAgICAgICJubyIpCmVsc2UoKQogIHNldChFTkFCTEVfU1RBVElDICAgICAgICAgIm5vIikKZW5kaWYoKQpzZXQoZXhlY19wcmVmaXggICAgICAgICAgICAgIlwke3ByZWZpeH0iKQpzZXQoaW5jbHVkZWRpciAgICAgICAgICAgICAgIlwke3ByZWZpeH0vaW5jbHVkZSIpCnNldChMREZMQUdTICAgICAgICAgICAgICAgICAiJHtDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTfSIpCnNldChMSUJDVVJMX0xJQlMgICAgICAgICAgICAiIikKc2V0KGxpYmRpciAgICAgICAgICAgICAgICAgICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS9saWIiKQojIFRPRE8gQ1VSTF9MSUJTIGFsc28gY29udGFpbnMgYWJzb2x1dGUgcGF0aHMgd2hpY2ggZG9uJ3Qgd29yayB3aXRoIHN0YXRpYyAtbC4uLgpmb3JlYWNoKF9saWIgJHtDTUFLRV9DX0lNUExJQ0lUX0xJTktfTElCUkFSSUVTfSAke0NVUkxfTElCU30pCiAgc2V0KExJQkNVUkxfTElCUyAgICAgICAgICAiJHtMSUJDVVJMX0xJQlN9IC1sJHtfbGlifSIpCmVuZGZvcmVhY2goKQojICJhIiAoTGludXgpIG9yICJsaWIiIChXaW5kb3dzKQpzdHJpbmcoUkVQTEFDRSAiLiIgIiIgbGliZXh0ICIke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1NVRkZJWH0iKQpzZXQocHJlZml4ICAgICAgICAgICAgICAgICAgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9IikKIyBTZXQgdGhpcyB0byAieWVzIiB0byBhcHBlbmQgYWxsIGxpYnJhcmllcyBvbiB3aGljaCAtbGN1cmwgaXMgZGVwZW5kZW50CnNldChSRVFVSVJFX0xJQl9ERVBTICAgICAgICAibm8iKQojIFNVUFBPUlRfRkVBVFVSRVMKIyBTVVBQT1JUX1BST1RPQ09MUwpzZXQoVkVSU0lPTk5VTSAgICAgICAgICAgICAgIiR7Q1VSTF9WRVJTSU9OX05VTX0iKQoKIyBGaW5hbGx5IGdlbmVyYXRlIGEgImN1cmwtY29uZmlnIiBtYXRjaGluZyB0aGlzIGNvbmZpZwpjb25maWd1cmVfZmlsZSgiJHtDVVJMX1NPVVJDRV9ESVJ9L2N1cmwtY29uZmlnLmluIgogICAgICAgICAgICAgICAiJHtDVVJMX0JJTkFSWV9ESVJ9L2N1cmwtY29uZmlnIiBAT05MWSkKaW5zdGFsbChGSUxFUyAiJHtDTUFLRV9CSU5BUllfRElSfS9jdXJsLWNvbmZpZyIKICAgICAgICBERVNUSU5BVElPTiBiaW4KICAgICAgICBQRVJNSVNTSU9OUwogICAgICAgICAgT1dORVJfUkVBRCBPV05FUl9XUklURSBPV05FUl9FWEVDVVRFCiAgICAgICAgICBHUk9VUF9SRUFEIEdST1VQX0VYRUNVVEUKICAgICAgICAgIFdPUkxEX1JFQUQgV09STERfRVhFQ1VURSkKCiMgRmluYWxseSBnZW5lcmF0ZSBhIHBrZy1jb25maWcgZmlsZSBtYXRjaGluZyB0aGlzIGNvbmZpZwpjb25maWd1cmVfZmlsZSgiJHtDVVJMX1NPVVJDRV9ESVJ9L2xpYmN1cmwucGMuaW4iCiAgICAgICAgICAgICAgICIke0NVUkxfQklOQVJZX0RJUn0vbGliY3VybC5wYyIgQE9OTFkpCmluc3RhbGwoRklMRVMgIiR7Q01BS0VfQklOQVJZX0RJUn0vbGliY3VybC5wYyIKICAgICAgICBERVNUSU5BVElPTiBsaWIvcGtnY29uZmlnKQoKIyBUaGlzIG5lZWRzIHRvIGJlIHJ1biB2ZXJ5IGxhc3Qgc28gb3RoZXIgcGFydHMgb2YgdGhlIHNjcmlwdHMgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoaXMuCmlmKE5PVCBDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFKQogIHNldChDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFIDEgQ0FDSEUgSU5URVJOQUwgIkZsYWcgdG8gdHJhY2sgd2hldGhlciB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHJ1bm5pbmcgQ01ha2Ugb3IgaWYgQ01ha2UgaGFzIGJlZW4gY29uZmlndXJlZCBiZWZvcmUiKQplbmRpZigpCgojIEluc3RhbGxhdGlvbi4KIyBGaXJzdCwgaW5zdGFsbCBnZW5lcmF0ZWQgY3VybGJ1aWxkLmgKaW5zdGFsbChGSUxFUyAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2luY2x1ZGUvY3VybC9jdXJsYnVpbGQuaCIKICAgIERFU1RJTkFUSU9OIGluY2x1ZGUvY3VybCApCiMgTmV4dCwgaW5zdGFsbCBvdGhlciBoZWFkZXJzIGV4Y2x1ZGluZyBjdXJsYnVpbGQuaAppbnN0YWxsKERJUkVDVE9SWSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2luY2x1ZGUvY3VybCIKICAgIERFU1RJTkFUSU9OIGluY2x1ZGUKICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIKICAgIFBBVFRFUk4gImN1cmxidWlsZC5oIiBFWENMVURFKQoKCiMgV29ya2Fyb3VuZCBmb3IgTVNWUzEwIHRvIGF2b2lkIHRoZSBEaWFsb2cgSGVsbAojIEZJWE1FOiBUaGlzIGNvdWxkIGJlIHJlbW92ZWQgd2l0aCBmdXR1cmUgdmVyc2lvbiBvZiBDTWFrZS4KaWYoTVNWQ19WRVJTSU9OIEVRVUFMIDE2MDApCiAgc2V0KENVUkxfU0xOX0ZJTEVOQU1FICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vQ1VSTC5zbG4iKQogIGlmKEVYSVNUUyAiJHtDVVJMX1NMTl9GSUxFTkFNRX0iKQogICAgZmlsZShBUFBFTkQgIiR7Q1VSTF9TTE5fRklMRU5BTUV9IiAiXG4jIFRoaXMgc2hvdWxkIGJlIHJlZ2VuZXJhdGVkIVxuIikKICBlbmRpZigpCmVuZGlmKCkK