IyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KIyAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKIwojIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTYsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAojIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKIyBhcmUgYWxzbyBhdmFpbGFibGUgYXQgaHR0cHM6Ly9jdXJsLmhheHguc2UvZG9jcy9jb3B5cmlnaHQuaHRtbC4KIwojIFlvdSBtYXkgb3B0IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSBhbmQvb3Igc2VsbAojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwojIGZ1cm5pc2hlZCB0byBkbyBzbywgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDT1BZSU5HIGZpbGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCiMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBjdXJsL2xpYmN1cmwgQ01ha2Ugc2NyaXB0CiMgYnkgVGV0ZXRlc3QgYW5kIFN1a2VuZGVyIChCZW5vaXQgTmVpbCkKCiMgVE9ETzoKIyBUaGUgb3V0cHV0IC5zbyBmaWxlIGxhY2tzIHRoZSBzb25hbWUgbnVtYmVyIHdoaWNoIHdlIGN1cnJlbnRseSBoYXZlIHdpdGhpbiB0aGUgbGliL01ha2VmaWxlLmFtIGZpbGUKIyBBZGQgZnVsbCAoNCBvciA1IGxpYnMpIFNTTCBzdXBwb3J0CiMgQWRkIElOU1RBTEwgdGFyZ2V0IChFWFRSQV9ESVNUIHZhcmlhYmxlcyBpbiBNYWtlZmlsZS5hbSBtYXkgYmUgbW92ZWQgdG8gTWFrZWZpbGUuaW5jIHNvIHRoYXQgQ01ha2UvQ1BhY2sgaXMgYXdhcmUgb2Ygd2hhdCdzIHRvIGluY2x1ZGUpLgojIEFkZCBDVGVzdHMoPykKIyBDaGVjayBvbiBhbGwgcG9zc2libGUgcGxhdGZvcm1zCiMgVGVzdCB3aXRoIGFzIG1hbnkgY29uZmlndXJhdGlvbnMgcG9zc2libGUgKFdpdGggb3Igd2l0aG91dCBhbnkgb3B0aW9uKQojIENyZWF0ZSBzY3JpcHRzIHRoYXQgaGVscCBrZWVwaW5nIHRoZSBDTWFrZSBidWlsZCBzeXN0ZW0gdXAgdG8gZGF0ZSAodG8gcmVkdWNlIG1haW50ZW5hbmNlKS4gQWNjb3JkaW5nIHRvIFRldGV0ZXN0OgojICAtIGxpc3RzIG9mIGhlYWRlcnMgdGhhdCAnY29uZmlndXJlJyBjaGVja3MgZm9yOwojICAtIGN1cmwtc3BlY2lmaWMgdGVzdHMgKHRoZSBvbmVzIHRoYXQgYXJlIGluIG00L2N1cmwtKi5tNCBmaWxlcyk7CiMgIC0gKG1vc3Qgb2J2aW91cyB0aGluZzopIGN1cmwgdmVyc2lvbiBudW1iZXJzLgojIEFkZCBkb2N1bWVudGF0aW9uIHN1YnByb2plY3QKIwojIFRvIGNoZWNrOgojIChGcm9tIERhbmllbCBTdGVuYmVyZykgVGhlIGNtYWtlIGJ1aWxkIHNlbGVjdGVkIHRvIHJ1biBnY2Mgd2l0aCAtZlBJQyBvbiBteSBib3ggd2hpbGUgdGhlIHBsYWluIGNvbmZpZ3VyZSBzY3JpcHQgZGlkIG5vdC4KIyAoRnJvbSBEYW5pZWwgU3RlbmJlcmcpIFRoZSBnY2MgY29tbWFuZCBsaW5lIHVzZSBuZWl0aGVyIC1nIG5vciBhbnkgLU8gb3B0aW9ucy4gQXMgYSBkZXZlbG9wZXIsIEkgYWxzbyB0cmVhc3VyZSBvdXIgY29uZmlndXJlIHNjcmlwdHMncyAtLWVuYWJsZS1kZWJ1ZyBvcHRpb24gdGhhdCBzZXRzIGEgbG9uZyByYW5nZSBvZiAicGlja3kiIGNvbXBpbGVyIG9wdGlvbnMuCmNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjggRkFUQUxfRVJST1IpCnNldChDTUFLRV9NT0RVTEVfUEFUSCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NNYWtlOyR7Q01BS0VfTU9EVUxFX1BBVEh9IikKaW5jbHVkZShVdGlsaXRpZXMpCmluY2x1ZGUoTWFjcm9zKQppbmNsdWRlKENNYWtlRGVwZW5kZW50T3B0aW9uKQoKcHJvamVjdCggQ1VSTCBDICkKCm1lc3NhZ2UoV0FSTklORyAidGhlIGN1cmwgY21ha2UgYnVpbGQgc3lzdGVtIGlzIHBvb3JseSBtYWludGFpbmVkLiBCZSBhd2FyZSIpCgpmaWxlIChSRUFEICR7Q1VSTF9TT1VSQ0VfRElSfS9pbmNsdWRlL2N1cmwvY3VybHZlci5oIENVUkxfVkVSU0lPTl9IX0NPTlRFTlRTKQpzdHJpbmcgKFJFR0VYIE1BVENIICIjZGVmaW5lIExJQkNVUkxfVkVSU0lPTiBcIlteXCJdKiIKICBDVVJMX1ZFUlNJT04gJHtDVVJMX1ZFUlNJT05fSF9DT05URU5UU30pCnN0cmluZyAoUkVHRVggUkVQTEFDRSAiW15cIl0rXCIiICIiIENVUkxfVkVSU0lPTiAke0NVUkxfVkVSU0lPTn0pCnN0cmluZyAoUkVHRVggTUFUQ0ggIiNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OX05VTSAweFswLTlhLWZBLUZdKyIKICBDVVJMX1ZFUlNJT05fTlVNICR7Q1VSTF9WRVJTSU9OX0hfQ09OVEVOVFN9KQpzdHJpbmcgKFJFR0VYIFJFUExBQ0UgIlteMF0rMHgiICIiIENVUkxfVkVSU0lPTl9OVU0gJHtDVVJMX1ZFUlNJT05fTlVNfSkKCmluY2x1ZGVfcmVndWxhcl9leHByZXNzaW9uKCJeLiokIikgICAgIyBTdWtlbmRlcjogSXMgaXQgbmVjZXNzYXJ5PwoKIyBTZXR1cCBwYWNrYWdlIG1ldGEtZGF0YQojIFNFVChQQUNLQUdFICJjdXJsIikKbWVzc2FnZShTVEFUVVMgImN1cmwgdmVyc2lvbj1bJHtDVVJMX1ZFUlNJT059XSIpCiMgU0VUKFBBQ0tBR0VfVEFSTkFNRSAiY3VybCIpCiMgU0VUKFBBQ0tBR0VfTkFNRSAiY3VybCIpCiMgU0VUKFBBQ0tBR0VfVkVSU0lPTiAiLSIpCiMgU0VUKFBBQ0tBR0VfU1RSSU5HICJjdXJsLSIpCiMgU0VUKFBBQ0tBR0VfQlVHUkVQT1JUICJhIHN1aXRhYmxlIGN1cmwgbWFpbGluZyBsaXN0ID0+IGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvIikKc2V0KE9QRVJBVElOR19TWVNURU0gIiR7Q01BS0VfU1lTVEVNX05BTUV9IikKc2V0KE9TICJcIiR7Q01BS0VfU1lTVEVNX05BTUV9XCIiKQoKaW5jbHVkZV9kaXJlY3Rvcmllcygke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9jdXJsKQppbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NVUkxfU09VUkNFX0RJUn0vaW5jbHVkZSApCgpvcHRpb24oQlVJTERfQ1VSTF9FWEUgIlNldCB0byBPTiB0byBidWlsZCBjdXJsIGV4ZWN1dGFibGUuIiBPTikKb3B0aW9uKENVUkxfU1RBVElDTElCICJTZXQgdG8gT04gdG8gYnVpbGQgbGliY3VybCB3aXRoIHN0YXRpYyBsaW5raW5nLiIgT0ZGKQpvcHRpb24oRU5BQkxFX0FSRVMgIlNldCB0byBPTiB0byBlbmFibGUgYy1hcmVzIHN1cHBvcnQiIE9GRikKaWYoV0lOMzIpCiAgQ01BS0VfREVQRU5ERU5UX09QVElPTihFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIKICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdG8gT04gdG8gZW5hYmxlIHRocmVhZGVkIEROUyBsb29rdXAiCiAgICAgICAgICAgICAgICAgICAgICAgICBPTiAiTk9UIEVOQUJMRV9BUkVTIgogICAgICAgICAgICAgICAgICAgICAgICAgT0ZGKQplbHNlKCkKICBvcHRpb24oRU5BQkxFX1RIUkVBREVEX1JFU09MVkVSICJTZXQgdG8gT04gdG8gZW5hYmxlIFBPU0lYIHRocmVhZGVkIEROUyBsb29rdXAiIE9GRikKZW5kaWYoKQpvcHRpb24oRU5BQkxFX0RFQlVHICJTZXQgdG8gT04gdG8gZW5hYmxlIGN1cmwgZGVidWcgZmVhdHVyZXMiIE9GRikKb3B0aW9uKEVOQUJMRV9DVVJMREVCVUcgIlNldCB0byBPTiB0byBidWlsZCB3aXRoIFRyYWNrTWVtb3J5IGZlYXR1cmUgZW5hYmxlZCIgT0ZGKQoKaWYgKEVOQUJMRV9ERUJVRykKICAjIERFQlVHQlVJTEQgd2lsbCBiZSBkZWZpbmVkIG9ubHkgZm9yIERlYnVnIGJ1aWxkcwogIGlmKE5PVCBDTUFLRV9WRVJTSU9OIFZFUlNJT05fTEVTUyAzLjApCiAgICBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORCBQUk9QRVJUWSBDT01QSUxFX0RFRklOSVRJT05TICQ8JDxDT05GSUc6RGVidWc+OkRFQlVHQlVJTEQ+KQogIGVsc2UoKQogICAgc2V0X3Byb3BlcnR5KERJUkVDVE9SWSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OU19ERUJVRyBERUJVR0JVSUxEKQogIGVuZGlmKCkKICBzZXQoRU5BQkxFX0NVUkxERUJVRyBPTikKZW5kaWYoKQoKaWYgKEVOQUJMRV9DVVJMREVCVUcpCiAgc2V0X3Byb3BlcnR5KERJUkVDVE9SWSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OUyBDVVJMREVCVUcpCmVuZGlmKCkKCiMgaW5pdGlhbGl6ZSBDVVJMX0xJQlMKc2V0KENVUkxfTElCUyAiIikKCmlmKEVOQUJMRV9USFJFQURFRF9SRVNPTFZFUiBBTkQgRU5BQkxFX0FSRVMpCiAgbWVzc2FnZShGQVRBTF9FUlJPUiAiT3B0aW9ucyBFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIgYW5kIEVOQUJMRV9BUkVTIGFyZSBtdXR1YWxseSBleGNsdXNpdmUiKQplbmRpZigpCgppZihFTkFCTEVfQVJFUykKICBzZXQoVVNFX0FSRVMgMSkKICBmaW5kX3BhY2thZ2UoQ0FSRVMgUkVRVUlSRUQpCiAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7Q0FSRVNfTElCUkFSWX0gKQogIHNldChDVVJMX0xJQlMgJHtDVVJMX0xJQlN9ICR7Q0FSRVNfTElCUkFSWX0pCmVuZGlmKCkKCmlmKE1TVkMpCiAgb3B0aW9uKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUyAiU2V0IE9GRiB0byBidWlsZCBlYWNoIGNvbmZpZ3VyYXRpb24gdG8gYSBzZXBhcmF0ZSBkaXJlY3RvcnkiIE9GRikKICBtYXJrX2FzX2FkdmFuY2VkKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUykKZW5kaWYoKQoKaW5jbHVkZShDdXJsU3ltYm9sSGlkaW5nKQoKb3B0aW9uKEhUVFBfT05MWSAiZGlzYWJsZXMgYWxsIHByb3RvY29scyBleGNlcHQgSFRUUCAoVGhpcyBvdmVycmlkZXMgYWxsIENVUkxfRElTQUJMRV8qIG9wdGlvbnMpIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoSFRUUF9PTkxZKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0ZUUCAiZGlzYWJsZXMgRlRQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0ZUUCkKb3B0aW9uKENVUkxfRElTQUJMRV9MREFQICJkaXNhYmxlcyBMREFQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0xEQVApCm9wdGlvbihDVVJMX0RJU0FCTEVfVEVMTkVUICJkaXNhYmxlcyBUZWxuZXQiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVEVMTkVUKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0RJQ1QgImRpc2FibGVzIERJQ1QiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfRElDVCkKb3B0aW9uKENVUkxfRElTQUJMRV9GSUxFICJkaXNhYmxlcyBGSUxFIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0ZJTEUpCm9wdGlvbihDVVJMX0RJU0FCTEVfVEZUUCAiZGlzYWJsZXMgVEZUUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9URlRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0hUVFAgImRpc2FibGVzIEhUVFAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfSFRUUCkKCm9wdGlvbihDVVJMX0RJU0FCTEVfTERBUFMgInRvIGRpc2FibGUgTERBUFMiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfTERBUFMpCgpvcHRpb24oQ1VSTF9ESVNBQkxFX1JUU1AgInRvIGRpc2FibGUgUlRTUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9SVFNQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1BST1hZICJ0byBkaXNhYmxlIHByb3h5IiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1BST1hZKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1BPUDMgInRvIGRpc2FibGUgUE9QMyIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9QT1AzKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0lNQVAgInRvIGRpc2FibGUgSU1BUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9JTUFQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1NNVFAgInRvIGRpc2FibGUgU01UUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9TTVRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0dPUEhFUiAidG8gZGlzYWJsZSBHb3BoZXIiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfR09QSEVSKQoKaWYoSFRUUF9PTkxZKQogIHNldChDVVJMX0RJU0FCTEVfRlRQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfTERBUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVBTIE9OKQogIHNldChDVVJMX0RJU0FCTEVfVEVMTkVUIE9OKQogIHNldChDVVJMX0RJU0FCTEVfRElDVCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0ZJTEUgT04pCiAgc2V0KENVUkxfRElTQUJMRV9URlRQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfUlRTUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX1BPUDMgT04pCiAgc2V0KENVUkxfRElTQUJMRV9JTUFQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfU01UUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0dPUEhFUiBPTikKZW5kaWYoKQoKb3B0aW9uKENVUkxfRElTQUJMRV9DT09LSUVTICJ0byBkaXNhYmxlIGNvb2tpZXMgc3VwcG9ydCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9DT09LSUVTKQoKb3B0aW9uKENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCAidG8gZGlzYWJsZSBjcnlwdG9ncmFwaGljIGF1dGhlbnRpY2F0aW9uIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUyAidG8gZGlzYWJsZSB2ZXJib3NlIHN0cmluZ3MiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTKQpvcHRpb24oRElTQUJMRURfVEhSRUFEU0FGRSAiU2V0IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aHJlYWQtc2FmZSBmdW5jdGlvbnMiIE9GRikKbWFya19hc19hZHZhbmNlZChESVNBQkxFRF9USFJFQURTQUZFKQpvcHRpb24oRU5BQkxFX0lQVjYgIkRlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgSVB2NiBzdXBwb3J0IiBPTikKbWFya19hc19hZHZhbmNlZChFTkFCTEVfSVBWNikKaWYoRU5BQkxFX0lQVjYgQU5EIE5PVCBXSU4zMikKICBpbmNsdWRlKENoZWNrU3RydWN0SGFzTWVtYmVyKQogIGNoZWNrX3N0cnVjdF9oYXNfbWVtYmVyKCJzdHJ1Y3Qgc29ja2FkZHJfaW42IiBzaW42X2FkZHIgIm5ldGluZXQvaW4uaCIKICAgICAgICAgICAgICAgICAgICAgICAgICBIQVZFX1NPQ0tBRERSX0lONl9TSU42X0FERFIpCiAgY2hlY2tfc3RydWN0X2hhc19tZW1iZXIoInN0cnVjdCBzb2NrYWRkcl9pbjYiIHNpbjZfc2NvcGVfaWQgIm5ldGluZXQvaW4uaCIKICAgICAgICAgICAgICAgICAgICAgICAgICBIQVZFX1NPQ0tBRERSX0lONl9TSU42X1NDT1BFX0lEKQogIGlmKE5PVCBIQVZFX1NPQ0tBRERSX0lONl9TSU42X0FERFIpCiAgICBtZXNzYWdlKFdBUk5JTkcgInN0cnVjdCBzb2NrYWRkcl9pbjYgbm90IGF2YWlsYWJsZSwgZGlzYWJsaW5nIElQdjYgc3VwcG9ydCIpCiAgICAjIEZvcmNlIHRoZSBmZWF0dXJlIG9mZiBhcyB0aGlzIG5hbWUgaXMgdXNlZCBhcyBndWFyZCBtYWNyby4uLgogICAgc2V0KEVOQUJMRV9JUFY2IE9GRgogICAgICAgIENBQ0hFIEJPT0wgIkRlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgSVB2NiBzdXBwb3J0IiBGT1JDRSkKICBlbmRpZigpCmVuZGlmKCkKCm9wdGlvbihFTkFCTEVfTUFOVUFMICJ0byBwcm92aWRlIHRoZSBidWlsdC1pbiBtYW51YWwiIE9OKQp1bnNldChVU0VfTUFOVUFMIENBQ0hFKSAjIFRPRE86IGNhY2hlIE5ST0ZGL05ST0ZGX01BTk9QVC9VU0VfTUFOVUFMIHZhcnM/CmlmKEVOQUJMRV9NQU5VQUwpCiAgZmluZF9wcm9ncmFtKE5ST0ZGIE5BTUVTIGducm9mZiBucm9mZikKICBpZihOUk9GRikKICAgICMgTmVlZCBhIHdheSB0byB3cml0ZSB0byBzdGRpbiwgdGhpcyB3aWxsIGRvCiAgICBmaWxlKFdSSVRFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbnJvZmYtaW5wdXQudHh0IiAidGVzdCIpCiAgICAjIFRlc3RzIGZvciBhIHZhbGlkIG5yb2ZmIG9wdGlvbiB0byBnZW5lcmF0ZSBhIG1hbnBhZ2UKICAgIGZvcmVhY2goX01BTk9QVCAiLW1hbiIgIi1tYW5kb2MiKQogICAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAiJHtOUk9GRn0iICR7X01BTk9QVH0KICAgICAgICBPVVRQVVRfVkFSSUFCTEUgTlJPRkZfTUFOT1BUX09VVFBVVAogICAgICAgIElOUFVUX0ZJTEUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiCiAgICAgICAgRVJST1JfUVVJRVQpCiAgICAgICMgU2F2ZSB0aGUgb3B0aW9uIGlmIGl0IHdhcyB2YWxpZAogICAgICBpZihOUk9GRl9NQU5PUFRfT1VUUFVUKQogICAgICAgIG1lc3NhZ2UoIkZvdW5kICpucm9mZiBvcHRpb246IC0tICR7X01BTk9QVH0iKQogICAgICAgIHNldChOUk9GRl9NQU5PUFQgJHtfTUFOT1BUfSkKICAgICAgICBzZXQoVVNFX01BTlVBTCAxKQogICAgICAgIGJyZWFrKCkKICAgICAgZW5kaWYoKQogICAgZW5kZm9yZWFjaCgpCiAgICAjIE5vIG5lZWQgZm9yIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgZmlsZShSRU1PVkUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiKQogICAgaWYoTk9UIFVTRV9NQU5VQUwpCiAgICAgIG1lc3NhZ2UoV0FSTklORyAiRm91bmQgbm8gKm5yb2ZmIG9wdGlvbiB0byBnZXQgcGxhaW50ZXh0IGZyb20gbWFuIHBhZ2VzIikKICAgIGVuZGlmKCkKICBlbHNlKCkKICAgIG1lc3NhZ2UoV0FSTklORyAiRm91bmQgbm8gKm5yb2ZmIHByb2dyYW0iKQogIGVuZGlmKCkKZW5kaWYoKQoKIyBXZSBuZWVkIGFuc2kgYy1mbGFncywgZXNwZWNpYWxseSBvbiBIUApzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9BTlNJX0NGTEFHU30gJHtDTUFLRV9DX0ZMQUdTfSIpCnNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAke0NNQUtFX0FOU0lfQ0ZMQUdTfSkKCiMgRGlzYWJsZSB3YXJuaW5ncyBvbiBCb3JsYW5kIHRvIGF2b2lkIGNoYW5naW5nIDNyZCBwYXJ0eSBjb2RlLgppZihCT1JMQU5EKQogIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC13LSIpCmVuZGlmKEJPUkxBTkQpCgojIElmIHdlIGFyZSBvbiBBSVgsIGRvIHRoZSBfQUxMX1NPVVJDRSBtYWdpYwppZigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTIEFJWCkKICBzZXQoX0FMTF9TT1VSQ0UgMSkKZW5kaWYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyBBSVgpCgojIEluY2x1ZGUgYWxsIHRoZSBuZWNlc3NhcnkgZmlsZXMgZm9yIG1hY3JvcwppbmNsdWRlIChDaGVja0Z1bmN0aW9uRXhpc3RzKQppbmNsdWRlIChDaGVja0luY2x1ZGVGaWxlKQppbmNsdWRlIChDaGVja0luY2x1ZGVGaWxlcykKaW5jbHVkZSAoQ2hlY2tMaWJyYXJ5RXhpc3RzKQppbmNsdWRlIChDaGVja1N5bWJvbEV4aXN0cykKaW5jbHVkZSAoQ2hlY2tUeXBlU2l6ZSkKaW5jbHVkZSAoQ2hlY2tDU291cmNlQ29tcGlsZXMpCmluY2x1ZGUgKENNYWtlRGVwZW5kZW50T3B0aW9uKQoKIyBPbiB3aW5kb3dzIHByZWxvYWQgc2V0dGluZ3MKaWYoV0lOMzIpCiAgc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TICIke0NNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TfSAtRF9XSU5TT0NLQVBJXz0iKQogIGluY2x1ZGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NNYWtlL1BsYXRmb3Jtcy9XaW5kb3dzQ2FjaGUuY21ha2UpCmVuZGlmKFdJTjMyKQoKaWYoRU5BQkxFX1RIUkVBREVEX1JFU09MVkVSKQogIGlmKFdJTjMyKQogICAgc2V0KFVTRV9USFJFQURTX1dJTjMyIE9OKQogIGVsc2UoKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicHRocmVhZC5oIiBIQVZFX1BUSFJFQURfSCkKICAgIGlmKEhBVkVfUFRIUkVBRF9IKQogICAgICBzZXQoQ01BS0VfVEhSRUFEX1BSRUZFUl9QVEhSRUFEIDEpCiAgICAgIGZpbmRfcGFja2FnZShUaHJlYWRzKQogICAgICBpZihDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVCkKICAgICAgICBzZXQoQ1VSTF9MSUJTICR7Q1VSTF9MSUJTfSAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQogICAgICAgIHNldChVU0VfVEhSRUFEU19QT1NJWCAxKQogICAgICBlbmRpZigpCiAgICBlbmRpZigpCiAgZW5kaWYoKQplbmRpZigpCgojIENoZWNrIGZvciBhbGwgbmVlZGVkIGxpYnJhcmllcwpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImRsIiAgICAgZGxvcGVuICAgICAgIEhBVkVfTElCREwpCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgic29ja2V0IiBjb25uZWN0ICAgICAgSEFWRV9MSUJTT0NLRVQpCmNoZWNrX2xpYnJhcnlfZXhpc3RzKCJjIiBnZXRob3N0YnluYW1lICIiIE5PVF9ORUVEX0xJQk5TTCkKCiMgWWVsbG93dGFiIFpldGEgbmVlZHMgZGlmZmVyZW50IGxpYnJhcmllcyB0aGFuIEJlT1MgNS4KaWYoQkVPUykKICBzZXQoTk9UX05FRURfTElCTlNMIDEpCiAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJiaW5kIiBnZXRob3N0YnluYW1lIEhBVkVfTElCQklORCkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImJuZXRhcGkiIGNsb3Nlc29ja2V0IEhBVkVfTElCQk5FVEFQSSkKZW5kaWYoQkVPUykKCmlmKE5PVCBOT1RfTkVFRF9MSUJOU0wpCiAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJuc2wiICAgIGdldGhvc3RieW5hbWUgIEhBVkVfTElCTlNMKQplbmRpZihOT1QgTk9UX05FRURfTElCTlNMKQoKY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGdldGhvc3RuYW1lIEhBVkVfR0VUSE9TVE5BTUUpCgpzZXQoT1BFTlNTTF9ERUZBVUxUIE9OKQppZihXSU4zMikKICBzZXQoT1BFTlNTTF9ERUZBVUxUIE9GRikKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIndzMl8zMiIgZ2V0Y2ggICAgICAgIEhBVkVfTElCV1MyXzMyKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgid2lubW0iICBnZXRjaCAgICAgICAgSEFWRV9MSUJXSU5NTSkKZW5kaWYoKQoKb3B0aW9uKENNQUtFX1VTRV9PUEVOU1NMICJVc2UgT3BlblNTTCBjb2RlLiBFeHBlcmltZW50YWwiICR7T1BFTlNTTF9ERUZBVUxUfSkKbWFya19hc19hZHZhbmNlZChDTUFLRV9VU0VfT1BFTlNTTCkKCmlmKFdJTjMyKQogIENNQUtFX0RFUEVOREVOVF9PUFRJT04oQ1VSTF9XSU5ET1dTX1NTUEkgIlVzZSB3aW5kb3dzIGxpYnJhcmllcyB0byBhbGxvdyBOVExNIGF1dGhlbnRpY2F0aW9uIHdpdGhvdXQgb3BlbnNzbCIgT04KICAgICJOT1QgQ01BS0VfVVNFX09QRU5TU0wiIE9GRikKICBtYXJrX2FzX2FkdmFuY2VkKENVUkxfV0lORE9XU19TU1BJKQplbmRpZigpCgpzZXQoVVNFX09QRU5TU0wgT0ZGKQpzZXQoSEFWRV9MSUJDUllQVE8gT0ZGKQpzZXQoSEFWRV9MSUJTU0wgT0ZGKQoKaWYoQ01BS0VfVVNFX09QRU5TU0wpCiAgZmluZF9wYWNrYWdlKE9wZW5TU0wpCiAgaWYoT1BFTlNTTF9GT1VORCkKICAgIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke09QRU5TU0xfTElCUkFSSUVTfSkKICAgIHNldChVU0VfT1BFTlNTTCBPTikKICAgIHNldChIQVZFX0xJQkNSWVBUTyBPTikKICAgIHNldChIQVZFX0xJQlNTTCBPTikKICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtPUEVOU1NMX0lOQ0xVREVfRElSfSkKICAgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke09QRU5TU0xfSU5DTFVERV9ESVJ9KQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL2NyeXB0by5oIiBIQVZFX09QRU5TU0xfQ1JZUFRPX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvZW5naW5lLmgiIEhBVkVfT1BFTlNTTF9FTkdJTkVfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9lcnIuaCIgICAgSEFWRV9PUEVOU1NMX0VSUl9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL3BlbS5oIiAgICBIQVZFX09QRU5TU0xfUEVNX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvcGtjczEyLmgiIEhBVkVfT1BFTlNTTF9QS0NTMTJfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9yc2EuaCIgICAgSEFWRV9PUEVOU1NMX1JTQV9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL3NzbC5oIiAgICBIQVZFX09QRU5TU0xfU1NMX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wveDUwOS5oIiAgIEhBVkVfT1BFTlNTTF9YNTA5X0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvcmFuZC5oIiAgIEhBVkVfT1BFTlNTTF9SQU5EX0gpCiAgZWxzZWlmKFdJTjMyKQogICAgc2V0KENVUkxfV0lORE9XU19TU1BJIE9OKQogIGVuZGlmKCkKZW5kaWYoKQoKb3B0aW9uKFVTRV9OR0hUVFAyICJVc2UgTmdodHRwMiBsaWJyYXJ5IiBPRkYpCmlmKFVTRV9OR0hUVFAyKQogIGZpbmRfcGFja2FnZShOR0hUVFAyIFJFUVVJUkVEKQogIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtOR0hUVFAyX0lOQ0xVREVfRElSU30pCiAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7TkdIVFRQMl9MSUJSQVJJRVN9KQplbmRpZigpCgppZihOT1QgQ1VSTF9ESVNBQkxFX0xEQVApCiAgaWYoV0lOMzIpCiAgICBvcHRpb24oVVNFX1dJTjMyX0xEQVAgIlVzZSBXaW5kb3dzIExEQVAgaW1wbGVtZW50YXRpb24iIE9OKQogICAgaWYoVVNFX1dJTjMyX0xEQVApCiAgICAgIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgid2xkYXAzMiIgY2xkYXBfb3BlbiBIQVZFX1dMREFQMzIpCiAgICAgIGlmKE5PVCBIQVZFX1dMREFQMzIpCiAgICAgICAgc2V0KFVTRV9XSU4zMl9MREFQIE9GRikKICAgICAgZW5kaWYoKQogICAgZW5kaWYoKQogIGVuZGlmKCkKCiAgb3B0aW9uKENNQUtFX1VTRV9PUEVOTERBUCAiVXNlIE9wZW5MREFQIGNvZGUuIiBPRkYpCiAgbWFya19hc19hZHZhbmNlZChDTUFLRV9VU0VfT1BFTkxEQVApCiAgc2V0KENNQUtFX0xEQVBfTElCICJsZGFwIiBDQUNIRSBTVFJJTkcgIk5hbWUgb3IgZnVsbCBwYXRoIHRvIGxkYXAgbGlicmFyeSIpCiAgc2V0KENNQUtFX0xCRVJfTElCICJsYmVyIiBDQUNIRSBTVFJJTkcgIk5hbWUgb3IgZnVsbCBwYXRoIHRvIGxiZXIgbGlicmFyeSIpCgogIGlmKENNQUtFX1VTRV9PUEVOTERBUCBBTkQgVVNFX1dJTjMyX0xEQVApCiAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDYW5ub3QgdXNlIFVTRV9XSU4zMl9MREFQIGFuZCBDTUFLRV9VU0VfT1BFTkxEQVAgYXQgdGhlIHNhbWUgdGltZSIpCiAgZW5kaWYoKQoKICAjIE5vdyB0aGF0IHdlIGtub3csIHdlJ3JlIG5vdCB1c2luZyB3aW5kb3dzIExEQVAuLi4KICBpZihVU0VfV0lOMzJfTERBUCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbmxkYXAuaCIgSEFWRV9XSU5MREFQX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3aW5iZXIuaCIgIEhBVkVfV0lOQkVSX0gpCiAgZWxzZSgpCiAgICAjIENoZWNrIGZvciBMREFQCiAgICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICR7T1BFTlNTTF9MSUJSQVJJRVN9KQogICAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCR7Q01BS0VfTERBUF9MSUJ9IGxkYXBfaW5pdCBIQVZFX0xJQkxEQVApCiAgICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoJHtDTUFLRV9MQkVSX0xJQn0gYmVyX2luaXQgSEFWRV9MSUJMQkVSKQoKICAgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFU19CQUsgJHtDTUFLRV9SRVFVSVJFRF9JTkNMVURFU30pCiAgICBzZXQoQ01BS0VfTERBUF9JTkNMVURFX0RJUiAiIiBDQUNIRSBTVFJJTkcgIlBhdGggdG8gTERBUCBpbmNsdWRlIGRpcmVjdG9yeSIpCiAgICBpZihDTUFLRV9MREFQX0lOQ0xVREVfRElSKQogICAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0NNQUtFX0xEQVBfSU5DTFVERV9ESVJ9KQogICAgZW5kaWYoKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGRhcC5oIiAgICAgICAgICAgSEFWRV9MREFQX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsYmVyLmgiICAgICAgICAgICBIQVZFX0xCRVJfSCkKCiAgICBpZihOT1QgSEFWRV9MREFQX0gpCiAgICAgIG1lc3NhZ2UoU1RBVFVTICJMREFQX0ggbm90IGZvdW5kIENVUkxfRElTQUJMRV9MREFQIHNldCBPTiIpCiAgICAgIHNldChDVVJMX0RJU0FCTEVfTERBUCBPTiBDQUNIRSBCT09MICIiIEZPUkNFKQogICAgICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtDTUFLRV9SRVFVSVJFRF9JTkNMVURFU19CQUt9KSAjTERBUCBpbmNsdWRlcyB3b24ndCBiZSB1c2VkCiAgICBlbHNlaWYoTk9UIEhBVkVfTElCTERBUCkKICAgICAgbWVzc2FnZShTVEFUVVMgIkxEQVAgbGlicmFyeSAnJHtDTUFLRV9MREFQX0xJQn0nIG5vdCBmb3VuZCBDVVJMX0RJU0FCTEVfTERBUCBzZXQgT04iKQogICAgICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVAgT04gQ0FDSEUgQk9PTCAiIiBGT1JDRSkKICAgICAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7Q01BS0VfUkVRVUlSRURfSU5DTFVERVNfQkFLfSkgI0xEQVAgaW5jbHVkZXMgd29uJ3QgYmUgdXNlZAogICAgZWxzZSgpCiAgICAgIGlmKENNQUtFX1VTRV9PUEVOTERBUCkKICAgICAgICBzZXQoVVNFX09QRU5MREFQIE9OKQogICAgICBlbmRpZigpCiAgICAgIGlmKENNQUtFX0xEQVBfSU5DTFVERV9ESVIpCiAgICAgICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0xEQVBfSU5DTFVERV9ESVJ9KQogICAgICBlbmRpZigpCiAgICAgIHNldChORUVEX0xCRVJfSCBPTikKICAgICAgc2V0KF9IRUFERVJfTElTVCkKICAgICAgaWYoSEFWRV9XSU5ET1dTX0gpCiAgICAgICAgbGlzdChBUFBFTkQgX0hFQURFUl9MSVNUICJ3aW5kb3dzLmgiKQogICAgICBlbmRpZigpCiAgICAgIGlmKEhBVkVfU1lTX1RZUEVTX0gpCiAgICAgICAgbGlzdChBUFBFTkQgX0hFQURFUl9MSVNUICJzeXMvdHlwZXMuaCIpCiAgICAgIGVuZGlmKCkKICAgICAgbGlzdChBUFBFTkQgX0hFQURFUl9MSVNUICJsZGFwLmgiKQoKICAgICAgc2V0KF9TUkNfU1RSSU5HICIiKQogICAgICBmb3JlYWNoKF9IRUFERVIgJHtfSEVBREVSX0xJU1R9KQogICAgICAgIHNldChfSU5DTFVERV9TVFJJTkcgIiR7X0lOQ0xVREVfU1RSSU5HfSNpbmNsdWRlIDwke19IRUFERVJ9PlxuIikKICAgICAgZW5kZm9yZWFjaCgpCgogICAgICBzZXQoX1NSQ19TVFJJTkcKICAgICAgICAiCiAgICAgICAgJHtfSU5DTFVERV9TVFJJTkd9CiAgICAgICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKICAgICAgICB7CiAgICAgICAgICBCZXJWYWx1ZSAqYnZwID0gTlVMTDsKICAgICAgICAgIEJlckVsZW1lbnQgKmJlcCA9IGJlcl9pbml0KGJ2cCk7CiAgICAgICAgICBiZXJfZnJlZShiZXAsIDEpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSIKICAgICAgKQogICAgICBzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgIiR7Q01BS0VfUkVRVUlSRURfREVGSU5JVElPTlN9IC1ETERBUF9ERVBSRUNBVEVEPTEiKQogICAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtDTUFLRV9MREFQX0xJQn0pCiAgICAgIGlmKEhBVkVfTElCTEJFUikKICAgICAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtDTUFLRV9MQkVSX0xJQn0pCiAgICAgIGVuZGlmKCkKICAgICAgY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIiR7X1NSQ19TVFJJTkd9IiBOT1RfTkVFRF9MQkVSX0gpCgogICAgICBpZihOT1RfTkVFRF9MQkVSX0gpCiAgICAgICAgc2V0KE5FRURfTEJFUl9IIE9GRikKICAgICAgZWxzZSgpCiAgICAgICAgc2V0KENVUkxfVEVTVF9ERUZJTkVTICIke0NVUkxfVEVTVF9ERUZJTkVTfSAtRE5FRURfTEJFUl9IIikKICAgICAgZW5kaWYoKQogICAgZW5kaWYoKQogIGVuZGlmKCkKCmVuZGlmKCkKCiMgTm8gbGRhcCwgbm8gbGRhcHMuCmlmKENVUkxfRElTQUJMRV9MREFQKQogIGlmKE5PVCBDVVJMX0RJU0FCTEVfTERBUFMpCiAgICBtZXNzYWdlKFNUQVRVUyAiTERBUCBuZWVkcyB0byBiZSBlbmFibGVkIHRvIHN1cHBvcnQgTERBUFMiKQogICAgc2V0KENVUkxfRElTQUJMRV9MREFQUyBPTiBDQUNIRSBCT09MICIiIEZPUkNFKQogIGVuZGlmKCkKZW5kaWYoKQoKaWYoTk9UIENVUkxfRElTQUJMRV9MREFQUykKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsZGFwX3NzbC5oIiBIQVZFX0xEQVBfU1NMX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGRhcHNzbC5oIiAgSEFWRV9MREFQU1NMX0gpCmVuZGlmKCkKCiMgQ2hlY2sgZm9yIGlkbgpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImlkbjIiIGlkbjJfbG9va3VwX3VsIEhBVkVfTElCSUROMikKCiMgQ2hlY2sgZm9yIHN5bWJvbCBkbG9wZW4gKHNhbWUgYXMgSEFWRV9MSUJETCkKY2hlY2tfbGlicmFyeV9leGlzdHMoIiR7Q1VSTF9MSUJTfSIgZGxvcGVuICIiIEhBVkVfRExPUEVOKQoKb3B0aW9uKENVUkxfWkxJQiAiU2V0IHRvIE9OIHRvIGVuYWJsZSBidWlsZGluZyBjdXJsIHdpdGggemxpYiBzdXBwb3J0LiIgT04pCnNldChIQVZFX0xJQlogT0ZGKQpzZXQoSEFWRV9aTElCX0ggT0ZGKQpzZXQoSEFWRV9aTElCIE9GRikKaWYoQ1VSTF9aTElCKQogIGZpbmRfcGFja2FnZShaTElCIFFVSUVUKQogIGlmKFpMSUJfRk9VTkQpCiAgICBzZXQoSEFWRV9aTElCX0ggT04pCiAgICBzZXQoSEFWRV9aTElCIE9OKQogICAgc2V0KEhBVkVfTElCWiBPTikKICAgIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke1pMSUJfTElCUkFSSUVTfSkKICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtaTElCX0lOQ0xVREVfRElSU30pCiAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke1pMSUJfSU5DTFVERV9ESVJTfSkKICBlbmRpZigpCmVuZGlmKCkKCiNsaWJTU0gyCm9wdGlvbihDTUFLRV9VU0VfTElCU1NIMiAiVXNlIGxpYlNTSDIiIE9OKQptYXJrX2FzX2FkdmFuY2VkKENNQUtFX1VTRV9MSUJTU0gyKQpzZXQoVVNFX0xJQlNTSDIgT0ZGKQpzZXQoSEFWRV9MSUJTU0gyIE9GRikKc2V0KEhBVkVfTElCU1NIMl9IIE9GRikKCmlmKENNQUtFX1VTRV9MSUJTU0gyKQogIGZpbmRfcGFja2FnZShMaWJTU0gyKQogIGlmKExJQlNTSDJfRk9VTkQpCiAgICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtMSUJTU0gyX0xJQlJBUll9KQogICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0xJQlNTSDJfTElCUkFSWX0pCiAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAiJHtMSUJTU0gyX0lOQ0xVREVfRElSfSIpCiAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0xJQlNTSDJfSU5DTFVERV9ESVJ9IikKICAgIHNldChIQVZFX0xJQlNTSDIgT04pCiAgICBzZXQoVVNFX0xJQlNTSDIgT04pCgogICAgIyBmaW5kX3BhY2thZ2UgaGFzIGFscmVhZHkgZm91bmQgdGhlIGhlYWRlcnMKICAgIHNldChIQVZFX0xJQlNTSDJfSCBPTikKICAgIHNldChDVVJMX0lOQ0xVREVTICR7Q1VSTF9JTkNMVURFU30gIiR7TElCU1NIMl9JTkNMVURFX0RJUn0vbGlic3NoMi5oIikKICAgIHNldChDVVJMX1RFU1RfREVGSU5FUyAiJHtDVVJMX1RFU1RfREVGSU5FU30gLURIQVZFX0xJQlNTSDJfSCIpCgogICAgIyBub3cgY2hlY2sgZm9yIHNwZWNpZmljIGxpYnNzaDIgc3ltYm9scyBhcyB0aGV5IHdlcmUgYWRkZWQgaW4gZGlmZmVyZW50IHZlcnNpb25zCiAgICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAibGlic3NoMi5oIikKICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsaWJzc2gyX3ZlcnNpb24gICAgICAgICAgIEhBVkVfTElCU1NIMl9WRVJTSU9OKQogICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGxpYnNzaDJfaW5pdCAgICAgICAgICAgICAgSEFWRV9MSUJTU0gyX0lOSVQpCiAgICBjaGVja19mdW5jdGlvbl9leGlzdHMobGlic3NoMl9leGl0ICAgICAgICAgICAgICBIQVZFX0xJQlNTSDJfRVhJVCkKICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsaWJzc2gyX3NjcF9zZW5kNjQgICAgICAgIEhBVkVfTElCU1NIMl9TQ1BfU0VORDY0KQogICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGxpYnNzaDJfc2Vzc2lvbl9oYW5kc2hha2UgSEFWRV9MSUJTU0gyX1NFU1NJT05fSEFORFNIQUtFKQogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgIiIpCgogIGVuZGlmKExJQlNTSDJfRk9VTkQpCmVuZGlmKENNQUtFX1VTRV9MSUJTU0gyKQoKb3B0aW9uKENNQUtFX1VTRV9HU1NBUEkgIlVzZSBHU1NBUEkgaW1wbGVtZW50YXRpb24gKHJpZ2h0IG5vdyBvbmx5IEhlaW1kYWwgaXMgc3VwcG9ydGVkIHdpdGggQ01ha2UgYnVpbGQpIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ01BS0VfVVNFX0dTU0FQSSkKCmlmKENNQUtFX1VTRV9HU1NBUEkpCiAgZmluZF9wYWNrYWdlKEdTUykKCiAgc2V0KEhBVkVfR1NTQVBJICR7R1NTX0ZPVU5EfSkKICBpZihHU1NfRk9VTkQpCgogICAgbWVzc2FnZShTVEFUVVMgIkZvdW5kICR7R1NTX0ZMQVZPVVJ9IEdTU0FQSSB2ZXJzaW9uOiBcIiR7R1NTX1ZFUlNJT059XCIiKQoKICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7R1NTX0lOQ0xVREVfRElSRUNUT1JJRVN9KQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZ3NzYXBpL2dzc2FwaS5oIiAgSEFWRV9HU1NBUElfR1NTQVBJX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJnc3NhcGkvZ3NzYXBpX2dlbmVyaWMuaCIgSEFWRV9HU1NBUElfR1NTQVBJX0dFTkVSSUNfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImdzc2FwaS9nc3NhcGlfa3JiNS5oIiBIQVZFX0dTU0FQSV9HU1NBUElfS1JCNV9IKQoKICAgIGlmKEdTU19GTEFWT1VSIFNUUkVRVUFMICJIZWltZGFsIikKICAgICAgc2V0KEhBVkVfR1NTSEVJTURBTCBPTikKICAgIGVsc2UoKSAjIE1JVAogICAgICBzZXQoSEFWRV9HU1NNSVQgT04pCiAgICAgIHNldChfSU5DTFVERV9MSVNUICIiKQogICAgICBpZihIQVZFX0dTU0FQSV9HU1NBUElfSCkKICAgICAgICBsaXN0KEFQUEVORCBfSU5DTFVERV9MSVNUICJnc3NhcGkvZ3NzYXBpLmgiKQogICAgICBlbmRpZigpCiAgICAgIGlmKEhBVkVfR1NTQVBJX0dTU0FQSV9HRU5FUklDX0gpCiAgICAgICAgbGlzdChBUFBFTkQgX0lOQ0xVREVfTElTVCAiZ3NzYXBpL2dzc2FwaV9nZW5lcmljLmgiKQogICAgICBlbmRpZigpCiAgICAgIGlmKEhBVkVfR1NTQVBJX0dTU0FQSV9LUkI1X0gpCiAgICAgICAgbGlzdChBUFBFTkQgX0lOQ0xVREVfTElTVCAiZ3NzYXBpL2dzc2FwaV9rcmI1LmgiKQogICAgICBlbmRpZigpCgogICAgICBzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIF9DT01QSUxFUl9GTEFHU19TVFIgIiR7R1NTX0NPTVBJTEVSX0ZMQUdTfSIpCiAgICAgIHN0cmluZyhSRVBMQUNFICI7IiAiICIgX0xJTktFUl9GTEFHU19TVFIgIiR7R1NTX0xJTktFUl9GTEFHU30iKQoKICAgICAgZm9yZWFjaChfZGlyICR7R1NTX0xJTktfRElSRUNUT1JJRVN9KQogICAgICAgIHNldChfTElOS0VSX0ZMQUdTX1NUUiAiJHtfTElOS0VSX0ZMQUdTX1NUUn0gLUxcIiR7X2Rpcn1cIiIpCiAgICAgIGVuZGZvcmVhY2goKQoKICAgICAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICIke19DT01QSUxFUl9GTEFHU19TVFJ9ICR7X0xJTktFUl9GTEFHU19TVFJ9IikKICAgICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0dTU19MSUJSQVJJRVN9KQogICAgICBjaGVja19zeW1ib2xfZXhpc3RzKCJHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSIgJHtfSU5DTFVERV9MSVNUfSBIQVZFX0dTU19DX05UX0hPU1RCQVNFRF9TRVJWSUNFKQogICAgICBpZihOT1QgSEFWRV9HU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSkKICAgICAgICBzZXQoSEFWRV9PTERfR1NTTUlUIE9OKQogICAgICBlbmRpZigpCgogICAgZW5kaWYoKQoKICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtHU1NfSU5DTFVERV9ESVJFQ1RPUklFU30pCiAgICBsaW5rX2RpcmVjdG9yaWVzKCR7R1NTX0xJTktfRElSRUNUT1JJRVN9KQogICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gJHtHU1NfQ09NUElMRVJfRkxBR1N9IikKICAgIHNldChDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTICIke0NNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1N9ICR7R1NTX0xJTktFUl9GTEFHU30iKQogICAgc2V0KENNQUtFX0VYRV9MSU5LRVJfRkxBR1MgIiR7Q01BS0VfRVhFX0xJTktFUl9GTEFHU30gJHtHU1NfTElOS0VSX0ZMQUdTfSIpCiAgICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtHU1NfTElCUkFSSUVTfSkKCiAgZWxzZSgpCiAgICBtZXNzYWdlKFdBUk5JTkcgIkdTU0FQSSBzdXBwb3J0IGhhcyBiZWVuIHJlcXVlc3RlZCBidXQgbm8gc3VwcG9ydGluZyBsaWJyYXJpZXMgZm91bmQuIFNraXBwaW5nLiIpCiAgZW5kaWYoKQplbmRpZigpCgpvcHRpb24oRU5BQkxFX1VOSVhfU09DS0VUUyAiRGVmaW5lIGlmIHlvdSB3YW50IFVuaXggZG9tYWluIHNvY2tldHMgc3VwcG9ydCIgT04pCmlmKEVOQUJMRV9VTklYX1NPQ0tFVFMpCiAgaW5jbHVkZShDaGVja1N0cnVjdEhhc01lbWJlcikKICBjaGVja19zdHJ1Y3RfaGFzX21lbWJlcigic3RydWN0IHNvY2thZGRyX3VuIiBzdW5fcGF0aCAic3lzL3VuLmgiIFVTRV9VTklYX1NPQ0tFVFMpCmVsc2UoKQogIHVuc2V0KFVTRV9VTklYX1NPQ0tFVFMgQ0FDSEUpCmVuZGlmKCkKCgojIENoZWNrIGZvciBoZWFkZXIgZmlsZXMKaWYoTk9UIFVOSVgpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luZG93cy5oIiAgICAgIEhBVkVfV0lORE9XU19IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbnNvY2suaCIgICAgICBIQVZFX1dJTlNPQ0tfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3czJ0Y3BpcC5oIiAgICAgSEFWRV9XUzJUQ1BJUF9IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbnNvY2syLmgiICAgICBIQVZFX1dJTlNPQ0syX0gpCiAgaWYoQ1VSTF9XSU5ET1dTX1NTUEkpCiAgICBzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgIiR7Q01BS0VfUkVRVUlSRURfREVGSU5JVElPTlN9IC1EU0VDVVJJVFlfV0lOMzIiKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3NwaS5oIiAgICAgICBIQVZFX1NTUElfSCkKICAgIGlmKEhBVkVfU1NQSV9IKQogICAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzY2hhbm5lbC5oIiBIQVZFX1NDSEFOTkVMX0gpCiAgICAgIHNldChVU0VfV0lORE9XU19TU1BJIE9OKQogICAgICBpZihIQVZFX1NDSEFOTkVMX0gpCiAgICAgICAgc2V0KFVTRV9TQ0hBTk5FTCBPTikKICAgICAgICBzZXQoU1NMX0VOQUJMRUQgT04pCiAgICAgICAgc2V0KENVUkxfTElCUyAke0NVUkxfTElCU30gImNyeXB0MzIiKQogICAgICBlbmRpZigpCiAgICBlbmRpZigpCiAgZWxzZWlmKFVTRV9PUEVOU1NMKQogICAgc2V0KENVUkxfTElCUyAke0NVUkxfTElCU30gImNyeXB0MzIiKQogIGVuZGlmKCkKZW5kaWYoTk9UIFVOSVgpCgpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpby5oIiAgICAgICAgICBIQVZFX1NURElPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImludHR5cGVzLmgiICAgICAgIEhBVkVfSU5UVFlQRVNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL2ZpbGlvLmgiICAgICAgSEFWRV9TWVNfRklMSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL2lvY3RsLmgiICAgICAgSEFWRV9TWVNfSU9DVExfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3BhcmFtLmgiICAgICAgSEFWRV9TWVNfUEFSQU1fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3BvbGwuaCIgICAgICAgSEFWRV9TWVNfUE9MTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvcmVzb3VyY2UuaCIgICBIQVZFX1NZU19SRVNPVVJDRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvc2VsZWN0LmgiICAgICBIQVZFX1NZU19TRUxFQ1RfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3NvY2tldC5oIiAgICAgSEFWRV9TWVNfU09DS0VUX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zb2NraW8uaCIgICAgIEhBVkVfU1lTX1NPQ0tJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvc3RhdC5oIiAgICAgICBIQVZFX1NZU19TVEFUX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy90aW1lLmgiICAgICAgIEhBVkVfU1lTX1RJTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3R5cGVzLmgiICAgICAgSEFWRV9TWVNfVFlQRVNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3Vpby5oIiAgICAgICAgSEFWRV9TWVNfVUlPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy91bi5oIiAgICAgICAgIEhBVkVfU1lTX1VOX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy91dGltZS5oIiAgICAgIEhBVkVfU1lTX1VUSU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy94YXR0ci5oIiAgICAgIEhBVkVfU1lTX1hBVFRSX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImFsbG9jYS5oIiAgICAgICAgIEhBVkVfQUxMT0NBX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImFycGEvaW5ldC5oIiAgICAgIEhBVkVfQVJQQV9JTkVUX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImFycGEvdGZ0cC5oIiAgICAgIEhBVkVfQVJQQV9URlRQX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImFzc2VydC5oIiAgICAgICAgIEhBVkVfQVNTRVJUX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImNyeXB0by5oIiAgICAgICAgIEhBVkVfQ1JZUFRPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImRlcy5oIiAgICAgICAgICAgIEhBVkVfREVTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImVyci5oIiAgICAgICAgICAgIEhBVkVfRVJSX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImVycm5vLmgiICAgICAgICAgIEhBVkVfRVJSTk9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZmNudGwuaCIgICAgICAgICAgSEFWRV9GQ05UTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJpZG4yLmgiICAgICAgICAgICBIQVZFX0lETjJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWZhZGRycy5oIiAgICAgICAgSEFWRV9JRkFERFJTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlvLmgiICAgICAgICAgICAgIEhBVkVfSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgia3JiLmgiICAgICAgICAgICAgSEFWRV9LUkJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGliZ2VuLmgiICAgICAgICAgSEFWRV9MSUJHRU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGltaXRzLmgiICAgICAgICAgSEFWRV9MSU1JVFNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibG9jYWxlLmgiICAgICAgICAgSEFWRV9MT0NBTEVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0L2lmLmgiICAgICAgICAgSEFWRV9ORVRfSUZfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0ZGIuaCIgICAgICAgICAgSEFWRV9ORVREQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRpbmV0L2luLmgiICAgICBIQVZFX05FVElORVRfSU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0aW5ldC90Y3AuaCIgICAgSEFWRV9ORVRJTkVUX1RDUF9IKQoKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicGVtLmgiICAgICAgICAgICAgSEFWRV9QRU1fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicG9sbC5oIiAgICAgICAgICAgSEFWRV9QT0xMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInB3ZC5oIiAgICAgICAgICAgIEhBVkVfUFdEX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInJzYS5oIiAgICAgICAgICAgIEhBVkVfUlNBX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNldGptcC5oIiAgICAgICAgIEhBVkVfU0VUSk1QX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNndHR5LmgiICAgICAgICAgIEhBVkVfU0dUVFlfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic2lnbmFsLmgiICAgICAgICAgSEFWRV9TSUdOQUxfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3NsLmgiICAgICAgICAgICAgSEFWRV9TU0xfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkYm9vbC5oIiAgICAgICAgSEFWRV9TVERCT09MX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGludC5oIiAgICAgICAgIEhBVkVfU1RESU5UX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGlvLmgiICAgICAgICAgIEhBVkVfU1RESU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkbGliLmgiICAgICAgICAgSEFWRV9TVERMSUJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RyaW5nLmgiICAgICAgICAgSEFWRV9TVFJJTkdfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RyaW5ncy5oIiAgICAgICAgSEFWRV9TVFJJTkdTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0cm9wdHMuaCIgICAgICAgIEhBVkVfU1RST1BUU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0ZXJtaW8uaCIgICAgICAgICBIQVZFX1RFUk1JT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0ZXJtaW9zLmgiICAgICAgICBIQVZFX1RFUk1JT1NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGltZS5oIiAgICAgICAgICAgSEFWRV9USU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInVuaXN0ZC5oIiAgICAgICAgIEhBVkVfVU5JU1REX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInV0aW1lLmgiICAgICAgICAgIEhBVkVfVVRJTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgieDUwOS5oIiAgICAgICAgICAgSEFWRV9YNTA5X0gpCgpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwcm9jZXNzLmgiICAgICAgICBIQVZFX1BST0NFU1NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkZGVmLmgiICAgICAgICAgSEFWRV9TVERERUZfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZGxmY24uaCIgICAgICAgICAgSEFWRV9ETEZDTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJtYWxsb2MuaCIgICAgICAgICBIQVZFX01BTExPQ19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJtZW1vcnkuaCIgICAgICAgICBIQVZFX01FTU9SWV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRpbmV0L2lmX2V0aGVyLmgiIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpbnQuaCIgICAgICAgIEhBVkVfU1RESU5UX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNvY2tpby5oIiAgICAgICAgSEFWRV9TT0NLSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3V0c25hbWUuaCIgICBIQVZFX1NZU19VVFNOQU1FX0gpCgpjaGVja190eXBlX3NpemUoc2l6ZV90ICBTSVpFT0ZfU0laRV9UKQpjaGVja190eXBlX3NpemUoc3NpemVfdCAgU0laRU9GX1NTSVpFX1QpCmNoZWNrX3R5cGVfc2l6ZSgibG9uZyBsb25nIiAgU0laRU9GX0xPTkdfTE9ORykKY2hlY2tfdHlwZV9zaXplKCJsb25nIiAgU0laRU9GX0xPTkcpCmNoZWNrX3R5cGVfc2l6ZSgic2hvcnQiICBTSVpFT0ZfU0hPUlQpCmNoZWNrX3R5cGVfc2l6ZSgiaW50IiAgU0laRU9GX0lOVCkKY2hlY2tfdHlwZV9zaXplKCJfX2ludDY0IiAgU0laRU9GX19fSU5UNjQpCmNoZWNrX3R5cGVfc2l6ZSgibG9uZyBkb3VibGUiICBTSVpFT0ZfTE9OR19ET1VCTEUpCmNoZWNrX3R5cGVfc2l6ZSgidGltZV90IiAgU0laRU9GX1RJTUVfVCkKaWYoTk9UIEhBVkVfU0laRU9GX1NTSVpFX1QpCiAgaWYoU0laRU9GX0xPTkcgRVFVQUwgU0laRU9GX1NJWkVfVCkKICAgIHNldChzc2l6ZV90IGxvbmcpCiAgZW5kaWYoU0laRU9GX0xPTkcgRVFVQUwgU0laRU9GX1NJWkVfVCkKICBpZihOT1Qgc3NpemVfdCBBTkQgU0laRU9GX19fSU5UNjQgRVFVQUwgU0laRU9GX1NJWkVfVCkKICAgIHNldChzc2l6ZV90IF9faW50NjQpCiAgZW5kaWYoTk9UIHNzaXplX3QgQU5EIFNJWkVPRl9fX0lOVDY0IEVRVUFMIFNJWkVPRl9TSVpFX1QpCmVuZGlmKE5PVCBIQVZFX1NJWkVPRl9TU0laRV9UKQojIG9mZl90IGlzIHNpemVkIGxhdGVyLCBhZnRlciB0aGUgSEFWRV9GSUxFX09GRlNFVF9CSVRTIHRlc3QKCiMgRGlmZmVyZW50IHNpemVvZnMsIGV0Yy4KCiMgICAgZGVmaW5lIENVUkxfU0laRU9GX0xPTkcgICAgICAgIDQKIyAgICBkZWZpbmUgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAgbG9uZyBsb25nCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgICJsbGQiCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICJsbHUiCiMgICAgZGVmaW5lIENVUkxfRk9STUFUX09GRl9UICAgICAgICIlbGxkIgojICAgIGRlZmluZSBDVVJMX1NJWkVPRl9DVVJMX09GRl9UICA4CiMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgIExMCiMgICAgZGVmaW5lIENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIFVMTAoKc2V0KENVUkxfU0laRU9GX0xPTkcgJHtTSVpFT0ZfTE9OR30pCgppZihTSVpFT0ZfTE9ORyBFUVVBTCA4KQogIHNldChDVVJMX1RZUEVPRl9DVVJMX09GRl9UIGxvbmcpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgOCkKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibHUiKQogIHNldChDVVJMX0ZPUk1BVF9PRkZfVCAiJWxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTCkKZW5kaWYoU0laRU9GX0xPTkcgRVFVQUwgOCkKCmlmKFNJWkVPRl9MT05HX0xPTkcgRVFVQUwgOCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAibG9uZyBsb25nIikKICBzZXQoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA4KQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJsbGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibGx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsbGQiKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UIExMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTEwpCmVuZGlmKFNJWkVPRl9MT05HX0xPTkcgRVFVQUwgOCkKCmlmKE5PVCBDVVJMX1RZUEVPRl9DVVJMX09GRl9UKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX09GRl9UICR7c3NpemVfdH0pCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgJHtTSVpFT0ZfU1NJWkVfVH0pCiAgIyBUT0RPOiBuZWVkIGFkanVzdG1lbnQgaGVyZS4KICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGQiKQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibHUiKQogIHNldChDVVJMX0ZPUk1BVF9PRkZfVCAiJWxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBMVSkKZW5kaWYoTk9UIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QpCgppZihIQVZFX1NJWkVPRl9MT05HX0xPTkcpCiAgc2V0KEhBVkVfTE9OR0xPTkcgMSkKICBzZXQoSEFWRV9MTCAxKQplbmRpZihIQVZFX1NJWkVPRl9MT05HX0xPTkcpCgpmaW5kX2ZpbGUoUkFORE9NX0ZJTEUgdXJhbmRvbSAvZGV2KQptYXJrX2FzX2FkdmFuY2VkKFJBTkRPTV9GSUxFKQoKIyBDaGVjayBmb3Igc29tZSBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZAppZihIQVZFX0xJQldTMl8zMikKICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTIHdzMl8zMikKZWxzZWlmKEhBVkVfTElCU09DS0VUKQogIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgc29ja2V0KQplbmRpZigpCgpjaGVja19zeW1ib2xfZXhpc3RzKGJhc2VuYW1lICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfQkFTRU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc29ja2V0ICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TT0NLRVQpCiMgcG9sbCBvbiBtYWNPUyBpcyB1bnJlbGlhYmxlLCBpdCBmaXJzdCBkaWQgbm90IGV4aXN0LCB0aGVuIHdhcyBicm9rZW4gdW50aWwKIyBmaXhlZCBpbiAxMC45IG9ubHkgdG8gYnJlYWsgYWdhaW4gaW4gMTAuMTIuCmlmKE5PVCBBUFBMRSkKICBjaGVja19zeW1ib2xfZXhpc3RzKHBvbGwgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BPTEwpCmVuZGlmKCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZWxlY3QgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFTEVDVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJkdXAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkRVUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJzdHIgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlNUUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJ0b2tfciAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlRPS19SKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmZ0aW1lICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRlRJTUUpCmNoZWNrX3N5bWJvbF9leGlzdHModW5hbWUgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9VTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJjYXNlY21wICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkNBU0VDTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyaWNtcCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJJQ01QKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmNtcGkgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSQ01QSSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJuY21waSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUk5DTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKGFsYXJtICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfQUxBUk0pCmlmKE5PVCBIQVZFX1NUUk5DTVBJKQogIHNldChIQVZFX1NUUkNNUEkpCmVuZGlmKE5PVCBIQVZFX1NUUk5DTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieWFkZHIgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZQUREUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnlhZGRyX3IgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZQUREUl9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHRpbWVvZmRheSAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUVElNRU9GREFZKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfYWRkciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9BRERSKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfbnRvYSAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9OVE9BKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfbnRvYV9yICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9OVE9BX1IpCmNoZWNrX3N5bWJvbF9leGlzdHModGNzZXRhdHRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UQ1NFVEFUVFIpCmNoZWNrX3N5bWJvbF9leGlzdHModGNnZXRhdHRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UQ0dFVEFUVFIpCmNoZWNrX3N5bWJvbF9leGlzdHMocGVycm9yICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoY2xvc2Vzb2NrZXQgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9DTE9TRVNPQ0tFVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXR2YnVmICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFZCVUYpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2lnc2V0am1wICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdTRVRKTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cGFzc19yICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRQQVNTX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RybGNhdCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJMQ0FUKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHB3dWlkICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUUFdVSUQpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0ZXVpZCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRFVUlEKQpjaGVja19zeW1ib2xfZXhpc3RzKHV0aW1lICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVVRJTUUpCmlmKENNQUtFX1VTRV9PUEVOU1NMKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoUkFORF9zdGF0dXMgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9SQU5EX1NUQVRVUykKICBjaGVja19zeW1ib2xfZXhpc3RzKFJBTkRfc2NyZWVuICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUkFORF9TQ1JFRU4pCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhSQU5EX2VnZCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1JBTkRfRUdEKQogIGlmKEhBVkVfTElCQ1JZUFRPIEFORCBIQVZFX0xJQlNTTCkKICAgIHNldChVU0VfT1BFTlNTTCAxKQogIGVuZGlmKEhBVkVfTElCQ1JZUFRPIEFORCBIQVZFX0xJQlNTTCkKZW5kaWYoQ01BS0VfVVNFX09QRU5TU0wpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ210aW1lX3IgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HTVRJTUVfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhsb2NhbHRpbWVfciAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0xPQ0FMVElNRV9SKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnluYW1lICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnluYW1lX3IgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZTkFNRV9SKQoKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWduYWwgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR05BTF9GVU5DKQpjaGVja19zeW1ib2xfZXhpc3RzKFNJR0FMUk0gICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0lHTkFMX01BQ1JPKQppZihIQVZFX1NJR05BTF9GVU5DIEFORCBIQVZFX1NJR05BTF9NQUNSTykKICBzZXQoSEFWRV9TSUdOQUwgMSkKZW5kaWYoSEFWRV9TSUdOQUxfRlVOQyBBTkQgSEFWRV9TSUdOQUxfTUFDUk8pCmNoZWNrX3N5bWJvbF9leGlzdHModW5hbWUgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RydG9sbCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSVE9MTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhfc3RydG9pNjQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9fU1RSVE9JNjQpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyZXJyb3JfciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRVJST1JfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdpbnRlcnJ1cHQgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdJTlRFUlJVUFQpCmNoZWNrX3N5bWJvbF9leGlzdHMocGVycm9yICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUEVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGZvcmsgICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZPUkspCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0YWRkcmluZm8gICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUQUREUklORk8pCmNoZWNrX3N5bWJvbF9leGlzdHMoZnJlZWFkZHJpbmZvICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlJFRUFERFJJTkZPKQpjaGVja19zeW1ib2xfZXhpc3RzKGZyZWVpZmFkZHJzICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZSRUVJRkFERFJTKQpjaGVja19zeW1ib2xfZXhpc3RzKHBpcGUgICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BJUEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZnRydW5jYXRlICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfRlRSVU5DQVRFKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHByb3RvYnluYW1lICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFBST1RPQllOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHJsaW1pdCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFJMSU1JVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXRsb2NhbGUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRVRMT0NBTEUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2V0cmxpbWl0ICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUUkxJTUlUKQpjaGVja19zeW1ib2xfZXhpc3RzKGZjbnRsICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZDTlRMKQpjaGVja19zeW1ib2xfZXhpc3RzKGlvY3RsICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lPQ1RMKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldHNvY2tvcHQgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFNPQ0tPUFQpCgojIHN5bWJvbCBleGlzdHMgaW4gd2luMzIsIGJ1dCBmdW5jdGlvbiBkb2VzIG5vdC4KY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGluZXRfcHRvbiBIQVZFX0lORVRfUFRPTikKCmNoZWNrX3N5bWJvbF9leGlzdHMoZnNldHhhdHRyICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZTRVRYQVRUUikKaWYoSEFWRV9GU0VUWEFUVFIpCiAgZm9yZWFjaChDVVJMX1RFU1QgSEFWRV9GU0VUWEFUVFJfNSBIQVZFX0ZTRVRYQVRUUl82KQogICAgY3VybF9pbnRlcm5hbF90ZXN0X3J1bigke0NVUkxfVEVTVH0pCiAgZW5kZm9yZWFjaChDVVJMX1RFU1QpCmVuZGlmKEhBVkVfRlNFVFhBVFRSKQoKIyBzaWdhY3Rpb24gYW5kIHNpZ3NldGptcCBhcmUgc3BlY2lhbC4gVXNlIHNwZWNpYWwgbWVjaGFuaXNtIGZvcgojIGRldGVjdGluZyB0aG9zZSwgYnV0IG9ubHkgaWYgcHJldmlvdXMgYXR0ZW1wdCBmYWlsZWQuCmlmKEhBVkVfU0lHTkFMX0gpCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdhY3Rpb24gInNpZ25hbC5oIiBIQVZFX1NJR0FDVElPTikKZW5kaWYoSEFWRV9TSUdOQUxfSCkKCmlmKE5PVCBIQVZFX1NJR1NFVEpNUCkKICBpZihIQVZFX1NFVEpNUF9IKQogICAgY2hlY2tfc3ltYm9sX2V4aXN0cyhzaWdzZXRqbXAgInNldGptcC5oIiBIQVZFX01BQ1JPX1NJR1NFVEpNUCkKICAgIGlmKEhBVkVfTUFDUk9fU0lHU0VUSk1QKQogICAgICBzZXQoSEFWRV9TSUdTRVRKTVAgMSkKICAgIGVuZGlmKEhBVkVfTUFDUk9fU0lHU0VUSk1QKQogIGVuZGlmKEhBVkVfU0VUSk1QX0gpCmVuZGlmKE5PVCBIQVZFX1NJR1NFVEpNUCkKCiMgSWYgdGhlcmUgaXMgbm8gc3RyaWNtcCgpLCBkbyBub3QgYWxsb3cgTERBUCB0byBwYXJzZSBVUkxzCmlmKE5PVCBIQVZFX1NUUklDTVApCiAgc2V0KEhBVkVfTERBUF9VUkxfUEFSU0UgMSkKZW5kaWYoTk9UIEhBVkVfU1RSSUNNUCkKCiMgRG8gY3VybCBzcGVjaWZpYyB0ZXN0cwpmb3JlYWNoKENVUkxfVEVTVAogICAgSEFWRV9GQ05UTF9PX05PTkJMT0NLCiAgICBIQVZFX0lPQ1RMU09DS0VUCiAgICBIQVZFX0lPQ1RMU09DS0VUX0NBTUVMCiAgICBIQVZFX0lPQ1RMU09DS0VUX0NBTUVMX0ZJT05CSU8KICAgIEhBVkVfSU9DVExTT0NLRVRfRklPTkJJTwogICAgSEFWRV9JT0NUTF9GSU9OQklPCiAgICBIQVZFX0lPQ1RMX1NJT0NHSUZBRERSCiAgICBIQVZFX1NFVFNPQ0tPUFRfU09fTk9OQkxPQ0sKICAgIEhBVkVfU09DS0FERFJfSU42X1NJTjZfU0NPUEVfSUQKICAgIFRJTUVfV0lUSF9TWVNfVElNRQogICAgSEFWRV9PX05PTkJMT0NLCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84CiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl81X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfN19SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzhfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82CiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zX1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNV9SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfUkVFTlRSQU5UCiAgICBIQVZFX1NPQ0tMRU5fVAogICAgSEFWRV9JTl9BRERSX1QKICAgIEhBVkVfQk9PTF9UCiAgICBTVERDX0hFQURFUlMKICAgIFJFVFNJR1RZUEVfVEVTVAogICAgSEFWRV9JTkVUX05UT0FfUl9ERUNMCiAgICBIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEFERFJJTkZPCiAgICBIQVZFX0ZJTEVfT0ZGU0VUX0JJVFMKICAgICkKICBjdXJsX2ludGVybmFsX3Rlc3QoJHtDVVJMX1RFU1R9KQplbmRmb3JlYWNoKENVUkxfVEVTVCkKCmlmKEhBVkVfRklMRV9PRkZTRVRfQklUUykKICBzZXQoX0ZJTEVfT0ZGU0VUX0JJVFMgNjQpCiAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICItRF9GSUxFX09GRlNFVF9CSVRTPTY0IikKZW5kaWYoSEFWRV9GSUxFX09GRlNFVF9CSVRTKQpjaGVja190eXBlX3NpemUoIm9mZl90IiAgU0laRU9GX09GRl9UKQpzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MpCgpmb3JlYWNoKENVUkxfVEVTVAogICAgSEFWRV9HTElCQ19TVFJFUlJPUl9SCiAgICBIQVZFX1BPU0lYX1NUUkVSUk9SX1IKICAgICkKICBjdXJsX2ludGVybmFsX3Rlc3RfcnVuKCR7Q1VSTF9URVNUfSkKZW5kZm9yZWFjaChDVVJMX1RFU1QpCgojIENoZWNrIGZvciByZWVudHJhbnQKZm9yZWFjaChDVVJMX1RFU1QKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzUKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzcKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzgKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzMKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzUKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzYKICAgIEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQpCiAgaWYoTk9UICR7Q1VSTF9URVNUfSkKICAgIGlmKCR7Q1VSTF9URVNUfV9SRUVOVFJBTlQpCiAgICAgIHNldChORUVEX1JFRU5UUkFOVCAxKQogICAgZW5kaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICBlbmRpZihOT1QgJHtDVVJMX1RFU1R9KQplbmRmb3JlYWNoKENVUkxfVEVTVCkKCmlmKE5FRURfUkVFTlRSQU5UKQogIGZvcmVhY2goQ1VSTF9URVNUCiAgICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzUKICAgICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNwogICAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl84CiAgICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzMKICAgICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNQogICAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl82KQogICAgc2V0KCR7Q1VSTF9URVNUfSAwKQogICAgaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICAgICAgc2V0KCR7Q1VSTF9URVNUfSAxKQogICAgZW5kaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICBlbmRmb3JlYWNoKENVUkxfVEVTVCkKZW5kaWYoTkVFRF9SRUVOVFJBTlQpCgppZihIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UKQogIHNldChIQVZFX0lORVRfTlRPQV9SX0RFQ0wgMSkKICBzZXQoTkVFRF9SRUVOVFJBTlQgMSkKZW5kaWYoSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVCkKCiMgU29tZSBvdGhlciBtaW5vciB0ZXN0cwoKaWYoTk9UIEhBVkVfSU5fQUREUl9UKQogIHNldChpbl9hZGRyX3QgInVuc2lnbmVkIGxvbmciKQplbmRpZihOT1QgSEFWRV9JTl9BRERSX1QpCgojIEZpeCBsaWJ6IC8gemxpYi5oCgppZihOT1QgQ1VSTF9TUEVDSUFMX0xJQlopCiAgaWYoTk9UIEhBVkVfTElCWikKICAgIHNldChIQVZFX1pMSUJfSCAwKQogIGVuZGlmKE5PVCBIQVZFX0xJQlopCgogIGlmKE5PVCBIQVZFX1pMSUJfSCkKICAgIHNldChIQVZFX0xJQlogMCkKICBlbmRpZihOT1QgSEFWRV9aTElCX0gpCmVuZGlmKE5PVCBDVVJMX1NQRUNJQUxfTElCWikKCiMgQ2hlY2sgZm9yIG5vbmJsb2NraW5nCnNldChIQVZFX0RJU0FCTEVEX05PTkJMT0NLSU5HIDEpCmlmKEhBVkVfRklPTkJJTyBPUgogICAgSEFWRV9JT0NUTFNPQ0tFVCBPUgogICAgSEFWRV9JT0NUTFNPQ0tFVF9DQVNFIE9SCiAgICBIQVZFX09fTk9OQkxPQ0spCiAgc2V0KEhBVkVfRElTQUJMRURfTk9OQkxPQ0tJTkcpCmVuZGlmKEhBVkVfRklPTkJJTyBPUgogIEhBVkVfSU9DVExTT0NLRVQgT1IKICBIQVZFX0lPQ1RMU09DS0VUX0NBU0UgT1IKICBIQVZFX09fTk9OQkxPQ0spCgppZihSRVRTSUdUWVBFX1RFU1QpCiAgc2V0KFJFVFNJR1RZUEUgdm9pZCkKZWxzZShSRVRTSUdUWVBFX1RFU1QpCiAgc2V0KFJFVFNJR1RZUEUgaW50KQplbmRpZihSRVRTSUdUWVBFX1RFU1QpCgppZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBBTkQgQVBQTEUpCiAgaW5jbHVkZShDaGVja0NDb21waWxlckZsYWcpCiAgY2hlY2tfY19jb21waWxlcl9mbGFnKC1Xbm8tbG9uZy1kb3VibGUgSEFWRV9DX0ZMQUdfV25vX2xvbmdfZG91YmxlKQogIGlmKEhBVkVfQ19GTEFHX1dub19sb25nX2RvdWJsZSkKICAgICMgVGhlIE1hYyB2ZXJzaW9uIG9mIEdDQyB3YXJucyBhYm91dCB1c2Ugb2YgbG9uZyBkb3VibGUuICBEaXNhYmxlIGl0LgogICAgZ2V0X3NvdXJjZV9maWxlX3Byb3BlcnR5KE1QUklOVEZfQ09NUElMRV9GTEFHUyBtcHJpbnRmLmMgQ09NUElMRV9GTEFHUykKICAgIGlmKE1QUklOVEZfQ09NUElMRV9GTEFHUykKICAgICAgc2V0KE1QUklOVEZfQ09NUElMRV9GTEFHUyAiJHtNUFJJTlRGX0NPTVBJTEVfRkxBR1N9IC1Xbm8tbG9uZy1kb3VibGUiKQogICAgZWxzZShNUFJJTlRGX0NPTVBJTEVfRkxBR1MpCiAgICAgIHNldChNUFJJTlRGX0NPTVBJTEVfRkxBR1MgIi1Xbm8tbG9uZy1kb3VibGUiKQogICAgZW5kaWYoTVBSSU5URl9DT01QSUxFX0ZMQUdTKQogICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKG1wcmludGYuYyBQUk9QRVJUSUVTCiAgICAgIENPTVBJTEVfRkxBR1MgJHtNUFJJTlRGX0NPTVBJTEVfRkxBR1N9KQogIGVuZGlmKEhBVkVfQ19GTEFHX1dub19sb25nX2RvdWJsZSkKZW5kaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgQU5EIEFQUExFKQoKaWYoSEFWRV9TT0NLTEVOX1QpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UICJzb2NrbGVuX3QiKQogIGlmKFdJTjMyKQogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgIndpbnNvY2syLmg7d3MydGNwaXAuaCIpCiAgZWxzZWlmKEhBVkVfU1lTX1NPQ0tFVF9IKQogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgInN5cy9zb2NrZXQuaCIpCiAgZW5kaWYoKQogIGNoZWNrX3R5cGVfc2l6ZSgic29ja2xlbl90IiBDVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCkKICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUykKICBpZihOT1QgSEFWRV9DVVJMX1NJWkVPRl9DVVJMX1NPQ0tMRU5fVCkKICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IKICAgICAiQ2hlY2sgZm9yIHNpemVvZiBzb2NrbGVuX3QgZmFpbGVkLCBzZWUgQ01ha2VGaWxlcy9DTWFrZXJyb3IubG9nIikKICBlbmRpZigpCmVsc2UoKQogIHNldChDVVJMX1RZUEVPRl9DVVJMX1NPQ0tMRU5fVCBpbnQpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UICR7U0laRU9GX0lOVH0pCmVuZGlmKCkKCiMgVE9ETyB0ZXN0IHdoaWNoIG9mIHRoZXNlIGhlYWRlcnMgYXJlIHJlcXVpcmVkIGZvciB0aGUgdHlwZWRlZnMgdXNlZCBpbiBjdXJsYnVpbGQuaAppZihXSU4zMikKICBzZXQoQ1VSTF9QVUxMX1dTMlRDUElQX0ggJHtIQVZFX1dTMlRDUElQX0h9KQplbHNlKCkKICBzZXQoQ1VSTF9QVUxMX1NZU19UWVBFU19IICR7SEFWRV9TWVNfVFlQRVNfSH0pCiAgc2V0KENVUkxfUFVMTF9TWVNfU09DS0VUX0ggJHtIQVZFX1NZU19TT0NLRVRfSH0pCiAgc2V0KENVUkxfUFVMTF9TWVNfUE9MTF9IICR7SEFWRV9TWVNfUE9MTF9IfSkKZW5kaWYoKQpzZXQoQ1VSTF9QVUxMX1NURElOVF9IICR7SEFWRV9TVERJTlRfSH0pCnNldChDVVJMX1BVTExfSU5UVFlQRVNfSCAke0hBVkVfSU5UVFlQRVNfSH0pCgppbmNsdWRlKENNYWtlL090aGVyVGVzdHMuY21ha2UpCgphZGRfZGVmaW5pdGlvbnMoLURIQVZFX0NPTkZJR19IKQoKIyBGb3Igd2luZG93cywgZG8gbm90IGFsbG93IHRoZSBjb21waWxlciB0byB1c2UgZGVmYXVsdCB0YXJnZXQgKFZpc3RhKS4KaWYoV0lOMzIpCiAgYWRkX2RlZmluaXRpb25zKC1EX1dJTjMyX1dJTk5UPTB4MDUwMSkKZW5kaWYoV0lOMzIpCgojIEZvciB3aW5kb3dzLCBhbGwgY29tcGlsZXJzIHVzZWQgYnkgY21ha2Ugc2hvdWxkIHN1cHBvcnQgbGFyZ2UgZmlsZXMKaWYoV0lOMzIpCiAgc2V0KFVTRV9XSU4zMl9MQVJHRV9GSUxFUyBPTikKZW5kaWYoV0lOMzIpCgppZihNU1ZDKQogIGFkZF9kZWZpbml0aW9ucygtRF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAtRF9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEUpCmVuZGlmKE1TVkMpCgojIFVnbHkgKGJ1dCBmdW5jdGlvbmFsKSB3YXkgdG8gaW5jbHVkZSAiTWFrZWZpbGUuaW5jIiBieSB0cmFuc2Zvcm1pbmcgaXQgKD0gcmVnZW5lcmF0ZSBpdCkuCmZ1bmN0aW9uKFRSQU5TRk9STV9NQUtFRklMRV9JTkMgSU5QVVRfRklMRSBPVVRQVVRfRklMRSkKICBmaWxlKFJFQUQgJHtJTlBVVF9GSUxFfSBNQUtFRklMRV9JTkNfVEVYVCkKICBzdHJpbmcoUkVQTEFDRSAiJCh0b3Bfc3JjZGlyKSIgICAiXCR7Q1VSTF9TT1VSQ0VfRElSfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCiAgc3RyaW5nKFJFUExBQ0UgIiQodG9wX2J1aWxkZGlyKSIgIlwke0NVUkxfQklOQVJZX0RJUn0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQoKICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXFxcXFxuIiAipyGnIiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiKFthLXpBLVpfXVthLXpBLVowLTlfXSopW1x0IF0qPVtcdCBdKihbXlxuXSopIiAiU0VUKFxcMSBcXDIpIiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKICBzdHJpbmcoUkVQTEFDRSAipyGnIiAiXG4iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQoKICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXFwkXFwoKFthLXpBLVpfXVthLXpBLVowLTlfXSopXFwpIiAiXCR7XFwxfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pICAgICMgUmVwbGFjZSAkKCkgd2l0aCAke30KICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiQChbYS16QS1aX11bYS16QS1aMC05X10qKUAiICJcJHtcXDF9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkgICAgIyBSZXBsYWNlIEBAIHdpdGggJHt9LCBldmVuIGlmIHRoYXQgbWF5IG5vdCBiZSByZWFkIGJ5IENNYWtlIHNjcmlwdHMuCiAgZmlsZShXUklURSAke09VVFBVVF9GSUxFfSAke01BS0VGSUxFX0lOQ19URVhUfSkKCmVuZGZ1bmN0aW9uKCkKCmFkZF9zdWJkaXJlY3RvcnkobGliKQppZihCVUlMRF9DVVJMX0VYRSkKICBhZGRfc3ViZGlyZWN0b3J5KHNyYykKZW5kaWYoKQoKaW5jbHVkZShDVGVzdCkKaWYoQlVJTERfVEVTVElORykKICBhZGRfc3ViZGlyZWN0b3J5KHRlc3RzKQplbmRpZigpCgojIFRPRE8gc3VwcG9ydCBHTlVUTFMsIE5TUywgUE9MQVJTU0wsIEFYVExTLCBDWUFTU0wsIFdJTlNTTCwgREFSV0lOU1NMCmlmKFVTRV9PUEVOU1NMKQogIHNldChTU0xfRU5BQkxFRCAxKQplbmRpZigpCgojIEhlbHBlciB0byBwb3B1bGF0ZSBhIGxpc3QgKF9pdGVtcykgd2l0aCBhIGxhYmVsIHdoZW4gY29uZGl0aW9ucyAodGhlIHJlbWFpbmluZwojIGFyZ3MpIGFyZSBzYXRpc2ZpZWQKZnVuY3Rpb24oX2FkZF9pZiBsYWJlbCkKICAjIFRPRE8gbmVlZCB0byBkaXNhYmxlIHBvbGljeSBDTVAwMDU0IChDTWFrZSAzLjEpIHRvIGFsbG93IHRoaXMgaW5kaXJlY3Rpb24KICBpZigke0FSR059KQogICAgc2V0KF9pdGVtcyAke19pdGVtc30gIiR7bGFiZWx9IiBQQVJFTlRfU0NPUEUpCiAgZW5kaWYoKQplbmRmdW5jdGlvbigpCgojIENsZWFyIGxpc3QgYW5kIHRyeSB0byBkZXRlY3QgYXZhaWxhYmxlIGZlYXR1cmVzCnNldChfaXRlbXMpCl9hZGRfaWYoIldpblNTTCIgICAgICAgIFNTTF9FTkFCTEVEIEFORCBVU0VfV0lORE9XU19TU1BJKQpfYWRkX2lmKCJPcGVuU1NMIiAgICAgICBTU0xfRU5BQkxFRCBBTkQgVVNFX09QRU5TU0wpCl9hZGRfaWYoIklQdjYiICAgICAgICAgIEVOQUJMRV9JUFY2KQpfYWRkX2lmKCJ1bml4LXNvY2tldHMiICBVU0VfVU5JWF9TT0NLRVRTKQpfYWRkX2lmKCJsaWJ6IiAgICAgICAgICBIQVZFX0xJQlopCl9hZGRfaWYoIkFzeW5jaEROUyIgICAgIFVTRV9BUkVTIE9SIFVTRV9USFJFQURTX1BPU0lYIE9SIFVTRV9USFJFQURTX1dJTjMyKQpfYWRkX2lmKCJJRE4iICAgICAgICAgICBIQVZFX0xJQklETjIpCl9hZGRfaWYoIkxhcmdlZmlsZSIgICAgIChDVVJMX1NJWkVPRl9DVVJMX09GRl9UIEdSRUFURVIgNCkgQU5ECiAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRU9GX09GRl9UIEdSRUFURVIgNCkgT1IgVVNFX1dJTjMyX0xBUkdFX0ZJTEVTKSkKIyBUT0RPIFNTUDEgKFdpblNTTCkgY2hlY2sgaXMgbWlzc2luZwpfYWRkX2lmKCJTU1BJIiAgICAgICAgICBVU0VfV0lORE9XU19TU1BJKQpfYWRkX2lmKCJHU1MtQVBJIiAgICAgICBIQVZFX0dTU0FQSSkKIyBUT0RPIFNTUDEgbWlzc2luZyBmb3IgU1BORUdPCl9hZGRfaWYoIlNQTkVHTyIgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEggQU5ECiAgICAgICAgICAgICAgICAgICAgICAgIChIQVZFX0dTU0FQSSBPUiBVU0VfV0lORE9XU19TU1BJKSkKX2FkZF9pZigiS2VyYmVyb3MiICAgICAgTk9UIENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCBBTkQKICAgICAgICAgICAgICAgICAgICAgICAgKEhBVkVfR1NTQVBJIE9SIFVTRV9XSU5ET1dTX1NTUEkpKQojIE5UTE0gc3VwcG9ydCByZXF1aXJlcyBjcnlwdG8gZnVuY3Rpb24gYWRhcHRpb25zIGZyb20gdmFyaW91cyBTU0wgbGlicwojIFRPRE8gYWx0ZXJuYXRpdmUgU1NMIGxpYnMgdGVzdHMgZm9yIFNTUDEsIEdOVVRMUywgTlNTLCBEQVJXSU5TU0wKaWYoTk9UIENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCBBTkQgKFVTRV9PUEVOU1NMIE9SCiAgIFVTRV9XSU5ET1dTX1NTUEkgT1IgR05VVExTX0VOQUJMRUQgT1IgTlNTX0VOQUJMRUQgT1IgREFSV0lOU1NMX0VOQUJMRUQpKQogIF9hZGRfaWYoIk5UTE0iICAgICAgICAxKQogICMgVE9ETyBtaXNzaW5nIG9wdGlvbiAoYXV0b2NvbmY6IC0tZW5hYmxlLW50bG0td2IpCiAgX2FkZF9pZigiTlRMTV9XQiIgICAgIE5PVCBDVVJMX0RJU0FCTEVfSFRUUCBBTkQgTlRMTV9XQl9FTkFCTEVEKQplbmRpZigpCiMgVE9ETyBtaXNzaW5nIG9wdGlvbiAoLS1lbmFibGUtdGxzLXNycCksIGRlcGVuZHMgb24gR05VVExTX1NSUC9PUEVOU1NMX1NSUApfYWRkX2lmKCJUTFMtU1JQIiAgICAgICBVU0VfVExTX1NSUCkKIyBUT0RPIG9wdGlvbiAtLXdpdGgtbmdodHRwMiB0ZXN0cyBmb3IgbmdodHRwMiBsaWIgYW5kIG5naHR0cDIvbmdodHRwMi5oIGhlYWRlcgpfYWRkX2lmKCJIVFRQMiIgICAgICAgICBVU0VfTkdIVFRQMikKc3RyaW5nKFJFUExBQ0UgIjsiICIgIiBTVVBQT1JUX0ZFQVRVUkVTICIke19pdGVtc30iKQptZXNzYWdlKFNUQVRVUyAiRW5hYmxlZCBmZWF0dXJlczogJHtTVVBQT1JUX0ZFQVRVUkVTfSIpCgojIENsZWFyIGxpc3QgYW5kIHRyeSB0byBkZXRlY3QgYXZhaWxhYmxlIHByb3RvY29scwpzZXQoX2l0ZW1zKQpfYWRkX2lmKCJIVFRQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0hUVFApCl9hZGRfaWYoIkhUVFBTIiAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfSFRUUCBBTkQgU1NMX0VOQUJMRUQpCl9hZGRfaWYoIkZUUCIgICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfRlRQKQpfYWRkX2lmKCJGVFBTIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0ZUUCBBTkQgU1NMX0VOQUJMRUQpCl9hZGRfaWYoIkZJTEUiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfRklMRSkKX2FkZF9pZigiVEVMTkVUIiAgICAgICAgTk9UIENVUkxfRElTQUJMRV9URUxORVQpCl9hZGRfaWYoIkxEQVAiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfTERBUCkKIyBDVVJMX0RJU0FCTEVfTERBUCBpbXBsaWVzIENVUkxfRElTQUJMRV9MREFQUwojIFRPRE8gY2hlY2sgSEFWRV9MREFQX1NTTCAoaW4gYXV0b2NvbmYgdGhpcyBpcyBlbmFibGVkIHdpdGggLS1lbmFibGUtbGRhcHMpCl9hZGRfaWYoIkxEQVBTIiAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfTERBUFMgQU5ECiAgICAgICAgICAgICAgICAgICAgICAgICgoVVNFX09QRU5MREFQIEFORCBTU0xfRU5BQkxFRCkgT1IKICAgICAgICAgICAgICAgICAgICAgICAgKE5PVCBVU0VfT1BFTkxEQVAgQU5EIEhBVkVfTERBUF9TU0wpKSkKX2FkZF9pZigiRElDVCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9ESUNUKQpfYWRkX2lmKCJURlRQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1RGVFApCl9hZGRfaWYoIkdPUEhFUiIgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfR09QSEVSKQpfYWRkX2lmKCJQT1AzIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1BPUDMpCl9hZGRfaWYoIlBPUDNTIiAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfUE9QMyBBTkQgU1NMX0VOQUJMRUQpCl9hZGRfaWYoIklNQVAiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfSU1BUCkKX2FkZF9pZigiSU1BUFMiICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9JTUFQIEFORCBTU0xfRU5BQkxFRCkKX2FkZF9pZigiU01UUCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9TTVRQKQpfYWRkX2lmKCJTTVRQUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1NNVFAgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJTQ1AiICAgICAgICAgICBVU0VfTElCU1NIMikKX2FkZF9pZigiU0ZUUCIgICAgICAgICAgVVNFX0xJQlNTSDIpCl9hZGRfaWYoIlJUU1AiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfUlRTUCkKX2FkZF9pZigiUlRNUCIgICAgICAgICAgVVNFX0xJQlJUTVApCmxpc3QoU09SVCBfaXRlbXMpCnN0cmluZyhSRVBMQUNFICI7IiAiICIgU1VQUE9SVF9QUk9UT0NPTFMgIiR7X2l0ZW1zfSIpCm1lc3NhZ2UoU1RBVFVTICJFbmFibGVkIHByb3RvY29sczogJHtTVVBQT1JUX1BST1RPQ09MU30iKQoKIyBjdXJsLWNvbmZpZyBuZWVkcyB0aGUgZm9sbG93aW5nIG9wdGlvbnMgdG8gYmUgc2V0LgpzZXQoQ0MgICAgICAgICAgICAgICAgICAgICAgIiR7Q01BS0VfQ19DT01QSUxFUn0iKQojIFRPRE8gcHJvYmFibHkgcHV0IGEgLUQuLi4gb3B0aW9ucyBoZXJlPwpzZXQoQ09ORklHVVJFX09QVElPTlMgICAgICAgIiIpCiMgVE9ETyB3aGVuIHRvIHNldCAiLURDVVJMX1NUQVRJQ0xJQiIgZm9yIENQUEZMQUdfQ1VSTF9TVEFUSUNMSUI/CnNldChDUFBGTEFHX0NVUkxfU1RBVElDTElCICAiIikKIyBUT0RPIG5lZWQgdG8gc2V0IHRoaXMgKHNlZSBDVVJMX0NIRUNLX0NBX0JVTkRMRSBpbiBhY2luY2x1ZGUubTQpCnNldChDVVJMX0NBX0JVTkRMRSAgICAgICAgICAiIikKc2V0KENVUkxWRVJTSU9OICAgICAgICAgICAgICIke0NVUkxfVkVSU0lPTn0iKQpzZXQoRU5BQkxFX1NIQVJFRCAgICAgICAgICAgInllcyIpCmlmKENVUkxfU1RBVElDTElCKQogIHNldChFTkFCTEVfU1RBVElDICAgICAgICAgInllcyIpCmVsc2UoKQogIHNldChFTkFCTEVfU1RBVElDICAgICAgICAgIm5vIikKZW5kaWYoKQpzZXQoZXhlY19wcmVmaXggICAgICAgICAgICAgIlwke3ByZWZpeH0iKQpzZXQoaW5jbHVkZWRpciAgICAgICAgICAgICAgIlwke3ByZWZpeH0vaW5jbHVkZSIpCnNldChMREZMQUdTICAgICAgICAgICAgICAgICAiJHtDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTfSIpCnNldChMSUJDVVJMX0xJQlMgICAgICAgICAgICAiIikKc2V0KGxpYmRpciAgICAgICAgICAgICAgICAgICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS9saWIiKQpmb3JlYWNoKF9saWIgJHtDTUFLRV9DX0lNUExJQ0lUX0xJTktfTElCUkFSSUVTfSAke0NVUkxfTElCU30pCiAgaWYoX2xpYiBNQVRDSEVTICIuKi8uKiIpCiAgICBzZXQoTElCQ1VSTF9MSUJTICAgICAgICAgICIke0xJQkNVUkxfTElCU30gJHtfbGlifSIpCiAgZWxzZSgpCiAgICBzZXQoTElCQ1VSTF9MSUJTICAgICAgICAgICIke0xJQkNVUkxfTElCU30gLWwke19saWJ9IikKICBlbmRpZigpCmVuZGZvcmVhY2goKQojICJhIiAoTGludXgpIG9yICJsaWIiIChXaW5kb3dzKQpzdHJpbmcoUkVQTEFDRSAiLiIgIiIgbGliZXh0ICIke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1NVRkZJWH0iKQpzZXQocHJlZml4ICAgICAgICAgICAgICAgICAgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9IikKIyBTZXQgdGhpcyB0byAieWVzIiB0byBhcHBlbmQgYWxsIGxpYnJhcmllcyBvbiB3aGljaCAtbGN1cmwgaXMgZGVwZW5kZW50CnNldChSRVFVSVJFX0xJQl9ERVBTICAgICAgICAibm8iKQojIFNVUFBPUlRfRkVBVFVSRVMKIyBTVVBQT1JUX1BST1RPQ09MUwpzZXQoVkVSU0lPTk5VTSAgICAgICAgICAgICAgIiR7Q1VSTF9WRVJTSU9OX05VTX0iKQoKIyBGaW5hbGx5IGdlbmVyYXRlIGEgImN1cmwtY29uZmlnIiBtYXRjaGluZyB0aGlzIGNvbmZpZwpjb25maWd1cmVfZmlsZSgiJHtDVVJMX1NPVVJDRV9ESVJ9L2N1cmwtY29uZmlnLmluIgogICAgICAgICAgICAgICAiJHtDVVJMX0JJTkFSWV9ESVJ9L2N1cmwtY29uZmlnIiBAT05MWSkKaW5zdGFsbChGSUxFUyAiJHtDVVJMX0JJTkFSWV9ESVJ9L2N1cmwtY29uZmlnIgogICAgICAgIERFU1RJTkFUSU9OIGJpbgogICAgICAgIFBFUk1JU1NJT05TCiAgICAgICAgICBPV05FUl9SRUFEIE9XTkVSX1dSSVRFIE9XTkVSX0VYRUNVVEUKICAgICAgICAgIEdST1VQX1JFQUQgR1JPVVBfRVhFQ1VURQogICAgICAgICAgV09STERfUkVBRCBXT1JMRF9FWEVDVVRFKQoKIyBGaW5hbGx5IGdlbmVyYXRlIGEgcGtnLWNvbmZpZyBmaWxlIG1hdGNoaW5nIHRoaXMgY29uZmlnCmNvbmZpZ3VyZV9maWxlKCIke0NVUkxfU09VUkNFX0RJUn0vbGliY3VybC5wYy5pbiIKICAgICAgICAgICAgICAgIiR7Q1VSTF9CSU5BUllfRElSfS9saWJjdXJsLnBjIiBAT05MWSkKaW5zdGFsbChGSUxFUyAiJHtDVVJMX0JJTkFSWV9ESVJ9L2xpYmN1cmwucGMiCiAgICAgICAgREVTVElOQVRJT04gbGliL3BrZ2NvbmZpZykKCiMgVGhpcyBuZWVkcyB0byBiZSBydW4gdmVyeSBsYXN0IHNvIG90aGVyIHBhcnRzIG9mIHRoZSBzY3JpcHRzIGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGlzLgppZihOT1QgQ1VSTF9DT05GSUdfSEFTX0JFRU5fUlVOX0JFRk9SRSkKICBzZXQoQ1VSTF9DT05GSUdfSEFTX0JFRU5fUlVOX0JFRk9SRSAxIENBQ0hFIElOVEVSTkFMICJGbGFnIHRvIHRyYWNrIHdoZXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBydW5uaW5nIENNYWtlIG9yIGlmIENNYWtlIGhhcyBiZWVuIGNvbmZpZ3VyZWQgYmVmb3JlIikKZW5kaWYoKQoKIyBJbnN0YWxsYXRpb24uCiMgRmlyc3QsIGluc3RhbGwgZ2VuZXJhdGVkIGN1cmxidWlsZC5oCmluc3RhbGwoRklMRVMgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9pbmNsdWRlL2N1cmwvY3VybGJ1aWxkLmgiCiAgICBERVNUSU5BVElPTiBpbmNsdWRlL2N1cmwgKQojIE5leHQsIGluc3RhbGwgb3RoZXIgaGVhZGVycyBleGNsdWRpbmcgY3VybGJ1aWxkLmgKaW5zdGFsbChESVJFQ1RPUlkgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbmNsdWRlL2N1cmwiCiAgICBERVNUSU5BVElPTiBpbmNsdWRlCiAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmgiCiAgICBQQVRURVJOICJjdXJsYnVpbGQuaCIgRVhDTFVERSkKCgojIFdvcmthcm91bmQgZm9yIE1TVlMxMCB0byBhdm9pZCB0aGUgRGlhbG9nIEhlbGwKIyBGSVhNRTogVGhpcyBjb3VsZCBiZSByZW1vdmVkIHdpdGggZnV0dXJlIHZlcnNpb24gb2YgQ01ha2UuCmlmKE1TVkNfVkVSU0lPTiBFUVVBTCAxNjAwKQogIHNldChDVVJMX1NMTl9GSUxFTkFNRSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L0NVUkwuc2xuIikKICBpZihFWElTVFMgIiR7Q1VSTF9TTE5fRklMRU5BTUV9IikKICAgIGZpbGUoQVBQRU5EICIke0NVUkxfU0xOX0ZJTEVOQU1FfSIgIlxuIyBUaGlzIHNob3VsZCBiZSByZWdlbmVyYXRlZCFcbiIpCiAgZW5kaWYoKQplbmRpZigpCg==