IyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KIyAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKIwojIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTUsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAojIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKIyBhcmUgYWxzbyBhdmFpbGFibGUgYXQgaHR0cHM6Ly9jdXJsLmhheHguc2UvZG9jcy9jb3B5cmlnaHQuaHRtbC4KIwojIFlvdSBtYXkgb3B0IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSBhbmQvb3Igc2VsbAojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwojIGZ1cm5pc2hlZCB0byBkbyBzbywgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDT1BZSU5HIGZpbGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCiMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBjVVJML2xpYmN1cmwgQ01ha2Ugc2NyaXB0CiMgYnkgVGV0ZXRlc3QgYW5kIFN1a2VuZGVyIChCZW5vaXQgTmVpbCkKCiMgVE9ETzoKIyBUaGUgb3V0cHV0IC5zbyBmaWxlIGxhY2tzIHRoZSBzb25hbWUgbnVtYmVyIHdoaWNoIHdlIGN1cnJlbnRseSBoYXZlIHdpdGhpbiB0aGUgbGliL01ha2VmaWxlLmFtIGZpbGUKIyBBZGQgZnVsbCAoNCBvciA1IGxpYnMpIFNTTCBzdXBwb3J0CiMgQWRkIElOU1RBTEwgdGFyZ2V0IChFWFRSQV9ESVNUIHZhcmlhYmxlcyBpbiBNYWtlZmlsZS5hbSBtYXkgYmUgbW92ZWQgdG8gTWFrZWZpbGUuaW5jIHNvIHRoYXQgQ01ha2UvQ1BhY2sgaXMgYXdhcmUgb2Ygd2hhdCdzIHRvIGluY2x1ZGUpLgojIEFkZCBDVGVzdHMoPykKIyBDaGVjayBvbiBhbGwgcG9zc2libGUgcGxhdGZvcm1zCiMgVGVzdCB3aXRoIGFzIG1hbnkgY29uZmlndXJhdGlvbnMgcG9zc2libGUgKFdpdGggb3Igd2l0aG91dCBhbnkgb3B0aW9uKQojIENyZWF0ZSBzY3JpcHRzIHRoYXQgaGVscCBrZWVwaW5nIHRoZSBDTWFrZSBidWlsZCBzeXN0ZW0gdXAgdG8gZGF0ZSAodG8gcmVkdWNlIG1haW50ZW5hbmNlKS4gQWNjb3JkaW5nIHRvIFRldGV0ZXN0OgojICAtIGxpc3RzIG9mIGhlYWRlcnMgdGhhdCAnY29uZmlndXJlJyBjaGVja3MgZm9yOwojICAtIGN1cmwtc3BlY2lmaWMgdGVzdHMgKHRoZSBvbmVzIHRoYXQgYXJlIGluIG00L2N1cmwtKi5tNCBmaWxlcyk7CiMgIC0gKG1vc3Qgb2J2aW91cyB0aGluZzopIGN1cmwgdmVyc2lvbiBudW1iZXJzLgojIEFkZCBkb2N1bWVudGF0aW9uIHN1YnByb2plY3QKIwojIFRvIGNoZWNrOgojIChGcm9tIERhbmllbCBTdGVuYmVyZykgVGhlIGNtYWtlIGJ1aWxkIHNlbGVjdGVkIHRvIHJ1biBnY2Mgd2l0aCAtZlBJQyBvbiBteSBib3ggd2hpbGUgdGhlIHBsYWluIGNvbmZpZ3VyZSBzY3JpcHQgZGlkIG5vdC4KIyAoRnJvbSBEYW5pZWwgU3RlbmJlcmcpIFRoZSBnY2MgY29tbWFuZCBsaW5lIHVzZSBuZWl0aGVyIC1nIG5vciBhbnkgLU8gb3B0aW9ucy4gQXMgYSBkZXZlbG9wZXIsIEkgYWxzbyB0cmVhc3VyZSBvdXIgY29uZmlndXJlIHNjcmlwdHMncyAtLWVuYWJsZS1kZWJ1ZyBvcHRpb24gdGhhdCBzZXRzIGEgbG9uZyByYW5nZSBvZiAicGlja3kiIGNvbXBpbGVyIG9wdGlvbnMuCmNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjggRkFUQUxfRVJST1IpCnNldChDTUFLRV9NT0RVTEVfUEFUSCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NNYWtlOyR7Q01BS0VfTU9EVUxFX1BBVEh9IikKaW5jbHVkZShVdGlsaXRpZXMpCmluY2x1ZGUoTWFjcm9zKQoKcHJvamVjdCggQ1VSTCBDICkKCm1lc3NhZ2UoV0FSTklORyAidGhlIGN1cmwgY21ha2UgYnVpbGQgc3lzdGVtIGlzIHBvb3JseSBtYWludGFpbmVkLiBCZSBhd2FyZSIpCgpmaWxlIChSRUFEICR7Q1VSTF9TT1VSQ0VfRElSfS9pbmNsdWRlL2N1cmwvY3VybHZlci5oIENVUkxfVkVSU0lPTl9IX0NPTlRFTlRTKQpzdHJpbmcgKFJFR0VYIE1BVENIICIjZGVmaW5lIExJQkNVUkxfVkVSU0lPTiBcIlteXCJdKiIKICBDVVJMX1ZFUlNJT04gJHtDVVJMX1ZFUlNJT05fSF9DT05URU5UU30pCnN0cmluZyAoUkVHRVggUkVQTEFDRSAiW15cIl0rXCIiICIiIENVUkxfVkVSU0lPTiAke0NVUkxfVkVSU0lPTn0pCnN0cmluZyAoUkVHRVggTUFUQ0ggIiNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OX05VTSAweFswLTlhLWZBLUZdKyIKICBDVVJMX1ZFUlNJT05fTlVNICR7Q1VSTF9WRVJTSU9OX0hfQ09OVEVOVFN9KQpzdHJpbmcgKFJFR0VYIFJFUExBQ0UgIlteMF0rMHgiICIiIENVUkxfVkVSU0lPTl9OVU0gJHtDVVJMX1ZFUlNJT05fTlVNfSkKCmluY2x1ZGVfcmVndWxhcl9leHByZXNzaW9uKCJeLiokIikgICAgIyBTdWtlbmRlcjogSXMgaXQgbmVjZXNzYXJ5PwoKIyBTZXR1cCBwYWNrYWdlIG1ldGEtZGF0YQojIFNFVChQQUNLQUdFICJjdXJsIikKbWVzc2FnZShTVEFUVVMgImN1cmwgdmVyc2lvbj1bJHtDVVJMX1ZFUlNJT059XSIpCiMgU0VUKFBBQ0tBR0VfVEFSTkFNRSAiY3VybCIpCiMgU0VUKFBBQ0tBR0VfTkFNRSAiY3VybCIpCiMgU0VUKFBBQ0tBR0VfVkVSU0lPTiAiLSIpCiMgU0VUKFBBQ0tBR0VfU1RSSU5HICJjdXJsLSIpCiMgU0VUKFBBQ0tBR0VfQlVHUkVQT1JUICJhIHN1aXRhYmxlIGN1cmwgbWFpbGluZyBsaXN0ID0+IGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvIikKc2V0KE9QRVJBVElOR19TWVNURU0gIiR7Q01BS0VfU1lTVEVNX05BTUV9IikKc2V0KE9TICJcIiR7Q01BS0VfU1lTVEVNX05BTUV9XCIiKQoKaW5jbHVkZV9kaXJlY3Rvcmllcygke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9jdXJsKQppbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NVUkxfU09VUkNFX0RJUn0vaW5jbHVkZSApCgpvcHRpb24oQlVJTERfQ1VSTF9FWEUgIlNldCB0byBPTiB0byBidWlsZCBjVVJMIGV4ZWN1dGFibGUuIiBPTikKb3B0aW9uKEJVSUxEX0NVUkxfVEVTVFMgIlNldCB0byBPTiB0byBidWlsZCBjVVJMIHRlc3RzLiIgT04pCm9wdGlvbihDVVJMX1NUQVRJQ0xJQiAiU2V0IHRvIE9OIHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCBzdGF0aWMgbGlua2luZy4iIE9GRikKb3B0aW9uKEVOQUJMRV9BUkVTICJTZXQgdG8gT04gdG8gZW5hYmxlIGMtYXJlcyBzdXBwb3J0IiBPRkYpCm9wdGlvbihFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIgIlNldCB0byBPTiB0byBlbmFibGUgUE9TSVggdGhyZWFkZWQgRE5TIGxvb2t1cCIgT0ZGKQoKb3B0aW9uKEVOQUJMRV9ERUJVRyAiU2V0IHRvIE9OIHRvIGVuYWJsZSBjdXJsIGRlYnVnIGZlYXR1cmVzIiBPRkYpCm9wdGlvbihFTkFCTEVfQ1VSTERFQlVHICJTZXQgdG8gT04gdG8gYnVpbGQgd2l0aCBUcmFja01lbW9yeSBmZWF0dXJlIGVuYWJsZWQiIE9GRikKCmlmIChFTkFCTEVfREVCVUcpCiAgIyBERUJVR0JVSUxEIHdpbGwgYmUgZGVmaW5lZCBvbmx5IGZvciBEZWJ1ZyBidWlsZHMKICBpZihOT1QgQ01BS0VfVkVSU0lPTiBWRVJTSU9OX0xFU1MgMy4wKQogICAgc2V0X3Byb3BlcnR5KERJUkVDVE9SWSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OUyAkPCQ8Q09ORklHOkRlYnVnPjpERUJVR0JVSUxEPikKICBlbHNlKCkKICAgIHNldF9wcm9wZXJ0eShESVJFQ1RPUlkgQVBQRU5EIFBST1BFUlRZIENPTVBJTEVfREVGSU5JVElPTlNfREVCVUcgREVCVUdCVUlMRCkKICBlbmRpZigpCiAgc2V0KEVOQUJMRV9DVVJMREVCVUcgT04pCmVuZGlmKCkKCmlmIChFTkFCTEVfQ1VSTERFQlVHKQogIHNldF9wcm9wZXJ0eShESVJFQ1RPUlkgQVBQRU5EIFBST1BFUlRZIENPTVBJTEVfREVGSU5JVElPTlMgQ1VSTERFQlVHKQplbmRpZigpCgojIGluaXRpYWxpemUgQ1VSTF9MSUJTCnNldChDVVJMX0xJQlMgIiIpCgppZihFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIgQU5EIEVOQUJMRV9BUkVTKQogIG1lc3NhZ2UoRkFUQUxfRVJST1IgIk9wdGlvbnMgRU5BQkxFX1RIUkVBREVEX1JFU09MVkVSIGFuZCBFTkFCTEVfQVJFUyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIikKZW5kaWYoKQoKaWYoRU5BQkxFX0FSRVMpCiAgc2V0KFVTRV9BUkVTIDEpCiAgZmluZF9wYWNrYWdlKENBUkVTIFJFUVVJUkVEKQogIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke0NBUkVTX0xJQlJBUll9ICkKICBzZXQoQ1VSTF9MSUJTICR7Q1VSTF9MSUJTfSAke0NBUkVTX0xJQlJBUll9KQplbmRpZigpCgpvcHRpb24oQlVJTERfREFTSEJPQVJEX1JFUE9SVFMgIlNldCB0byBPTiB0byBhY3RpdmF0ZSByZXBvcnRpbmcgb2YgY1VSTCBidWlsZHMgaGVyZSBodHRwOi8vd3d3LmNkYXNoLm9yZy9DRGFzaFB1YmxpYy9pbmRleC5waHA/cHJvamVjdD1DVVJMIiBPRkYpCmlmKEJVSUxEX0RBU0hCT0FSRF9SRVBPUlRTKQogICNJTkNMVURFKERhcnQpCiAgaW5jbHVkZShDVGVzdCkKZW5kaWYoQlVJTERfREFTSEJPQVJEX1JFUE9SVFMpCgppZihNU1ZDKQogIG9wdGlvbihCVUlMRF9SRUxFQVNFX0RFQlVHX0RJUlMgIlNldCBPRkYgdG8gYnVpbGQgZWFjaCBjb25maWd1cmF0aW9uIHRvIGEgc2VwYXJhdGUgZGlyZWN0b3J5IiBPRkYpCiAgbWFya19hc19hZHZhbmNlZChCVUlMRF9SRUxFQVNFX0RFQlVHX0RJUlMpCmVuZGlmKCkKCm9wdGlvbihDVVJMX0hJRERFTl9TWU1CT0xTICJTZXQgdG8gT04gdG8gaGlkZSBsaWJjdXJsIGludGVybmFsIHN5bWJvbHMgKD1oaWRlIGFsbCBzeW1ib2xzIHRoYXQgYXJlbid0IG9mZmljaWFsbHkgZXh0ZXJuYWwpLiIgT04pCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ISURERU5fU1lNQk9MUykKCm9wdGlvbihIVFRQX09OTFkgImRpc2FibGVzIGFsbCBwcm90b2NvbHMgZXhjZXB0IEhUVFAgKFRoaXMgb3ZlcnJpZGVzIGFsbCBDVVJMX0RJU0FCTEVfKiBvcHRpb25zKSIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKEhUVFBfT05MWSkKb3B0aW9uKENVUkxfRElTQUJMRV9GVFAgImRpc2FibGVzIEZUUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9GVFApCm9wdGlvbihDVVJMX0RJU0FCTEVfTERBUCAiZGlzYWJsZXMgTERBUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9MREFQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1RFTE5FVCAiZGlzYWJsZXMgVGVsbmV0IiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1RFTE5FVCkKb3B0aW9uKENVUkxfRElTQUJMRV9ESUNUICJkaXNhYmxlcyBESUNUIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0RJQ1QpCm9wdGlvbihDVVJMX0RJU0FCTEVfRklMRSAiZGlzYWJsZXMgRklMRSIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9GSUxFKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1RGVFAgImRpc2FibGVzIFRGVFAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVEZUUCkKb3B0aW9uKENVUkxfRElTQUJMRV9IVFRQICJkaXNhYmxlcyBIVFRQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0hUVFApCgpvcHRpb24oQ1VSTF9ESVNBQkxFX0xEQVBTICJ0byBkaXNhYmxlIExEQVBTIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0xEQVBTKQoKb3B0aW9uKENVUkxfRElTQUJMRV9SVFNQICJ0byBkaXNhYmxlIFJUU1AiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfUlRTUCkKb3B0aW9uKENVUkxfRElTQUJMRV9QUk9YWSAidG8gZGlzYWJsZSBwcm94eSIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9QUk9YWSkKb3B0aW9uKENVUkxfRElTQUJMRV9QT1AzICJ0byBkaXNhYmxlIFBPUDMiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfUE9QMykKb3B0aW9uKENVUkxfRElTQUJMRV9JTUFQICJ0byBkaXNhYmxlIElNQVAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfSU1BUCkKb3B0aW9uKENVUkxfRElTQUJMRV9TTVRQICJ0byBkaXNhYmxlIFNNVFAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfU01UUCkKb3B0aW9uKENVUkxfRElTQUJMRV9HT1BIRVIgInRvIGRpc2FibGUgR29waGVyIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0dPUEhFUikKCmlmKEhUVFBfT05MWSkKICBzZXQoQ1VSTF9ESVNBQkxFX0ZUUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVAgT04pCiAgc2V0KENVUkxfRElTQUJMRV9MREFQUyBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX1RFTE5FVCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0RJQ1QgT04pCiAgc2V0KENVUkxfRElTQUJMRV9GSUxFIE9OKQogIHNldChDVVJMX0RJU0FCTEVfVEZUUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX1JUU1AgT04pCiAgc2V0KENVUkxfRElTQUJMRV9QT1AzIE9OKQogIHNldChDVVJMX0RJU0FCTEVfSU1BUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX1NNVFAgT04pCiAgc2V0KENVUkxfRElTQUJMRV9HT1BIRVIgT04pCmVuZGlmKCkKCm9wdGlvbihDVVJMX0RJU0FCTEVfQ09PS0lFUyAidG8gZGlzYWJsZSBjb29raWVzIHN1cHBvcnQiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfQ09PS0lFUykKCm9wdGlvbihDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEggInRvIGRpc2FibGUgY3J5cHRvZ3JhcGhpYyBhdXRoZW50aWNhdGlvbiIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCkKb3B0aW9uKENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MgInRvIGRpc2FibGUgdmVyYm9zZSBzdHJpbmdzIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUykKb3B0aW9uKERJU0FCTEVEX1RIUkVBRFNBRkUgIlNldCB0byBleHBsaWNpdGx5IHNwZWNpZnkgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhyZWFkLXNhZmUgZnVuY3Rpb25zIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoRElTQUJMRURfVEhSRUFEU0FGRSkKb3B0aW9uKEVOQUJMRV9JUFY2ICJEZWZpbmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIElQdjYgc3VwcG9ydCIgT04pCm1hcmtfYXNfYWR2YW5jZWQoRU5BQkxFX0lQVjYpCmlmKEVOQUJMRV9JUFY2IEFORCBOT1QgV0lOMzIpCiAgaW5jbHVkZShDaGVja1N0cnVjdEhhc01lbWJlcikKICBjaGVja19zdHJ1Y3RfaGFzX21lbWJlcigic3RydWN0IHNvY2thZGRyX2luNiIgc2luNl9hZGRyICJuZXRpbmV0L2luLmgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgSEFWRV9TT0NLQUREUl9JTjZfU0lONl9BRERSKQogIGNoZWNrX3N0cnVjdF9oYXNfbWVtYmVyKCJzdHJ1Y3Qgc29ja2FkZHJfaW42IiBzaW42X3Njb3BlX2lkICJuZXRpbmV0L2luLmgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgSEFWRV9TT0NLQUREUl9JTjZfU0lONl9TQ09QRV9JRCkKICBpZihOT1QgSEFWRV9TT0NLQUREUl9JTjZfU0lONl9BRERSKQogICAgbWVzc2FnZShXQVJOSU5HICJzdHJ1Y3Qgc29ja2FkZHJfaW42IG5vdCBhdmFpbGFibGUsIGRpc2FibGluZyBJUHY2IHN1cHBvcnQiKQogICAgIyBGb3JjZSB0aGUgZmVhdHVyZSBvZmYgYXMgdGhpcyBuYW1lIGlzIHVzZWQgYXMgZ3VhcmQgbWFjcm8uLi4KICAgIHNldChFTkFCTEVfSVBWNiBPRkYKICAgICAgICBDQUNIRSBCT09MICJEZWZpbmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIElQdjYgc3VwcG9ydCIgRk9SQ0UpCiAgZW5kaWYoKQplbmRpZigpCgpvcHRpb24oRU5BQkxFX01BTlVBTCAidG8gcHJvdmlkZSB0aGUgYnVpbHQtaW4gbWFudWFsIiBPTikKdW5zZXQoVVNFX01BTlVBTCBDQUNIRSkgIyBUT0RPOiBjYWNoZSBOUk9GRi9OUk9GRl9NQU5PUFQvVVNFX01BTlVBTCB2YXJzPwppZihFTkFCTEVfTUFOVUFMKQogIGZpbmRfcHJvZ3JhbShOUk9GRiBOQU1FUyBnbnJvZmYgbnJvZmYpCiAgaWYoTlJPRkYpCiAgICAjIE5lZWQgYSB3YXkgdG8gd3JpdGUgdG8gc3RkaW4sIHRoaXMgd2lsbCBkbwogICAgZmlsZShXUklURSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L25yb2ZmLWlucHV0LnR4dCIgInRlc3QiKQogICAgIyBUZXN0cyBmb3IgYSB2YWxpZCBucm9mZiBvcHRpb24gdG8gZ2VuZXJhdGUgYSBtYW5wYWdlCiAgICBmb3JlYWNoKF9NQU5PUFQgIi1tYW4iICItbWFuZG9jIikKICAgICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgIiR7TlJPRkZ9IiAke19NQU5PUFR9CiAgICAgICAgT1VUUFVUX1ZBUklBQkxFIE5ST0ZGX01BTk9QVF9PVVRQVVQKICAgICAgICBJTlBVVF9GSUxFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbnJvZmYtaW5wdXQudHh0IgogICAgICAgIEVSUk9SX1FVSUVUKQogICAgICAjIFNhdmUgdGhlIG9wdGlvbiBpZiBpdCB3YXMgdmFsaWQKICAgICAgaWYoTlJPRkZfTUFOT1BUX09VVFBVVCkKICAgICAgICBtZXNzYWdlKCJGb3VuZCAqbnJvZmYgb3B0aW9uOiAtLSAke19NQU5PUFR9IikKICAgICAgICBzZXQoTlJPRkZfTUFOT1BUICR7X01BTk9QVH0pCiAgICAgICAgc2V0KFVTRV9NQU5VQUwgMSkKICAgICAgICBicmVhaygpCiAgICAgIGVuZGlmKCkKICAgIGVuZGZvcmVhY2goKQogICAgIyBObyBuZWVkIGZvciB0aGUgdGVtcG9yYXJ5IGZpbGUKICAgIGZpbGUoUkVNT1ZFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbnJvZmYtaW5wdXQudHh0IikKICAgIGlmKE5PVCBVU0VfTUFOVUFMKQogICAgICBtZXNzYWdlKFdBUk5JTkcgIkZvdW5kIG5vICpucm9mZiBvcHRpb24gdG8gZ2V0IHBsYWludGV4dCBmcm9tIG1hbiBwYWdlcyIpCiAgICBlbmRpZigpCiAgZWxzZSgpCiAgICBtZXNzYWdlKFdBUk5JTkcgIkZvdW5kIG5vICpucm9mZiBwcm9ncmFtIikKICBlbmRpZigpCmVuZGlmKCkKCiMgV2UgbmVlZCBhbnNpIGMtZmxhZ3MsIGVzcGVjaWFsbHkgb24gSFAKc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQU5TSV9DRkxBR1N9ICR7Q01BS0VfQ19GTEFHU30iKQpzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgJHtDTUFLRV9BTlNJX0NGTEFHU30pCgojIERpc2FibGUgd2FybmluZ3Mgb24gQm9ybGFuZCB0byBhdm9pZCBjaGFuZ2luZyAzcmQgcGFydHkgY29kZS4KaWYoQk9STEFORCkKICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtdy0iKQplbmRpZihCT1JMQU5EKQoKIyBJZiB3ZSBhcmUgb24gQUlYLCBkbyB0aGUgX0FMTF9TT1VSQ0UgbWFnaWMKaWYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyBBSVgpCiAgc2V0KF9BTExfU09VUkNFIDEpCmVuZGlmKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgQUlYKQoKIyBJbmNsdWRlIGFsbCB0aGUgbmVjZXNzYXJ5IGZpbGVzIGZvciBtYWNyb3MKaW5jbHVkZSAoQ2hlY2tGdW5jdGlvbkV4aXN0cykKaW5jbHVkZSAoQ2hlY2tJbmNsdWRlRmlsZSkKaW5jbHVkZSAoQ2hlY2tJbmNsdWRlRmlsZXMpCmluY2x1ZGUgKENoZWNrTGlicmFyeUV4aXN0cykKaW5jbHVkZSAoQ2hlY2tTeW1ib2xFeGlzdHMpCmluY2x1ZGUgKENoZWNrVHlwZVNpemUpCmluY2x1ZGUgKENoZWNrQ1NvdXJjZUNvbXBpbGVzKQppbmNsdWRlIChDTWFrZURlcGVuZGVudE9wdGlvbikKCiMgT24gd2luZG93cyBwcmVsb2FkIHNldHRpbmdzCmlmKFdJTjMyKQogIHNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAiJHtDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OU30gLURfV0lOU09DS0FQSV8iKQogIGluY2x1ZGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NNYWtlL1BsYXRmb3Jtcy9XaW5kb3dzQ2FjaGUuY21ha2UpCmVuZGlmKFdJTjMyKQoKaWYoRU5BQkxFX1RIUkVBREVEX1JFU09MVkVSKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInB0aHJlYWQuaCIgSEFWRV9QVEhSRUFEX0gpCiAgaWYoSEFWRV9QVEhSRUFEX0gpCiAgICBzZXQoQ01BS0VfVEhSRUFEX1BSRUZFUl9QVEhSRUFEIDEpCiAgICBmaW5kX3BhY2thZ2UoVGhyZWFkcykKICAgIGlmKENNQUtFX1VTRV9QVEhSRUFEU19JTklUKQogICAgICBzZXQoQ1VSTF9MSUJTICR7Q1VSTF9MSUJTfSAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQogICAgICBzZXQoVVNFX1RIUkVBRFNfUE9TSVggMSkKICAgIGVuZGlmKCkKICBlbmRpZigpCmVuZGlmKCkKCiMgQ2hlY2sgZm9yIGFsbCBuZWVkZWQgbGlicmFyaWVzCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiZGwiICAgICBkbG9wZW4gICAgICAgSEFWRV9MSUJETCkKY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJzb2NrZXQiIGNvbm5lY3QgICAgICBIQVZFX0xJQlNPQ0tFVCkKY2hlY2tfbGlicmFyeV9leGlzdHMoImMiIGdldGhvc3RieW5hbWUgIiIgTk9UX05FRURfTElCTlNMKQoKIyBZZWxsb3d0YWIgWmV0YSBuZWVkcyBkaWZmZXJlbnQgbGlicmFyaWVzIHRoYW4gQmVPUyA1LgppZihCRU9TKQogIHNldChOT1RfTkVFRF9MSUJOU0wgMSkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImJpbmQiIGdldGhvc3RieW5hbWUgSEFWRV9MSUJCSU5EKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiYm5ldGFwaSIgY2xvc2Vzb2NrZXQgSEFWRV9MSUJCTkVUQVBJKQplbmRpZihCRU9TKQoKaWYoTk9UIE5PVF9ORUVEX0xJQk5TTCkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIm5zbCIgICAgZ2V0aG9zdGJ5bmFtZSAgSEFWRV9MSUJOU0wpCmVuZGlmKE5PVCBOT1RfTkVFRF9MSUJOU0wpCgpjaGVja19mdW5jdGlvbl9leGlzdHMoZ2V0aG9zdG5hbWUgSEFWRV9HRVRIT1NUTkFNRSkKCnNldChPUEVOU1NMX0RFRkFVTFQgT04pCmlmKFdJTjMyKQogIHNldChPUEVOU1NMX0RFRkFVTFQgT0ZGKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgid3MyXzMyIiBnZXRjaCAgICAgICAgSEFWRV9MSUJXUzJfMzIpCiAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJ3aW5tbSIgIGdldGNoICAgICAgICBIQVZFX0xJQldJTk1NKQplbmRpZigpCgpvcHRpb24oQ01BS0VfVVNFX09QRU5TU0wgIlVzZSBPcGVuU1NMIGNvZGUuIEV4cGVyaW1lbnRhbCIgJHtPUEVOU1NMX0RFRkFVTFR9KQptYXJrX2FzX2FkdmFuY2VkKENNQUtFX1VTRV9PUEVOU1NMKQoKaWYoV0lOMzIpCiAgQ01BS0VfREVQRU5ERU5UX09QVElPTihDVVJMX1dJTkRPV1NfU1NQSSAiVXNlIHdpbmRvd3MgbGlicmFyaWVzIHRvIGFsbG93IE5UTE0gYXV0aGVudGljYXRpb24gd2l0aG91dCBvcGVuc3NsIiBPTgogICAgIk5PVCBDTUFLRV9VU0VfT1BFTlNTTCIgT0ZGKQogIG1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9XSU5ET1dTX1NTUEkpCmVuZGlmKCkKCnNldChVU0VfT1BFTlNTTCBPRkYpCnNldChIQVZFX0xJQkNSWVBUTyBPRkYpCnNldChIQVZFX0xJQlNTTCBPRkYpCgppZihDTUFLRV9VU0VfT1BFTlNTTCkKICBmaW5kX3BhY2thZ2UoT3BlblNTTCkKICBpZihPUEVOU1NMX0ZPVU5EKQogICAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7T1BFTlNTTF9MSUJSQVJJRVN9KQogICAgc2V0KFVTRV9PUEVOU1NMIE9OKQogICAgc2V0KEhBVkVfTElCQ1JZUFRPIE9OKQogICAgc2V0KEhBVkVfTElCU1NMIE9OKQogICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke09QRU5TU0xfSU5DTFVERV9ESVJ9KQogICAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7T1BFTlNTTF9JTkNMVURFX0RJUn0pCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvY3J5cHRvLmgiIEhBVkVfT1BFTlNTTF9DUllQVE9fSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9lbmdpbmUuaCIgSEFWRV9PUEVOU1NMX0VOR0lORV9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL2Vyci5oIiAgICBIQVZFX09QRU5TU0xfRVJSX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvcGVtLmgiICAgIEhBVkVfT1BFTlNTTF9QRU1fSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9wa2NzMTIuaCIgSEFWRV9PUEVOU1NMX1BLQ1MxMl9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL3JzYS5oIiAgICBIQVZFX09QRU5TU0xfUlNBX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvc3NsLmgiICAgIEhBVkVfT1BFTlNTTF9TU0xfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC94NTA5LmgiICAgSEFWRV9PUEVOU1NMX1g1MDlfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9yYW5kLmgiICAgSEFWRV9PUEVOU1NMX1JBTkRfSCkKICBlbHNlaWYoV0lOMzIpCiAgICBzZXQoQ1VSTF9XSU5ET1dTX1NTUEkgT04pCiAgZW5kaWYoKQplbmRpZigpCgppZihOT1QgQ1VSTF9ESVNBQkxFX0xEQVApCgogIGlmKFdJTjMyKQogICAgb3B0aW9uKFVTRV9XSU4zMl9MREFQICJVc2UgV2luZG93cyBMREFQIGltcGxlbWVudGF0aW9uIiBPTikKICAgIGlmKFVTRV9XSU4zMl9MREFQKQogICAgICBjaGVja19saWJyYXJ5X2V4aXN0cygid2xkYXAzMiIgY2xkYXBfb3BlbiAiIiBIQVZFX1dMREFQMzIpCiAgICAgIGlmKE5PVCBIQVZFX1dMREFQMzIpCiAgICAgICAgc2V0KFVTRV9XSU4zMl9MREFQIE9GRikKICAgICAgZW5kaWYoKQogICAgZW5kaWYoKQogIGVuZGlmKCkKCiAgb3B0aW9uKENNQUtFX1VTRV9PUEVOTERBUCAiVXNlIE9wZW5MREFQIGNvZGUuIiBPRkYpCiAgbWFya19hc19hZHZhbmNlZChDTUFLRV9VU0VfT1BFTkxEQVApCiAgc2V0KENNQUtFX0xEQVBfTElCICJsZGFwIiBDQUNIRSBTVFJJTkcgIk5hbWUgb3IgZnVsbCBwYXRoIHRvIGxkYXAgbGlicmFyeSIpCiAgc2V0KENNQUtFX0xCRVJfTElCICJsYmVyIiBDQUNIRSBTVFJJTkcgIk5hbWUgb3IgZnVsbCBwYXRoIHRvIGxiZXIgbGlicmFyeSIpCgogIGlmKENNQUtFX1VTRV9PUEVOTERBUCBBTkQgVVNFX1dJTjMyX0xEQVApCiAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDYW5ub3QgdXNlIFVTRV9XSU4zMl9MREFQIGFuZCBDTUFLRV9VU0VfT1BFTkxEQVAgYXQgdGhlIHNhbWUgdGltZSIpCiAgZW5kaWYoKQogIAogICMgTm93IHRoYXQgd2Uga25vdywgd2UncmUgbm90IHVzaW5nIHdpbmRvd3MgTERBUC4uLgogIGlmKE5PVCBVU0VfV0lOMzJfTERBUCkKICAgICMgQ2hlY2sgZm9yIExEQVAKICAgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtPUEVOU1NMX0xJQlJBUklFU30pCiAgICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoJHtDTUFLRV9MREFQX0xJQn0gbGRhcF9pbml0IEhBVkVfTElCTERBUCkKICAgIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgke0NNQUtFX0xCRVJfTElCfSBiZXJfaW5pdCBIQVZFX0xJQkxCRVIpCiAgZWxzZSgpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3aW5sZGFwLmgiIEhBVkVfV0lOTERBUF9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luYmVyLmgiICBIQVZFX1dJTkJFUl9IKQogIGVuZGlmKCkKICAKICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVNfQkFLICR7Q01BS0VfUkVRVUlSRURfSU5DTFVERVN9KQogIHNldChDTUFLRV9MREFQX0lOQ0xVREVfRElSICIiIENBQ0hFIFNUUklORyAiUGF0aCB0byBMREFQIGluY2x1ZGUgZGlyZWN0b3J5IikKICBpZihDTUFLRV9MREFQX0lOQ0xVREVfRElSKQogICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtDTUFLRV9MREFQX0lOQ0xVREVfRElSfSkKICBlbmRpZigpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGRhcC5oIiAgICAgICAgICAgSEFWRV9MREFQX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGJlci5oIiAgICAgICAgICAgSEFWRV9MQkVSX0gpCgogIGlmKE5PVCBIQVZFX0xEQVBfSCkKICAgIG1lc3NhZ2UoU1RBVFVTICJMREFQX0ggbm90IGZvdW5kIENVUkxfRElTQUJMRV9MREFQIHNldCBPTiIpCiAgICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVAgT04gQ0FDSEUgQk9PTCAiIiBGT1JDRSkKICAgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0NNQUtFX1JFUVVJUkVEX0lOQ0xVREVTX0JBS30pICNMREFQIGluY2x1ZGVzIHdvbid0IGJlIHVzZWQKICBlbHNlaWYoTk9UIEhBVkVfTElCTERBUCkKICAgIG1lc3NhZ2UoU1RBVFVTICJMREFQIGxpYnJhcnkgJyR7Q01BS0VfTERBUF9MSUJ9JyBub3QgZm91bmQgQ1VSTF9ESVNBQkxFX0xEQVAgc2V0IE9OIikKICAgIHNldChDVVJMX0RJU0FCTEVfTERBUCBPTiBDQUNIRSBCT09MICIiIEZPUkNFKQogICAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7Q01BS0VfUkVRVUlSRURfSU5DTFVERVNfQkFLfSkgI0xEQVAgaW5jbHVkZXMgd29uJ3QgYmUgdXNlZAogIGVsc2UoKQogICAgaWYoQ01BS0VfVVNFX09QRU5MREFQKQogICAgICBzZXQoVVNFX09QRU5MREFQIE9OKQogICAgZW5kaWYoKQogICAgaWYoQ01BS0VfTERBUF9JTkNMVURFX0RJUikKICAgICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0xEQVBfSU5DTFVERV9ESVJ9KQogICAgZW5kaWYoKQogICAgc2V0KE5FRURfTEJFUl9IIE9OKQogICAgc2V0KF9IRUFERVJfTElTVCkKICAgIGlmKEhBVkVfV0lORE9XU19IKQogICAgICBsaXN0KEFQUEVORCBfSEVBREVSX0xJU1QgIndpbmRvd3MuaCIpCiAgICBlbmRpZigpCiAgICBpZihIQVZFX1NZU19UWVBFU19IKQogICAgICBsaXN0KEFQUEVORCBfSEVBREVSX0xJU1QgInN5cy90eXBlcy5oIikKICAgIGVuZGlmKCkKICAgIGxpc3QoQVBQRU5EIF9IRUFERVJfTElTVCAibGRhcC5oIikKCiAgICBzZXQoX1NSQ19TVFJJTkcgIiIpCiAgICBmb3JlYWNoKF9IRUFERVIgJHtfSEVBREVSX0xJU1R9KQogICAgICBzZXQoX0lOQ0xVREVfU1RSSU5HICIke19JTkNMVURFX1NUUklOR30jaW5jbHVkZSA8JHtfSEVBREVSfT5cbiIpCiAgICBlbmRmb3JlYWNoKCkKCiAgICBzZXQoX1NSQ19TVFJJTkcKICAgICAgIgogICAgICAke19JTkNMVURFX1NUUklOR30KICAgICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKICAgICAgewogICAgICAgIEJlclZhbHVlICpidnAgPSBOVUxMOwogICAgICAgIEJlckVsZW1lbnQgKmJlcCA9IGJlcl9pbml0KGJ2cCk7CiAgICAgICAgYmVyX2ZyZWUoYmVwLCAxKTsKICAgICAgICByZXR1cm4gMDsKICAgICAgfSIKICAgICkKICAgIHNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAiJHtDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OU30gLURMREFQX0RFUFJFQ0FURUQ9MSIpCiAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtDTUFLRV9MREFQX0xJQn0pCiAgICBpZihIQVZFX0xJQkxCRVIpCiAgICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0NNQUtFX0xCRVJfTElCfSkKICAgIGVuZGlmKCkKICAgIGNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCIke19TUkNfU1RSSU5HfSIgTk9UX05FRURfTEJFUl9IKQoKICAgIGlmKE5PVF9ORUVEX0xCRVJfSCkKICAgICAgc2V0KE5FRURfTEJFUl9IIE9GRikKICAgIGVsc2UoKQogICAgICBzZXQoQ1VSTF9URVNUX0RFRklORVMgIiR7Q1VSTF9URVNUX0RFRklORVN9IC1ETkVFRF9MQkVSX0giKQogICAgZW5kaWYoKQogIGVuZGlmKCkKCmVuZGlmKCkKCiMgTm8gbGRhcCwgbm8gbGRhcHMuCmlmKENVUkxfRElTQUJMRV9MREFQKQogIGlmKE5PVCBDVVJMX0RJU0FCTEVfTERBUFMpCiAgICBtZXNzYWdlKFNUQVRVUyAiTERBUCBuZWVkcyB0byBiZSBlbmFibGVkIHRvIHN1cHBvcnQgTERBUFMiKQogICAgc2V0KENVUkxfRElTQUJMRV9MREFQUyBPTiBDQUNIRSBCT09MICIiIEZPUkNFKQogIGVuZGlmKCkKZW5kaWYoKQoKaWYoTk9UIENVUkxfRElTQUJMRV9MREFQUykKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsZGFwX3NzbC5oIiBIQVZFX0xEQVBfU1NMX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGRhcHNzbC5oIiAgSEFWRV9MREFQU1NMX0gpCmVuZGlmKCkKCiMgQ2hlY2sgZm9yIGlkbgpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImlkbiIgaWRuYV90b19hc2NpaV9seiBIQVZFX0xJQklETikKCiMgQ2hlY2sgZm9yIHN5bWJvbCBkbG9wZW4gKHNhbWUgYXMgSEFWRV9MSUJETCkKY2hlY2tfbGlicmFyeV9leGlzdHMoIiR7Q1VSTF9MSUJTfSIgZGxvcGVuICIiIEhBVkVfRExPUEVOKQoKb3B0aW9uKENVUkxfWkxJQiAiU2V0IHRvIE9OIHRvIGVuYWJsZSBidWlsZGluZyBjVVJMIHdpdGggemxpYiBzdXBwb3J0LiIgT04pCnNldChIQVZFX0xJQlogT0ZGKQpzZXQoSEFWRV9aTElCX0ggT0ZGKQpzZXQoSEFWRV9aTElCIE9GRikKaWYoQ1VSTF9aTElCKQogIGZpbmRfcGFja2FnZShaTElCIFFVSUVUKQogIGlmKFpMSUJfRk9VTkQpCiAgICBzZXQoSEFWRV9aTElCX0ggT04pCiAgICBzZXQoSEFWRV9aTElCIE9OKQogICAgc2V0KEhBVkVfTElCWiBPTikKICAgIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke1pMSUJfTElCUkFSSUVTfSkKICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtaTElCX0lOQ0xVREVfRElSU30pCiAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke1pMSUJfSU5DTFVERV9ESVJTfSkKICBlbmRpZigpCmVuZGlmKCkKCiNsaWJTU0gyCm9wdGlvbihDTUFLRV9VU0VfTElCU1NIMiAiVXNlIGxpYlNTSDIiIE9OKQptYXJrX2FzX2FkdmFuY2VkKENNQUtFX1VTRV9MSUJTU0gyKQpzZXQoVVNFX0xJQlNTSDIgT0ZGKQpzZXQoSEFWRV9MSUJTU0gyIE9GRikKc2V0KEhBVkVfTElCU1NIMl9IIE9GRikKCmlmKENNQUtFX1VTRV9MSUJTU0gyKQogIGZpbmRfcGFja2FnZShMaWJTU0gyKQogIGlmKExJQlNTSDJfRk9VTkQpCiAgICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtMSUJTU0gyX0xJQlJBUll9KQogICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0xJQlNTSDJfTElCUkFSWX0pCiAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAiJHtMSUJTU0gyX0lOQ0xVREVfRElSfSIpCiAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0xJQlNTSDJfSU5DTFVERV9ESVJ9IikKICAgIHNldChIQVZFX0xJQlNTSDIgT04pCiAgICBzZXQoVVNFX0xJQlNTSDIgT04pCgogICAgIyBmaW5kX3BhY2thZ2UgaGFzIGFscmVhZHkgZm91bmQgdGhlIGhlYWRlcnMKICAgIHNldChIQVZFX0xJQlNTSDJfSCBPTikKICAgIHNldChDVVJMX0lOQ0xVREVTICR7Q1VSTF9JTkNMVURFU30gIiR7TElCU1NIMl9JTkNMVURFX0RJUn0vbGlic3NoMi5oIikKICAgIHNldChDVVJMX1RFU1RfREVGSU5FUyAiJHtDVVJMX1RFU1RfREVGSU5FU30gLURIQVZFX0xJQlNTSDJfSCIpCgogICAgIyBub3cgY2hlY2sgZm9yIHNwZWNpZmljIGxpYnNzaDIgc3ltYm9scyBhcyB0aGV5IHdlcmUgYWRkZWQgaW4gZGlmZmVyZW50IHZlcnNpb25zCiAgICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAibGlic3NoMi5oIikKICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsaWJzc2gyX3ZlcnNpb24gICAgICAgICAgIEhBVkVfTElCU1NIMl9WRVJTSU9OKQogICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGxpYnNzaDJfaW5pdCAgICAgICAgICAgICAgSEFWRV9MSUJTU0gyX0lOSVQpCiAgICBjaGVja19mdW5jdGlvbl9leGlzdHMobGlic3NoMl9leGl0ICAgICAgICAgICAgICBIQVZFX0xJQlNTSDJfRVhJVCkKICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsaWJzc2gyX3NjcF9zZW5kNjQgICAgICAgIEhBVkVfTElCU1NIMl9TQ1BfU0VORDY0KQogICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGxpYnNzaDJfc2Vzc2lvbl9oYW5kc2hha2UgSEFWRV9MSUJTU0gyX1NFU1NJT05fSEFORFNIQUtFKQogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgIiIpCgogIGVuZGlmKExJQlNTSDJfRk9VTkQpCmVuZGlmKENNQUtFX1VTRV9MSUJTU0gyKQoKb3B0aW9uKENNQUtFX1VTRV9HU1NBUEkgIlVzZSBHU1NBUEkgaW1wbGVtZW50YXRpb24gKHJpZ2h0IG5vdyBvbmx5IEhlaW1kYWwgaXMgc3VwcG9ydGVkIHdpdGggQ01ha2UgYnVpbGQpIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ01BS0VfVVNFX0dTU0FQSSkKCmlmKENNQUtFX1VTRV9HU1NBUEkpCiAgZmluZF9wYWNrYWdlKEdTUykKCiAgc2V0KEhBVkVfR1NTQVBJICR7R1NTX0ZPVU5EfSkKICBpZihHU1NfRk9VTkQpCgogICAgbWVzc2FnZShTVEFUVVMgIkZvdW5kICR7R1NTX0ZMQVZPVVJ9IEdTU0FQSSB2ZXJzaW9uOiBcIiR7R1NTX1ZFUlNJT059XCIiKQoKICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7R1NTX0lOQ0xVREVfRElSRUNUT1JJRVN9KQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZ3NzYXBpL2dzc2FwaS5oIiAgSEFWRV9HU1NBUElfR1NTQVBJX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJnc3NhcGkvZ3NzYXBpX2dlbmVyaWMuaCIgSEFWRV9HU1NBUElfR1NTQVBJX0dFTkVSSUNfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImdzc2FwaS9nc3NhcGlfa3JiNS5oIiBIQVZFX0dTU0FQSV9HU1NBUElfS1JCNV9IKQoKICAgIGlmKEdTU19GTEFWT1VSIFNUUkVRVUFMICJIZWltZGFsIikKICAgICAgc2V0KEhBVkVfR1NTSEVJTURBTCBPTikKICAgIGVsc2UoKSAjIE1JVAogICAgICBzZXQoSEFWRV9HU1NNSVQgT04pCiAgICAgIHNldChfSU5DTFVERV9MSVNUICIiKQogICAgICBpZihIQVZFX0dTU0FQSV9HU1NBUElfSCkKICAgICAgICBsaXN0KEFQUEVORCBfSU5DTFVERV9MSVNUICJnc3NhcGkvZ3NzYXBpLmgiKQogICAgICBlbmRpZigpCiAgICAgIGlmKEhBVkVfR1NTQVBJX0dTU0FQSV9HRU5FUklDX0gpCiAgICAgICAgbGlzdChBUFBFTkQgX0lOQ0xVREVfTElTVCAiZ3NzYXBpL2dzc2FwaV9nZW5lcmljLmgiKQogICAgICBlbmRpZigpCiAgICAgIGlmKEhBVkVfR1NTQVBJX0dTU0FQSV9LUkI1X0gpCiAgICAgICAgbGlzdChBUFBFTkQgX0lOQ0xVREVfTElTVCAiZ3NzYXBpL2dzc2FwaV9rcmI1LmgiKQogICAgICBlbmRpZigpCgogICAgICBzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIF9DT01QSUxFUl9GTEFHU19TVFIgIiR7R1NTX0NPTVBJTEVSX0ZMQUdTfSIpCiAgICAgIHN0cmluZyhSRVBMQUNFICI7IiAiICIgX0xJTktFUl9GTEFHU19TVFIgIiR7R1NTX0xJTktFUl9GTEFHU30iKQoKICAgICAgZm9yZWFjaChfZGlyICR7R1NTX0xJTktfRElSRUNUT1JJRVN9KQogICAgICAgIHNldChfTElOS0VSX0ZMQUdTX1NUUiAiJHtfTElOS0VSX0ZMQUdTX1NUUn0gLUxcIiR7X2Rpcn1cIiIpCiAgICAgIGVuZGZvcmVhY2goKQoKICAgICAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICIke19DT01QSUxFUl9GTEFHU19TVFJ9ICR7X0xJTktFUl9GTEFHU19TVFJ9IikKICAgICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0dTU19MSUJSQVJJRVN9KQogICAgICBjaGVja19zeW1ib2xfZXhpc3RzKCJHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSIgJHtfSU5DTFVERV9MSVNUfSBIQVZFX0dTU19DX05UX0hPU1RCQVNFRF9TRVJWSUNFKQogICAgICBpZihOT1QgSEFWRV9HU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSkKICAgICAgICBzZXQoSEFWRV9PTERfR1NTTUlUIE9OKQogICAgICBlbmRpZigpCgogICAgZW5kaWYoKQoKICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtHU1NfSU5DTFVERV9ESVJFQ1RPUklFU30pCiAgICBsaW5rX2RpcmVjdG9yaWVzKCR7R1NTX0xJTktfRElSRUNUT1JJRVN9KQogICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gJHtHU1NfQ09NUElMRVJfRkxBR1N9IikKICAgIHNldChDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTICIke0NNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1N9ICR7R1NTX0xJTktFUl9GTEFHU30iKQogICAgc2V0KENNQUtFX0VYRV9MSU5LRVJfRkxBR1MgIiR7Q01BS0VfRVhFX0xJTktFUl9GTEFHU30gJHtHU1NfTElOS0VSX0ZMQUdTfSIpCiAgICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtHU1NfTElCUkFSSUVTfSkKCiAgZWxzZSgpCiAgICBtZXNzYWdlKFdBUk5JTkcgIkdTU0FQSSBzdXBwb3J0IGhhcyBiZWVuIHJlcXVlc3RlZCBidXQgbm8gc3VwcG9ydGluZyBsaWJyYXJpZXMgZm91bmQuIFNraXBwaW5nLiIpCiAgZW5kaWYoKQplbmRpZigpCgpvcHRpb24oRU5BQkxFX1VOSVhfU09DS0VUUyAiRGVmaW5lIGlmIHlvdSB3YW50IFVuaXggZG9tYWluIHNvY2tldHMgc3VwcG9ydCIgT04pCmlmKEVOQUJMRV9VTklYX1NPQ0tFVFMpCiAgaW5jbHVkZShDaGVja1N0cnVjdEhhc01lbWJlcikKICBjaGVja19zdHJ1Y3RfaGFzX21lbWJlcigic3RydWN0IHNvY2thZGRyX3VuIiBzdW5fcGF0aCAic3lzL3VuLmgiIFVTRV9VTklYX1NPQ0tFVFMpCmVsc2UoKQogIHVuc2V0KFVTRV9VTklYX1NPQ0tFVFMgQ0FDSEUpCmVuZGlmKCkKCgojIENoZWNrIGZvciBoZWFkZXIgZmlsZXMKaWYoTk9UIFVOSVgpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luZG93cy5oIiAgICAgIEhBVkVfV0lORE9XU19IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbnNvY2suaCIgICAgICBIQVZFX1dJTlNPQ0tfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3czJ0Y3BpcC5oIiAgICAgSEFWRV9XUzJUQ1BJUF9IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbnNvY2syLmgiICAgICBIQVZFX1dJTlNPQ0syX0gpCiAgaWYoQ1VSTF9XSU5ET1dTX1NTUEkpCiAgICBzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgIiR7Q01BS0VfUkVRVUlSRURfREVGSU5JVElPTlN9IC1EU0VDVVJJVFlfV0lOMzIiKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3NwaS5oIiAgICAgICBIQVZFX1NTUElfSCkKICAgIGlmKEhBVkVfU1NQSV9IKQogICAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzY2hhbm5lbC5oIiBIQVZFX1NDSEFOTkVMX0gpCiAgICAgIHNldChVU0VfV0lORE9XU19TU1BJIE9OKQogICAgICBpZihIQVZFX1NDSEFOTkVMX0gpCiAgICAgICAgc2V0KFVTRV9TQ0hBTk5FTCBPTikKICAgICAgICBzZXQoU1NMX0VOQUJMRUQgT04pCiAgICAgIGVuZGlmKCkKICAgIGVuZGlmKCkKICBlbmRpZigpCmVuZGlmKE5PVCBVTklYKQoKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkaW8uaCIgICAgICAgICAgSEFWRV9TVERJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJpbnR0eXBlcy5oIiAgICAgICBIQVZFX0lOVFRZUEVTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9maWxpby5oIiAgICAgIEhBVkVfU1lTX0ZJTElPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9pb2N0bC5oIiAgICAgIEhBVkVfU1lTX0lPQ1RMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9wYXJhbS5oIiAgICAgIEhBVkVfU1lTX1BBUkFNX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9wb2xsLmgiICAgICAgIEhBVkVfU1lTX1BPTExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3Jlc291cmNlLmgiICAgSEFWRV9TWVNfUkVTT1VSQ0VfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3NlbGVjdC5oIiAgICAgSEFWRV9TWVNfU0VMRUNUX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zb2NrZXQuaCIgICAgIEhBVkVfU1lTX1NPQ0tFVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvc29ja2lvLmgiICAgICBIQVZFX1NZU19TT0NLSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3N0YXQuaCIgICAgICAgSEFWRV9TWVNfU1RBVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdGltZS5oIiAgICAgICBIQVZFX1NZU19USU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy90eXBlcy5oIiAgICAgIEhBVkVfU1lTX1RZUEVTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy91aW8uaCIgICAgICAgIEhBVkVfU1lTX1VJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdW4uaCIgICAgICAgICBIQVZFX1NZU19VTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdXRpbWUuaCIgICAgICBIQVZFX1NZU19VVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhbGxvY2EuaCIgICAgICAgICBIQVZFX0FMTE9DQV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhcnBhL2luZXQuaCIgICAgICBIQVZFX0FSUEFfSU5FVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhcnBhL3RmdHAuaCIgICAgICBIQVZFX0FSUEFfVEZUUF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJhc3NlcnQuaCIgICAgICAgICBIQVZFX0FTU0VSVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJjcnlwdG8uaCIgICAgICAgICBIQVZFX0NSWVBUT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJkZXMuaCIgICAgICAgICAgICBIQVZFX0RFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJlcnIuaCIgICAgICAgICAgICBIQVZFX0VSUl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJlcnJuby5oIiAgICAgICAgICBIQVZFX0VSUk5PX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImZjbnRsLmgiICAgICAgICAgIEhBVkVfRkNOVExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWRuLWZyZWUuaCIgICAgICAgSEFWRV9JRE5fRlJFRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJpZmFkZHJzLmgiICAgICAgICBIQVZFX0lGQUREUlNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaW8uaCIgICAgICAgICAgICAgSEFWRV9JT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJrcmIuaCIgICAgICAgICAgICBIQVZFX0tSQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsaWJnZW4uaCIgICAgICAgICBIQVZFX0xJQkdFTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsaW1pdHMuaCIgICAgICAgICBIQVZFX0xJTUlUU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsb2NhbGUuaCIgICAgICAgICBIQVZFX0xPQ0FMRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXQvaWYuaCIgICAgICAgICBIQVZFX05FVF9JRl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRkYi5oIiAgICAgICAgICBIQVZFX05FVERCX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGluZXQvaW4uaCIgICAgIEhBVkVfTkVUSU5FVF9JTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRpbmV0L3RjcC5oIiAgICBIQVZFX05FVElORVRfVENQX0gpCgpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwZW0uaCIgICAgICAgICAgICBIQVZFX1BFTV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwb2xsLmgiICAgICAgICAgICBIQVZFX1BPTExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicHdkLmgiICAgICAgICAgICAgSEFWRV9QV0RfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicnNhLmgiICAgICAgICAgICAgSEFWRV9SU0FfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic2V0am1wLmgiICAgICAgICAgSEFWRV9TRVRKTVBfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic2d0dHkuaCIgICAgICAgICAgSEFWRV9TR1RUWV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzaWduYWwuaCIgICAgICAgICBIQVZFX1NJR05BTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzc2wuaCIgICAgICAgICAgICBIQVZFX1NTTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRib29sLmgiICAgICAgICBIQVZFX1NUREJPT0xfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkaW50LmgiICAgICAgICAgSEFWRV9TVERJTlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkaW8uaCIgICAgICAgICAgSEFWRV9TVERJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRsaWIuaCIgICAgICAgICBIQVZFX1NURExJQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdHJpbmcuaCIgICAgICAgICBIQVZFX1NUUklOR19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdHJpbmdzLmgiICAgICAgICBIQVZFX1NUUklOR1NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3Ryb3B0cy5oIiAgICAgICAgSEFWRV9TVFJPUFRTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRlcm1pby5oIiAgICAgICAgIEhBVkVfVEVSTUlPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRlcm1pb3MuaCIgICAgICAgIEhBVkVfVEVSTUlPU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0aW1lLmgiICAgICAgICAgICBIQVZFX1RJTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGxkLmgiICAgICAgICAgICAgSEFWRV9UTERfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidW5pc3RkLmgiICAgICAgICAgSEFWRV9VTklTVERfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidXRpbWUuaCIgICAgICAgICAgSEFWRV9VVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ4NTA5LmgiICAgICAgICAgICBIQVZFX1g1MDlfSCkKCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInByb2Nlc3MuaCIgICAgICAgIEhBVkVfUFJPQ0VTU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRkZWYuaCIgICAgICAgICBIQVZFX1NURERFRl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJkbGZjbi5oIiAgICAgICAgICBIQVZFX0RMRkNOX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm1hbGxvYy5oIiAgICAgICAgIEhBVkVfTUFMTE9DX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm1lbW9yeS5oIiAgICAgICAgIEhBVkVfTUVNT1JZX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGluZXQvaWZfZXRoZXIuaCIgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGludC5oIiAgICAgICAgSEFWRV9TVERJTlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic29ja2lvLmgiICAgICAgICBIQVZFX1NPQ0tJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdXRzbmFtZS5oIiAgIEhBVkVfU1lTX1VUU05BTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWRuYS5oIiAgICAgICAgICBIQVZFX0lETkFfSCkKCgoKY2hlY2tfdHlwZV9zaXplKHNpemVfdCAgU0laRU9GX1NJWkVfVCkKY2hlY2tfdHlwZV9zaXplKHNzaXplX3QgIFNJWkVPRl9TU0laRV9UKQpjaGVja190eXBlX3NpemUoImxvbmcgbG9uZyIgIFNJWkVPRl9MT05HX0xPTkcpCmNoZWNrX3R5cGVfc2l6ZSgibG9uZyIgIFNJWkVPRl9MT05HKQpjaGVja190eXBlX3NpemUoInNob3J0IiAgU0laRU9GX1NIT1JUKQpjaGVja190eXBlX3NpemUoImludCIgIFNJWkVPRl9JTlQpCmNoZWNrX3R5cGVfc2l6ZSgiX19pbnQ2NCIgIFNJWkVPRl9fX0lOVDY0KQpjaGVja190eXBlX3NpemUoImxvbmcgZG91YmxlIiAgU0laRU9GX0xPTkdfRE9VQkxFKQpjaGVja190eXBlX3NpemUoInRpbWVfdCIgIFNJWkVPRl9USU1FX1QpCmlmKE5PVCBIQVZFX1NJWkVPRl9TU0laRV9UKQogIGlmKFNJWkVPRl9MT05HIEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgICBzZXQoc3NpemVfdCBsb25nKQogIGVuZGlmKFNJWkVPRl9MT05HIEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgaWYoTk9UIHNzaXplX3QgQU5EIFNJWkVPRl9fX0lOVDY0IEVRVUFMIFNJWkVPRl9TSVpFX1QpCiAgICBzZXQoc3NpemVfdCBfX2ludDY0KQogIGVuZGlmKE5PVCBzc2l6ZV90IEFORCBTSVpFT0ZfX19JTlQ2NCBFUVVBTCBTSVpFT0ZfU0laRV9UKQplbmRpZihOT1QgSEFWRV9TSVpFT0ZfU1NJWkVfVCkKCiMgRGlmZmVyZW50IHNpemVvZnMsIGV0Yy4KCiMgICAgZGVmaW5lIENVUkxfU0laRU9GX0xPTkcgICAgICAgIDQKIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgbG9uZyBsb25nCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICJsbGQiCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICJsbHUiCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX09GRl9UICAgICAgICIlbGxkIgojICAgIGRlZmluZSBDVVJMX1NJWkVPRl9DVVJMX09GRl9UICA4CiMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgIExMCiMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIFVMTAoKc2V0KENVUkxfU0laRU9GX0xPTkcgJHtTSVpFT0ZfTE9OR30pCgppZihTSVpFT0ZfTE9ORyBFUVVBTCA4KQogIHNldChDVVJMX1RZUEVPRl9DVVJMX09GRl9UIGxvbmcpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgOCkKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibHUiKQogIHNldChDVVJMX0ZPUk1BVF9PRkZfVCAiJWxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTCkKZW5kaWYoU0laRU9GX0xPTkcgRVFVQUwgOCkKCmlmKFNJWkVPRl9MT05HX0xPTkcgRVFVQUwgOCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAibG9uZyBsb25nIikKICBzZXQoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA4KQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJsbGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibGx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsbGQiKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UIExMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTEwpCmVuZGlmKFNJWkVPRl9MT05HX0xPTkcgRVFVQUwgOCkKCmlmKE5PVCBDVVJMX1RZUEVPRl9DVVJMX09GRl9UKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX09GRl9UICR7c3NpemVfdH0pCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgJHtTSVpFT0ZfU1NJWkVfVH0pCiAgIyBUT0RPOiBuZWVkIGFkanVzdG1lbnQgaGVyZS4KICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibHUiKQogIHNldChDVVJMX0ZPUk1BVF9PRkZfVCAiJWxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBMVSkKZW5kaWYoTk9UIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QpCgppZihIQVZFX1NJWkVPRl9MT05HX0xPTkcpCiAgc2V0KEhBVkVfTE9OR0xPTkcgMSkKICBzZXQoSEFWRV9MTCAxKQplbmRpZihIQVZFX1NJWkVPRl9MT05HX0xPTkcpCgpmaW5kX2ZpbGUoUkFORE9NX0ZJTEUgdXJhbmRvbSAvZGV2KQptYXJrX2FzX2FkdmFuY2VkKFJBTkRPTV9GSUxFKQoKIyBDaGVjayBmb3Igc29tZSBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZAppZihIQVZFX0xJQldTMl8zMikKICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTIHdzMl8zMikKZWxzZWlmKEhBVkVfTElCU09DS0VUKQogIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgc29ja2V0KQplbmRpZigpCgpjaGVja19zeW1ib2xfZXhpc3RzKGJhc2VuYW1lICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfQkFTRU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc29ja2V0ICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TT0NLRVQpCmNoZWNrX3N5bWJvbF9leGlzdHMocG9sbCAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QT0xMKQpjaGVja19zeW1ib2xfZXhpc3RzKHNlbGVjdCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VMRUNUKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmR1cCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRFVQKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cnN0ciAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSU1RSKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cnRva19yICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSVE9LX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyZnRpbWUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJGVElNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyh1bmFtZSAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1VOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmNhc2VjbXAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSQ0FTRUNNUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJpY21wICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUklDTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyY21waSAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJDTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cm5jbXBpICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSTkNNUEkpCmNoZWNrX3N5bWJvbF9leGlzdHMoYWxhcm0gICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9BTEFSTSkKaWYoTk9UIEhBVkVfU1RSTkNNUEkpCiAgc2V0KEhBVkVfU1RSQ01QSSkKZW5kaWYoTk9UIEhBVkVfU1RSTkNNUEkpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0aG9zdGJ5YWRkciAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRIT1NUQllBRERSKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieWFkZHJfciAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRIT1NUQllBRERSX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0dGltZW9mZGF5ICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRUSU1FT0ZEQVkpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW5ldF9hZGRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JTkVUX0FERFIpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW5ldF9udG9hICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JTkVUX05UT0EpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW5ldF9udG9hX3IgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JTkVUX05UT0FfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyh0Y3NldGF0dHIgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1RDU0VUQVRUUikKY2hlY2tfc3ltYm9sX2V4aXN0cyh0Y2dldGF0dHIgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1RDR0VUQVRUUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhwZXJyb3IgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BFUlJPUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhjbG9zZXNvY2tldCAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0NMT1NFU09DS0VUKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldHZidWYgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUVkJVRikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdzZXRqbXAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR1NFVEpNUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRwYXNzX3IgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFBBU1NfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJsY2F0ICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkxDQVQpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cHd1aWQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRQV1VJRCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRldWlkICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEVVSUQpCmNoZWNrX3N5bWJvbF9leGlzdHModXRpbWUgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9VVElNRSkKaWYoQ01BS0VfVVNFX09QRU5TU0wpCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhSQU5EX3N0YXR1cyAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1JBTkRfU1RBVFVTKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoUkFORF9zY3JlZW4gICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9SQU5EX1NDUkVFTikKICBjaGVja19zeW1ib2xfZXhpc3RzKFJBTkRfZWdkICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUkFORF9FR0QpCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSAiJHtDVVJMX0lOQ0xVREVTfSIKICAgIEhBVkVfQ1JZUFRPX0NMRUFOVVBfQUxMX0VYX0RBVEEpCiAgaWYoSEFWRV9MSUJDUllQVE8gQU5EIEhBVkVfTElCU1NMKQogICAgc2V0KFVTRV9PUEVOU1NMIDEpCiAgZW5kaWYoSEFWRV9MSUJDUllQVE8gQU5EIEhBVkVfTElCU1NMKQplbmRpZihDTUFLRV9VU0VfT1BFTlNTTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnbXRpbWVfciAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dNVElNRV9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGxvY2FsdGltZV9yICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfTE9DQUxUSU1FX1IpCgpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieW5hbWUgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRIT1NUQllOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieW5hbWVfciAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRIT1NUQllOQU1FX1IpCgpjaGVja19zeW1ib2xfZXhpc3RzKHNpZ25hbCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0lHTkFMX0ZVTkMpCmNoZWNrX3N5bWJvbF9leGlzdHMoU0lHQUxSTSAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdOQUxfTUFDUk8pCmlmKEhBVkVfU0lHTkFMX0ZVTkMgQU5EIEhBVkVfU0lHTkFMX01BQ1JPKQogIHNldChIQVZFX1NJR05BTCAxKQplbmRpZihIQVZFX1NJR05BTF9GVU5DIEFORCBIQVZFX1NJR05BTF9NQUNSTykKY2hlY2tfc3ltYm9sX2V4aXN0cyh1bmFtZSAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9VTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJ0b2xsICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJUT0xMKQpjaGVja19zeW1ib2xfZXhpc3RzKF9zdHJ0b2k2NCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX19TVFJUT0k2NCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJlcnJvcl9yICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJFUlJPUl9SKQpjaGVja19zeW1ib2xfZXhpc3RzKHNpZ2ludGVycnVwdCAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR0lOVEVSUlVQVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhwZXJyb3IgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoZm9yayAgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRk9SSykKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRhZGRyaW5mbyAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRBRERSSU5GTykKY2hlY2tfc3ltYm9sX2V4aXN0cyhmcmVlYWRkcmluZm8gICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GUkVFQUREUklORk8pCmNoZWNrX3N5bWJvbF9leGlzdHMoZnJlZWlmYWRkcnMgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlJFRUlGQUREUlMpCmNoZWNrX3N5bWJvbF9leGlzdHMocGlwZSAgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUElQRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhmdHJ1bmNhdGUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GVFJVTkNBVEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cHJvdG9ieW5hbWUgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUUFJPVE9CWU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cmxpbWl0ICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUUkxJTUlUKQpjaGVja19zeW1ib2xfZXhpc3RzKGlkbl9mcmVlICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lETl9GUkVFKQpjaGVja19zeW1ib2xfZXhpc3RzKGlkbmFfc3RyZXJyb3IgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lETkFfU1RSRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHModGxkX3N0cmVycm9yICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVExEX1NUUkVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldGxvY2FsZSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVExPQ0FMRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXRybGltaXQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRVRSTElNSVQpCmNoZWNrX3N5bWJvbF9leGlzdHMoZmNudGwgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRkNOVEwpCmNoZWNrX3N5bWJvbF9leGlzdHMoaW9jdGwgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU9DVEwpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2V0c29ja29wdCAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUU09DS09QVCkKCiMgc3ltYm9sIGV4aXN0cyBpbiB3aW4zMiwgYnV0IGZ1bmN0aW9uIGRvZXMgbm90LgpjaGVja19mdW5jdGlvbl9leGlzdHMoaW5ldF9wdG9uIEhBVkVfSU5FVF9QVE9OKQoKIyBzaWdhY3Rpb24gYW5kIHNpZ3NldGptcCBhcmUgc3BlY2lhbC4gVXNlIHNwZWNpYWwgbWVjaGFuaXNtIGZvcgojIGRldGVjdGluZyB0aG9zZSwgYnV0IG9ubHkgaWYgcHJldmlvdXMgYXR0ZW1wdCBmYWlsZWQuCmlmKEhBVkVfU0lHTkFMX0gpCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdhY3Rpb24gInNpZ25hbC5oIiBIQVZFX1NJR0FDVElPTikKZW5kaWYoSEFWRV9TSUdOQUxfSCkKCmlmKE5PVCBIQVZFX1NJR1NFVEpNUCkKICBpZihIQVZFX1NFVEpNUF9IKQogICAgY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdzZXRqbXAgInNldGptcC5oIiBIQVZFX01BQ1JPX1NJR1NFVEpNUCkKICAgIGlmKEhBVkVfTUFDUk9fU0lHU0VUSk1QKQogICAgICBzZXQoSEFWRV9TSUdTRVRKTVAgMSkKICAgIGVuZGlmKEhBVkVfTUFDUk9fU0lHU0VUSk1QKQogIGVuZGlmKEhBVkVfU0VUSk1QX0gpCmVuZGlmKE5PVCBIQVZFX1NJR1NFVEpNUCkKCiMgSWYgdGhlcmUgaXMgbm8gc3RyaWNtcCgpLCBkbyBub3QgYWxsb3cgTERBUCB0byBwYXJzZSBVUkxzCmlmKE5PVCBIQVZFX1NUUklDTVApCiAgc2V0KEhBVkVfTERBUF9VUkxfUEFSU0UgMSkKZW5kaWYoTk9UIEhBVkVfU1RSSUNNUCkKCiMgRG8gY3VybCBzcGVjaWZpYyB0ZXN0cwpmb3JlYWNoKENVUkxfVEVTVAogICAgSEFWRV9GQ05UTF9PX05PTkJMT0NLCiAgICBIQVZFX0lPQ1RMU09DS0VUCiAgICBIQVZFX0lPQ1RMU09DS0VUX0NBTUVMCiAgICBIQVZFX0lPQ1RMU09DS0VUX0NBTUVMX0ZJT05CSU8KICAgIEhBVkVfSU9DVExTT0NLRVRfRklPTkJJTwogICAgSEFWRV9JT0NUTF9GSU9OQklPCiAgICBIQVZFX0lPQ1RMX1NJT0NHSUZBRERSCiAgICBIQVZFX1NFVFNPQ0tPUFRfU09fTk9OQkxPQ0sKICAgIEhBVkVfU09DS0FERFJfSU42X1NJTjZfU0NPUEVfSUQKICAgIFRJTUVfV0lUSF9TWVNfVElNRQogICAgSEFWRV9PX05PTkJMT0NLCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfN19SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzhfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zX1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNV9SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfUkVFTlRSQU5UCiAgICBIQVZFX1NPQ0tMRU5fVAogICAgSEFWRV9JTl9BRERSX1QKICAgIEhBVkVfQk9PTF9UCiAgICBTVERDX0hFQURFUlMKICAgIFJFVFNJR1RZUEVfVEVTVAogICAgSEFWRV9JTkVUX05UT0FfUl9ERUNMCiAgICBIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEFERFJJTkZPCiAgICBIQVZFX0ZJTEVfT0ZGU0VUX0JJVFMKICAgICkKICBjdXJsX2ludGVybmFsX3Rlc3QoJHtDVVJMX1RFU1R9KQplbmRmb3JlYWNoKENVUkxfVEVTVCkKaWYoSEFWRV9GSUxFX09GRlNFVF9CSVRTKQogIHNldChfRklMRV9PRkZTRVRfQklUUyA2NCkKZW5kaWYoSEFWRV9GSUxFX09GRlNFVF9CSVRTKQpmb3JlYWNoKENVUkxfVEVTVAogICAgSEFWRV9HTElCQ19TVFJFUlJPUl9SCiAgICBIQVZFX1BPU0lYX1NUUkVSUk9SX1IKICAgICkKICBjdXJsX2ludGVybmFsX3Rlc3RfcnVuKCR7Q1VSTF9URVNUfSkKZW5kZm9yZWFjaChDVVJMX1RFU1QpCgojIENoZWNrIGZvciByZWVudHJhbnQKZm9yZWFjaChDVVJMX1RFU1QKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzUKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzcKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzgKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzMKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzUKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzYKICAgIEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQpCiAgaWYoTk9UICR7Q1VSTF9URVNUfSkKICAgIGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgICAgIHNldChORUVEX1JFRU5UUkFOVCAxKQogICAgZW5kaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICBlbmRpZihOT1QgJHtDVVJMX1RFU1R9KQplbmRmb3JlYWNoKENVUkxfVEVTVCkKCmlmKE5FRURfUkVFTlRSQU5UKQogIGZvcmVhY2goQ1VSTF9URVNUCiAgICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzUKICAgICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNwogICAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84CiAgICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzMKICAgICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNQogICAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82KQogICAgc2V0KCR7Q1VSTF9URVNUfSAwKQogICAgaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICAgICAgc2V0KCR7Q1VSTF9URVNUfSAxKQogICAgZW5kaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICBlbmRmb3JlYWNoKENVUkxfVEVTVCkKZW5kaWYoTkVFRF9SRUVOVFJBTlQpCgppZihIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UKQogIHNldChIQVZFX0lORVRfTlRPQV9SX0RFQ0wgMSkKICBzZXQoTkVFRF9SRUVOVFJBTlQgMSkKZW5kaWYoSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVCkKCiMgU29tZSBvdGhlciBtaW5vciB0ZXN0cwoKaWYoTk9UIEhBVkVfSU5fQUREUl9UKQogIHNldChpbl9hZGRyX3QgInVuc2lnbmVkIGxvbmciKQplbmRpZihOT1QgSEFWRV9JTl9BRERSX1QpCgojIEZpeCBsaWJ6IC8gemxpYi5oCgppZihOT1QgQ1VSTF9TUEVDSUFMX0xJQlopCiAgaWYoTk9UIEhBVkVfTElCWikKICAgIHNldChIQVZFX1pMSUJfSCAwKQogIGVuZGlmKE5PVCBIQVZFX0xJQlopCgogIGlmKE5PVCBIQVZFX1pMSUJfSCkKICAgIHNldChIQVZFX0xJQlogMCkKICBlbmRpZihOT1QgSEFWRV9aTElCX0gpCmVuZGlmKE5PVCBDVVJMX1NQRUNJQUxfTElCWikKCmlmKF9GSUxFX09GRlNFVF9CSVRTKQogIHNldChfRklMRV9PRkZTRVRfQklUUyA2NCkKZW5kaWYoX0ZJTEVfT0ZGU0VUX0JJVFMpCnNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiLURfRklMRV9PRkZTRVRfQklUUz02NCIpCnNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY3VybC9jdXJsLmgiKQpjaGVja190eXBlX3NpemUoImN1cmxfb2ZmX3QiIFNJWkVPRl9DVVJMX09GRl9UKQpzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUykKc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTKQoKCiMgQ2hlY2sgZm9yIG5vbmJsb2NraW5nCnNldChIQVZFX0RJU0FCTEVEX05PTkJMT0NLSU5HIDEpCmlmKEhBVkVfRklPTkJJTyBPUgogICAgSEFWRV9JT0NUTFNPQ0tFVCBPUgogICAgSEFWRV9JT0NUTFNPQ0tFVF9DQVNFIE9SCiAgICBIQVZFX09fTk9OQkxPQ0spCiAgc2V0KEhBVkVfRElTQUJMRURfTk9OQkxPQ0tJTkcpCmVuZGlmKEhBVkVfRklPTkJJTyBPUgogIEhBVkVfSU9DVExTT0NLRVQgT1IKICBIQVZFX0lPQ1RMU09DS0VUX0NBU0UgT1IKICBIQVZFX09fTk9OQkxPQ0spCgppZihSRVRTSUdUWVBFX1RFU1QpCiAgc2V0KFJFVFNJR1RZUEUgdm9pZCkKZWxzZShSRVRTSUdUWVBFX1RFU1QpCiAgc2V0KFJFVFNJR1RZUEUgaW50KQplbmRpZihSRVRTSUdUWVBFX1RFU1QpCgppZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBBTkQgQVBQTEUpCiAgaW5jbHVkZShDaGVja0NDb21waWxlckZsYWcpCiAgY2hlY2tfY19jb21waWxlcl9mbGFnKC1Xbm8tbG9uZy1kb3VibGUgSEFWRV9DX0ZMQUdfV25vX2xvbmdfZG91YmxlKQogIGlmKEhBVkVfQ19GTEFHX1dub19sb25nX2RvdWJsZSkKICAgICMgVGhlIE1hYyB2ZXJzaW9uIG9mIEdDQyB3YXJucyBhYm91dCB1c2Ugb2YgbG9uZyBkb3VibGUuICBEaXNhYmxlIGl0LgogICAgZ2V0X3NvdXJjZV9maWxlX3Byb3BlcnR5KE1QUklOVEZfQ09NUElMRV9GTEFHUyBtcHJpbnRmLmMgQ09NUElMRV9GTEFHUykKICAgIGlmKE1QUklOVEZfQ09NUElMRV9GTEFHUykKICAgICAgc2V0KE1QUklOVEZfQ09NUElMRV9GTEFHUyAiJHtNUFJJTlRGX0NPTVBJTEVfRkxBR1N9IC1Xbm8tbG9uZy1kb3VibGUiKQogICAgZWxzZShNUFJJTlRGX0NPTVBJTEVfRkxBR1MpCiAgICAgIHNldChNUFJJTlRGX0NPTVBJTEVfRkxBR1MgIi1Xbm8tbG9uZy1kb3VibGUiKQogICAgZW5kaWYoTVBSSU5URl9DT01QSUxFX0ZMQUdTKQogICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKG1wcmludGYuYyBQUk9QRVJUSUVTCiAgICAgIENPTVBJTEVfRkxBR1MgJHtNUFJJTlRGX0NPTVBJTEVfRkxBR1N9KQogIGVuZGlmKEhBVkVfQ19GTEFHX1dub19sb25nX2RvdWJsZSkKZW5kaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgQU5EIEFQUExFKQoKaWYoSEFWRV9TT0NLTEVOX1QpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UICJzb2NrbGVuX3QiKQogIGlmKFdJTjMyKQogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgIndpbnNvY2syLmg7d3MydGNwaXAuaCIpCiAgZWxzZWlmKEhBVkVfU1lTX1NPQ0tFVF9IKQogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgInN5cy9zb2NrZXQuaCIpCiAgZW5kaWYoKQogIGNoZWNrX3R5cGVfc2l6ZSgic29ja2xlbl90IiBDVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCkKICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUykKICBpZihOT1QgSEFWRV9DVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCkKICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IKICAgICAiQ2hlY2sgZm9yIHNpemVvZiBzb2NrbGVuX3QgZmFpbGVkLCBzZWUgQ01ha2VGaWxlcy9DTWFrZXJyb3IubG9nIikKICBlbmRpZigpCmVsc2UoKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UICR7U0laRU9GX0lOVH0pCmVuZGlmKCkKCiMgVE9ETyB0ZXN0IHdoaWNoIG9mIHRoZXNlIGhlYWRlcnMgYXJlIHJlcXVpcmVkIGZvciB0aGUgdHlwZWRlZnMgdXNlZCBpbiBjdXJsYnVpbGQuaAppZihXSU4zMikKICBzZXQoQ1VSTF9QVUxMX1dTMlRDUElQX0ggJHtIQVZFX1dTMlRDUElQX0h9KQplbHNlKCkKICBzZXQoQ1VSTF9QVUxMX1NZU19UWVBFU19IICR7SEFWRV9TWVNfVFlQRVNfSH0pCiAgc2V0KENVUkxfUFVMTF9TWVNfU09DS0VUX0ggJHtIQVZFX1NZU19TT0NLRVRfSH0pCiAgc2V0KENVUkxfUFVMTF9TWVNfUE9MTF9IICR7SEFWRV9TWVNfUE9MTF9IfSkKZW5kaWYoKQpzZXQoQ1VSTF9QVUxMX1NURElOVF9IICR7SEFWRV9TVERJTlRfSH0pCnNldChDVVJMX1BVTExfSU5UVFlQRVNfSCAke0hBVkVfSU5UVFlQRVNfSH0pCgppbmNsdWRlKENNYWtlL090aGVyVGVzdHMuY21ha2UpCgphZGRfZGVmaW5pdGlvbnMoLURIQVZFX0NPTkZJR19IKQoKIyBGb3Igd2luZG93cywgZG8gbm90IGFsbG93IHRoZSBjb21waWxlciB0byB1c2UgZGVmYXVsdCB0YXJnZXQgKFZpc3RhKS4KaWYoV0lOMzIpCiAgYWRkX2RlZmluaXRpb25zKC1EX1dJTjMyX1dJTk5UPTB4MDUwMSkKZW5kaWYoV0lOMzIpCgppZihNU1ZDKQogIGFkZF9kZWZpbml0aW9ucygtRF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAtRF9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEUpCmVuZGlmKE1TVkMpCgojIFVnbHkgKGJ1dCBmdW5jdGlvbmFsKSB3YXkgdG8gaW5jbHVkZSAiTWFrZWZpbGUuaW5jIiBieSB0cmFuc2Zvcm1pbmcgaXQgKD0gcmVnZW5lcmF0ZSBpdCkuCmZ1bmN0aW9uKFRSQU5TRk9STV9NQUtFRklMRV9JTkMgSU5QVVRfRklMRSBPVVRQVVRfRklMRSkKICBmaWxlKFJFQUQgJHtJTlBVVF9GSUxFfSBNQUtFRklMRV9JTkNfVEVYVCkKICBzdHJpbmcoUkVQTEFDRSAiJCh0b3Bfc3JjZGlyKSIgICAiXCR7Q1VSTF9TT1VSQ0VfRElSfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCiAgc3RyaW5nKFJFUExBQ0UgIiQodG9wX2J1aWxkZGlyKSIgIlwke0NVUkxfQklOQVJZX0RJUn0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQoKICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXFxcXFxuIiAipyGnIiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiKFthLXpBLVpfXVthLXpBLVowLTlfXSopW1x0IF0qPVtcdCBdKihbXlxuXSopIiAiU0VUKFxcMSBcXDIpIiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKICBzdHJpbmcoUkVQTEFDRSAipyGnIiAiXG4iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQoKICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXFwkXFwoKFthLXpBLVpfXVthLXpBLVowLTlfXSopXFwpIiAiXCR7XFwxfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pICAgICMgUmVwbGFjZSAkKCkgd2l0aCAke30KICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiQChbYS16QS1aX11bYS16QS1aMC05X10qKUAiICJcJHtcXDF9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkgICAgIyBSZXBsYWNlIEBAIHdpdGggJHt9LCBldmVuIGlmIHRoYXQgbWF5IG5vdCBiZSByZWFkIGJ5IENNYWtlIHNjcmlwdHMuCiAgZmlsZShXUklURSAke09VVFBVVF9GSUxFfSAke01BS0VGSUxFX0lOQ19URVhUfSkKCmVuZGZ1bmN0aW9uKCkKCmFkZF9zdWJkaXJlY3RvcnkobGliKQppZihCVUlMRF9DVVJMX0VYRSkKICBhZGRfc3ViZGlyZWN0b3J5KHNyYykKZW5kaWYoKQppZihCVUlMRF9DVVJMX1RFU1RTKQogIGFkZF9zdWJkaXJlY3RvcnkodGVzdHMpCmVuZGlmKCkKCiMgVE9ETyBzdXBwb3J0IEdOVVRMUywgTlNTLCBQT0xBUlNTTCwgQVhUTFMsIENZQVNTTCwgV0lOU1NMLCBEQVJXSU5TU0wKaWYoVVNFX09QRU5TU0wpCiAgc2V0KFNTTF9FTkFCTEVEIDEpCmVuZGlmKCkKCiMgSGVscGVyIHRvIHBvcHVsYXRlIGEgbGlzdCAoX2l0ZW1zKSB3aXRoIGEgbGFiZWwgd2hlbiBjb25kaXRpb25zICh0aGUgcmVtYWluaW5nCiMgYXJncykgYXJlIHNhdGlzZmllZApmdW5jdGlvbihfYWRkX2lmIGxhYmVsKQogICMgVE9ETyBuZWVkIHRvIGRpc2FibGUgcG9saWN5IENNUDAwNTQgKENNYWtlIDMuMSkgdG8gYWxsb3cgdGhpcyBpbmRpcmVjdGlvbgogIGlmKCR7QVJHTn0pCiAgICBzZXQoX2l0ZW1zICR7X2l0ZW1zfSAiJHtsYWJlbH0iIFBBUkVOVF9TQ09QRSkKICBlbmRpZigpCmVuZGZ1bmN0aW9uKCkKCiMgQ2xlYXIgbGlzdCBhbmQgdHJ5IHRvIGRldGVjdCBhdmFpbGFibGUgZmVhdHVyZXMKc2V0KF9pdGVtcykKX2FkZF9pZigiV2luU1NMIiAgICAgICAgU1NMX0VOQUJMRUQgQU5EIFVTRV9XSU5ET1dTX1NTUEkpCl9hZGRfaWYoIk9wZW5TU0wiICAgICAgIFNTTF9FTkFCTEVEIEFORCBVU0VfT1BFTlNTTCkKX2FkZF9pZigiSVB2NiIgICAgICAgICAgRU5BQkxFX0lQVjYpCl9hZGRfaWYoInVuaXgtc29ja2V0cyIgIFVTRV9VTklYX1NPQ0tFVFMpCl9hZGRfaWYoImxpYnoiICAgICAgICAgIEhBVkVfTElCWikKX2FkZF9pZigiQXN5bmNoRE5TIiAgICAgVVNFX0FSRVMgT1IgVVNFX1RIUkVBRFNfUE9TSVgpCl9hZGRfaWYoIklETiIgICAgICAgICAgIEhBVkVfTElCSUROKQojIFRPRE8gU1NQMSAoV2luU1NMKSBjaGVjayBpcyBtaXNzaW5nCl9hZGRfaWYoIlNTUEkiICAgICAgICAgIFVTRV9XSU5ET1dTX1NTUEkpCl9hZGRfaWYoIkdTUy1BUEkiICAgICAgIEhBVkVfR1NTQVBJKQojIFRPRE8gU1NQMSBtaXNzaW5nIGZvciBTUE5FR08KX2FkZF9pZigiU1BORUdPIiAgICAgICAgTk9UIENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCBBTkQKICAgICAgICAgICAgICAgICAgICAgICAgKEhBVkVfR1NTQVBJIE9SIFVTRV9XSU5ET1dTX1NTUEkpKQpfYWRkX2lmKCJLZXJiZXJvcyIgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIIEFORAogICAgICAgICAgICAgICAgICAgICAgICAoSEFWRV9HU1NBUEkgT1IgVVNFX1dJTkRPV1NfU1NQSSkpCiMgTlRMTSBzdXBwb3J0IHJlcXVpcmVzIGNyeXB0byBmdW5jdGlvbiBhZGFwdGlvbnMgZnJvbSB2YXJpb3VzIFNTTCBsaWJzCiMgVE9ETyBhbHRlcm5hdGl2ZSBTU0wgbGlicyB0ZXN0cyBmb3IgU1NQMSwgR05VVExTLCBOU1MsIERBUldJTlNTTAppZihOT1QgQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIIEFORCAoVVNFX09QRU5TU0wgT1IKICAgVVNFX1dJTkRPV1NfU1NQSSBPUiBHTlVUTFNfRU5BQkxFRCBPUiBOU1NfRU5BQkxFRCBPUiBEQVJXSU5TU0xfRU5BQkxFRCkpCiAgX2FkZF9pZigiTlRMTSIgICAgICAgIDEpCiAgIyBUT0RPIG1pc3Npbmcgb3B0aW9uIChhdXRvY29uZjogLS1lbmFibGUtbnRsbS13YikKICBfYWRkX2lmKCJOVExNX1dCIiAgICAgTk9UIENVUkxfRElTQUJMRV9IVFRQIEFORCBOVExNX1dCX0VOQUJMRUQpCmVuZGlmKCkKIyBUT0RPIG1pc3Npbmcgb3B0aW9uICgtLWVuYWJsZS10bHMtc3JwKSwgZGVwZW5kcyBvbiBHTlVUTFNfU1JQL09QRU5TU0xfU1JQCl9hZGRfaWYoIlRMUy1TUlAiICAgICAgIFVTRV9UTFNfU1JQKQojIFRPRE8gb3B0aW9uIC0td2l0aC1uZ2h0dHAyIHRlc3RzIGZvciBuZ2h0dHAyIGxpYiBhbmQgbmdodHRwMi9uZ2h0dHAyLmggaGVhZGVyCl9hZGRfaWYoIkhUVFAyIiAgICAgICAgIFVTRV9OR0hUVFAyKQpzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIFNVUFBPUlRfRkVBVFVSRVMgIiR7X2l0ZW1zfSIpCm1lc3NhZ2UoU1RBVFVTICJFbmFibGVkIGZlYXR1cmVzOiAke1NVUFBPUlRfRkVBVFVSRVN9IikKCiMgQ2xlYXIgbGlzdCBhbmQgdHJ5IHRvIGRldGVjdCBhdmFpbGFibGUgcHJvdG9jb2xzCnNldChfaXRlbXMpCl9hZGRfaWYoIkhUVFAiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfSFRUUCkKX2FkZF9pZigiSFRUUFMiICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9IVFRQIEFORCBTU0xfRU5BQkxFRCkKX2FkZF9pZigiRlRQIiAgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9GVFApCl9hZGRfaWYoIkZUUFMiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfRlRQIEFORCBTU0xfRU5BQkxFRCkKX2FkZF9pZigiRklMRSIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9GSUxFKQpfYWRkX2lmKCJURUxORVQiICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1RFTE5FVCkKX2FkZF9pZigiTERBUCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9MREFQKQojIENVUkxfRElTQUJMRV9MREFQIGltcGxpZXMgQ1VSTF9ESVNBQkxFX0xEQVBTCiMgVE9ETyBjaGVjayBIQVZFX0xEQVBfU1NMIChpbiBhdXRvY29uZiB0aGlzIGlzIGVuYWJsZWQgd2l0aCAtLWVuYWJsZS1sZGFwcykKX2FkZF9pZigiTERBUFMiICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9MREFQUyBBTkQKICAgICAgICAgICAgICAgICAgICAgICAgKChVU0VfT1BFTkxEQVAgQU5EIFNTTF9FTkFCTEVEKSBPUgogICAgICAgICAgICAgICAgICAgICAgICAoTk9UIFVTRV9PUEVOTERBUCBBTkQgSEFWRV9MREFQX1NTTCkpKQpfYWRkX2lmKCJESUNUIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0RJQ1QpCl9hZGRfaWYoIlRGVFAiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfVEZUUCkKX2FkZF9pZigiR09QSEVSIiAgICAgICAgTk9UIENVUkxfRElTQUJMRV9HT1BIRVIpCl9hZGRfaWYoIlBPUDMiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfUE9QMykKX2FkZF9pZigiUE9QM1MiICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9QT1AzIEFORCBTU0xfRU5BQkxFRCkKX2FkZF9pZigiSU1BUCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9JTUFQKQpfYWRkX2lmKCJJTUFQUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0lNQVAgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJTTVRQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1NNVFApCl9hZGRfaWYoIlNNVFBTIiAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfU01UUCBBTkQgU1NMX0VOQUJMRUQpCl9hZGRfaWYoIlNDUCIgICAgICAgICAgIFVTRV9MSUJTU0gyKQpfYWRkX2lmKCJTRlRQIiAgICAgICAgICBVU0VfTElCU1NIMikKX2FkZF9pZigiUlRTUCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9SVFNQKQpfYWRkX2lmKCJSVE1QIiAgICAgICAgICBVU0VfTElCUlRNUCkKbGlzdChTT1JUIF9pdGVtcykKc3RyaW5nKFJFUExBQ0UgIjsiICIgIiBTVVBQT1JUX1BST1RPQ09MUyAiJHtfaXRlbXN9IikKbWVzc2FnZShTVEFUVVMgIkVuYWJsZWQgcHJvdG9jb2xzOiAke1NVUFBPUlRfUFJPVE9DT0xTfSIpCgojIGN1cmwtY29uZmlnIG5lZWRzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBiZSBzZXQuCnNldChDQyAgICAgICAgICAgICAgICAgICAgICAiJHtDTUFLRV9DX0NPTVBJTEVSfSIpCiMgVE9ETyBwcm9iYWJseSBwdXQgYSAtRC4uLiBvcHRpb25zIGhlcmU/CnNldChDT05GSUdVUkVfT1BUSU9OUyAgICAgICAiIikKIyBUT0RPIHdoZW4gdG8gc2V0ICItRENVUkxfU1RBVElDTElCIiBmb3IgQ1BQRkxBR19DVVJMX1NUQVRJQ0xJQj8Kc2V0KENQUEZMQUdfQ1VSTF9TVEFUSUNMSUIgICIiKQojIFRPRE8gbmVlZCB0byBzZXQgdGhpcyAoc2VlIENVUkxfQ0hFQ0tfQ0FfQlVORExFIGluIGFjaW5jbHVkZS5tNCkKc2V0KENVUkxfQ0FfQlVORExFICAgICAgICAgICIiKQpzZXQoQ1VSTFZFUlNJT04gICAgICAgICAgICAgIiR7Q1VSTF9WRVJTSU9OfSIpCnNldChFTkFCTEVfU0hBUkVEICAgICAgICAgICAieWVzIikKaWYoQ1VSTF9TVEFUSUNMSUIpCiAgIyBCcm9rZW46IExJQkNVUkxfTElCUyBiZWxvdzsgLmEgbGliIGlzIG5vdCBidWlsdAogIG1lc3NhZ2UoV0FSTklORyAiU3RhdGljIGxpbmtpbmcgaXMgYnJva2VuISIpCiAgc2V0KEVOQUJMRV9TVEFUSUMgICAgICAgICAibm8iKQplbHNlKCkKICBzZXQoRU5BQkxFX1NUQVRJQyAgICAgICAgICJubyIpCmVuZGlmKCkKc2V0KGV4ZWNfcHJlZml4ICAgICAgICAgICAgICJcJHtwcmVmaXh9IikKc2V0KGluY2x1ZGVkaXIgICAgICAgICAgICAgICJcJHtwcmVmaXh9L2luY2x1ZGUiKQpzZXQoTERGTEFHUyAgICAgICAgICAgICAgICAgIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU30iKQpzZXQoTElCQ1VSTF9MSUJTICAgICAgICAgICAgIiIpCnNldChsaWJkaXIgICAgICAgICAgICAgICAgICAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vbGliIikKIyBUT0RPIENVUkxfTElCUyBhbHNvIGNvbnRhaW5zIGFic29sdXRlIHBhdGhzIHdoaWNoIGRvbid0IHdvcmsgd2l0aCBzdGF0aWMgLWwuLi4KZm9yZWFjaChfbGliICR7Q01BS0VfQ19JTVBMSUNJVF9MSU5LX0xJQlJBUklFU30gJHtDVVJMX0xJQlN9KQogIHNldChMSUJDVVJMX0xJQlMgICAgICAgICAgIiR7TElCQ1VSTF9MSUJTfSAtbCR7X2xpYn0iKQplbmRmb3JlYWNoKCkKIyAiYSIgKExpbnV4KSBvciAibGliIiAoV2luZG93cykKc3RyaW5nKFJFUExBQ0UgIi4iICIiIGxpYmV4dCAiJHtDTUFLRV9TVEFUSUNfTElCUkFSWV9TVUZGSVh9IikKc2V0KHByZWZpeCAgICAgICAgICAgICAgICAgICIke0NNQUtFX0lOU1RBTExfUFJFRklYfSIpCiMgU2V0IHRoaXMgdG8gInllcyIgdG8gYXBwZW5kIGFsbCBsaWJyYXJpZXMgb24gd2hpY2ggLWxjdXJsIGlzIGRlcGVuZGVudApzZXQoUkVRVUlSRV9MSUJfREVQUyAgICAgICAgIm5vIikKIyBTVVBQT1JUX0ZFQVRVUkVTCiMgU1VQUE9SVF9QUk9UT0NPTFMKc2V0KFZFUlNJT05OVU0gICAgICAgICAgICAgICIke0NVUkxfVkVSU0lPTl9OVU19IikKCiMgRmluYWxseSBnZW5lcmF0ZSBhICJjdXJsLWNvbmZpZyIgbWF0Y2hpbmcgdGhpcyBjb25maWcKY29uZmlndXJlX2ZpbGUoIiR7Q1VSTF9TT1VSQ0VfRElSfS9jdXJsLWNvbmZpZy5pbiIKICAgICAgICAgICAgICAgIiR7Q1VSTF9CSU5BUllfRElSfS9jdXJsLWNvbmZpZyIgQE9OTFkpCmluc3RhbGwoRklMRVMgIiR7Q1VSTF9CSU5BUllfRElSfS9jdXJsLWNvbmZpZyIKICAgICAgICBERVNUSU5BVElPTiBiaW4KICAgICAgICBQRVJNSVNTSU9OUwogICAgICAgICAgT1dORVJfUkVBRCBPV05FUl9XUklURSBPV05FUl9FWEVDVVRFCiAgICAgICAgICBHUk9VUF9SRUFEIEdST1VQX0VYRUNVVEUKICAgICAgICAgIFdPUkxEX1JFQUQgV09STERfRVhFQ1VURSkKCiMgRmluYWxseSBnZW5lcmF0ZSBhIHBrZy1jb25maWcgZmlsZSBtYXRjaGluZyB0aGlzIGNvbmZpZwpjb25maWd1cmVfZmlsZSgiJHtDVVJMX1NPVVJDRV9ESVJ9L2xpYmN1cmwucGMuaW4iCiAgICAgICAgICAgICAgICIke0NVUkxfQklOQVJZX0RJUn0vbGliY3VybC5wYyIgQE9OTFkpCmluc3RhbGwoRklMRVMgIiR7Q1VSTF9CSU5BUllfRElSfS9saWJjdXJsLnBjIgogICAgICAgIERFU1RJTkFUSU9OIGxpYi9wa2djb25maWcpCgojIFRoaXMgbmVlZHMgdG8gYmUgcnVuIHZlcnkgbGFzdCBzbyBvdGhlciBwYXJ0cyBvZiB0aGUgc2NyaXB0cyBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcy4KaWYoTk9UIENVUkxfQ09ORklHX0hBU19CRUVOX1JVTl9CRUZPUkUpCiAgc2V0KENVUkxfQ09ORklHX0hBU19CRUVOX1JVTl9CRUZPUkUgMSBDQUNIRSBJTlRFUk5BTCAiRmxhZyB0byB0cmFjayB3aGV0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgcnVubmluZyBDTWFrZSBvciBpZiBDTWFrZSBoYXMgYmVlbiBjb25maWd1cmVkIGJlZm9yZSIpCmVuZGlmKCkKCiMgSW5zdGFsbGF0aW9uLgojIEZpcnN0LCBpbnN0YWxsIGdlbmVyYXRlZCBjdXJsYnVpbGQuaAppbnN0YWxsKEZJTEVTICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaW5jbHVkZS9jdXJsL2N1cmxidWlsZC5oIgogICAgREVTVElOQVRJT04gaW5jbHVkZS9jdXJsICkKIyBOZXh0LCBpbnN0YWxsIG90aGVyIGhlYWRlcnMgZXhjbHVkaW5nIGN1cmxidWlsZC5oCmluc3RhbGwoRElSRUNUT1JZICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaW5jbHVkZS9jdXJsIgogICAgREVTVElOQVRJT04gaW5jbHVkZQogICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5oIgogICAgUEFUVEVSTiAiY3VybGJ1aWxkLmgiIEVYQ0xVREUpCgoKIyBXb3JrYXJvdW5kIGZvciBNU1ZTMTAgdG8gYXZvaWQgdGhlIERpYWxvZyBIZWxsCiMgRklYTUU6IFRoaXMgY291bGQgYmUgcmVtb3ZlZCB3aXRoIGZ1dHVyZSB2ZXJzaW9uIG9mIENNYWtlLgppZihNU1ZDX1ZFUlNJT04gRVFVQUwgMTYwMCkKICBzZXQoQ1VSTF9TTE5fRklMRU5BTUUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9DVVJMLnNsbiIpCiAgaWYoRVhJU1RTICIke0NVUkxfU0xOX0ZJTEVOQU1FfSIpCiAgICBmaWxlKEFQUEVORCAiJHtDVVJMX1NMTl9GSUxFTkFNRX0iICJcbiMgVGhpcyBzaG91bGQgYmUgcmVnZW5lcmF0ZWQhXG4iKQogIGVuZGlmKCkKZW5kaWYoKQo=