LyoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgKgoqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqICRTb3VyY2U6IC94c3JsL05zdm4vaWN1L3VuaWNvZGV0b29scy9jb20vaWJtL3RleHQvVUNBL1dyaXRlSFRNTENvbGxhdGlvbi5qYXZhLHYgJCAKKiAkRGF0ZTogMjAwNS8wMy8wNCAwMjo1MDoyNSAkIAoqICRSZXZpc2lvbjogMS45ICQKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgovL1dBUk5JTkc6IE9MRCBGSUxFLiBET04iVCBDT01QSUxFLgoKcGFja2FnZSBjb20uaWJtLnRleHQuVUNBOwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5pby4qOwovL2ltcG9ydCBqYXZhLnRleHQuKjsKLy9pbXBvcnQgY29tLmlibS50ZXh0LnVuaWNvZGUuKjsKaW1wb3J0IGNvbS5pYm0udGV4dC5VQ0QuKjsKaW1wb3J0IGNvbS5pYm0udGV4dC51dGlsaXR5Lio7CgpwdWJsaWMgY2xhc3MgV3JpdGVIVE1MQ29sbGF0aW9uIGltcGxlbWVudHMgVUNEX1R5cGVzIHsKCi8qICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9IAogICAgICAiQ29weXJpZ2h0IChDKSAyMDAwLCBJQk0gQ29ycC4gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iOwogICAgICAKICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYQ0xVREVfVU5TVVBQT1JURUQgPSB0cnVlOyAgICAKICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFRF9ORkNfTUlTTUFUQ0hFUyA9IHRydWU7ICAgIAogICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gRE9fQ0hBUlRTID0gdHJ1ZTsgICAKICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFdSSVRFX05BTUVfSU5fQ09ORk9STUFOQ0UgPSB0cnVlOyAgIAogICAgCiAgICAKICAgIHN0YXRpYyBVQ0EgY29sbGF0b3I7CiAgICBzdGF0aWMgY2hhciB1bmlxdWUgPSAnXHUwMDAwJzsKICAgIHN0YXRpYyBUcmVlTWFwIHNvcnRlZEQgPSBuZXcgVHJlZU1hcCgpOwogICAgc3RhdGljIFRyZWVNYXAgc29ydGVkTiA9IG5ldyBUcmVlTWFwKCk7CiAgICBzdGF0aWMgSGFzaE1hcCBiYWNrRCA9IG5ldyBIYXNoTWFwKCk7CiAgICBzdGF0aWMgSGFzaE1hcCBiYWNrTiA9IG5ldyBIYXNoTWFwKCk7CiAgICBzdGF0aWMgVHJlZU1hcCBkdXBsaWNhdGVzID0gbmV3IFRyZWVNYXAoKTsKICAgIHN0YXRpYyBpbnQgZHVwbGljYXRlQ291bnQgPSAwOwogICAgc3RhdGljIFByaW50V3JpdGVyIGxvZzsKICAgIAogICAgc3RhdGljIFVDRCB1Y2Q7CiAgICBzdGF0aWMgTm9ybWFsaXplciBuZmMsIG5mZCwgbmZrZCwgbmZrYzsKICAgIAogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAKICAgICAgICBjaGVja0ltcGxpY2l0KCk7CiAgICAgICAgY2hlY2tGaXhlcygpOwogICAgICAgIAogICAgICAgIFN0cmluZyB1bmljb2RlVmVyc2lvbiA9ICIiOwogICAgICAgIAogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQnVpbGRpbmcgVUNBIik7CiAgICAgICAgY29sbGF0b3IgPSBuZXcgVUNBKG51bGwsIHVuaWNvZGVWZXJzaW9uKTsKICAgICAgICBuZmMgPSBuZXcgTm9ybWFsaXplcihORkMsIHVuaWNvZGVWZXJzaW9uKTsKICAgICAgICBuZmtjID0gbmV3IE5vcm1hbGl6ZXIoTkZLQywgdW5pY29kZVZlcnNpb24pOwogICAgICAgIG5mZCA9IG5ldyBOb3JtYWxpemVyKE5GRCwgdW5pY29kZVZlcnNpb24pOwogICAgICAgIG5ma2QgPSBuZXcgTm9ybWFsaXplcihORktELCB1bmljb2RlVmVyc2lvbik7CiAgICAgICAgCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCdWlsZGluZyBVQ0QgZGF0YSAob2xkKSIpOwogICAgICAgIC8vVUluZm8uaW5pdCgpOwogICAgICAgIHVjZCA9IFVDRC5tYWtlKCIiKTsKICAgICAgICAKICAgICAgICAKICAgICAgICBOb3JtYWxpemVyIGZvbyA9IG5ldyBOb3JtYWxpemVyKE5vcm1hbGl6ZXIuTkZLRCk7CiAgICAgICAgY2hhciB4ID0gJ1x1MUVFMic7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFVDQS5oZXgoeCkgKyAiICIgKyB1Y2QuZ2V0TmFtZSh4KSk7CiAgICAgICAgU3RyaW5nIG54ID0gZm9vLm5vcm1hbGl6ZSh4KTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG54Lmxlbmd0aCgpOyArK2kpIHsKICAgICAgICAgICAgY2hhciBjID0gbnguY2hhckF0KGkpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odWNkLmdldENhbm9uaWNhbENsYXNzKGMpKTsKICAgICAgICB9CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFVDQS5oZXgobngsICIgIikgKyAiICIgKyB1Y2QuZ2V0TmFtZShueCkpOwogICAgICAgIAogICAgICAgIAogICAgICAgIC8vIERPIEZPTExPV0lORwogICAgICAgIC8vd3JpdGVDb25mb3JtYW5jZSgiQ29sbGF0aW9uVGVzdF9OT05fSUdOT1JBQkxFLnR4dCIsIFVDQS5OT05fSUdOT1JBQkxFKTsKICAgICAgICAvL3dyaXRlQ29uZm9ybWFuY2UoIkNvbGxhdGlvblRlc3RfU0hJRlRFRC50eHQiLCBVQ0EuU0hJRlRFRCk7CiAgICAgICAKICAgICAgICAvLyBTS0lQIEJFTE9XCiAgICAgICAgaWYgKHRydWUpIHJldHVybjsKICAgICAgICAKICAgICAgICB3cml0ZUZyYWN0aW9uYWxVQ0EoIkZyYWN0aW9uYWxVQ0EudHh0Iik7CiAgICAgICAgd3JpdGVSdWxlcyhXSVRIX05BTUVTKTsKICAgICAgICB3cml0ZVJ1bGVzKFdJVEhPVVRfTkFNRVMpOwogICAgICAgIAogICAgICAgIHRlc3RDb21wYXRpYmlsaXR5Q2hhcmFjdGVycygpOwogICAgICAgIAogICAgICAgIFN0cmluZyBzID0gY29sbGF0b3IuZ2V0U29ydEtleSgiXHUxMDI1XHUxMDJFIiwgVUNBLk5PTl9JR05PUkFCTEUsIHRydWUpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihVdGlsaXR5LmhleCgiXHUwNTk1XHUwMzI1IikgKyAiLCAiICsgY29sbGF0b3IudG9TdHJpbmcocykpOwogICAgICAgIFN0cmluZyB0ID0gY29sbGF0b3IuZ2V0U29ydEtleSgiXHUwNTk2XHUwMzI1IiwgVUNBLk5PTl9JR05PUkFCTEUsIHRydWUpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihVdGlsaXR5LmhleCgiXHUwNTk2XHUwMzI1IikgKyAiLCAiICsgY29sbGF0b3IudG9TdHJpbmcodCkpOwogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIHdyaXRlQ29sbGF0aW9uVmFsaWRpdHlMb2coKTsKICAgICAgICAKICAgICAgICB3cml0ZUNhc2VFeGNlcHRpb25zKCk7CiAgICAgICAgd3JpdGVDYXNlRm9sZGluZygpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uZSIpOwogICAgfQogICAgCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSID0gImM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFxEYXZpc1xcTXkgRG9jdW1lbnRzXFxVbmljb2RlRGF0YVxcVXBkYXRlIDMuMC4xXFwiOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJUjMxID0gImM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFxEYXZpc1xcTXkgRG9jdW1lbnRzXFxVbmljb2RlRGF0YVxcVXBkYXRlIDMuMVxcIjsKICAgIAogICAgc3RhdGljIHB1YmxpYyB2b2lkIHdyaXRlQ2FzZUV4Y2VwdGlvbnMoKSB7CiAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXcml0aW5nIENhc2UgRXhjZXB0aW9ucyIpOwogICAgICAgIC8vTm9ybWFsaXplciBORktDID0gbmV3IE5vcm1hbGl6ZXIoTm9ybWFsaXplci5ORktDKTsKICAgICAgICBmb3IgKGNoYXIgYSA9IDA7IGEgPCAweEZGRkY7ICsrYSkgewogICAgICAgICAgICBpZiAoIXVjZC5pc1JlcHJlc2VudGVkKGEpKSBjb250aW51ZTsKICAgICAgICAgICAgLy9pZiAoMHhBMDAwIDw9IGEgJiYgYSA8PSAweEE0OEYpIGNvbnRpbnVlOyAvLyBza2lwIFlJCgogICAgICAgICAgICBTdHJpbmcgYiA9IENhc2UuZm9sZChhKTsKICAgICAgICAgICAgU3RyaW5nIGMgPSBuZmtjLm5vcm1hbGl6ZShiKTsKICAgICAgICAgICAgU3RyaW5nIGQgPSBDYXNlLmZvbGQoYyk7CiAgICAgICAgICAgIFN0cmluZyBlID0gbmZrYy5ub3JtYWxpemUoZCk7CiAgICAgICAgICAgIGlmICghZS5lcXVhbHMoYykpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihVdGlsaXR5LmhleChhKSArICI7ICIgKyBVdGlsaXR5LmhleChkLCAiICIpICsgIiAjICIgKyB1Y2QuZ2V0TmFtZShhKSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihVdGlsaXR5LmhleChhKSAKICAgICAgICAgICAgICAgICsgIiwgIiArIFV0aWxpdHkuaGV4KGIsICIgIikKICAgICAgICAgICAgICAgICsgIiwgIiArIFV0aWxpdHkuaGV4KGMsICIgIikKICAgICAgICAgICAgICAgICsgIiwgIiArIFV0aWxpdHkuaGV4KGQsICIgIikKICAgICAgICAgICAgICAgICsgIiwgIiArIFV0aWxpdHkuaGV4KGUsICIgIikpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odWNkLmdldE5hbWUoYSkgCiAgICAgICAgICAgICAgICArICIsICIgKyB1Y2QuZ2V0TmFtZShiKQogICAgICAgICAgICAgICAgKyAiLCAiICsgdWNkLmdldE5hbWUoYykKICAgICAgICAgICAgICAgICsgIiwgIiArIHVjZC5nZXROYW1lKGQpCiAgICAgICAgICAgICAgICArICIsICIgKyB1Y2QuZ2V0TmFtZShlKSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICBTdHJpbmcgZiA9IENhc2UuZm9sZChlKTsKICAgICAgICAgICAgU3RyaW5nIGcgPSBuZmtjLm5vcm1hbGl6ZShmKTsKICAgICAgICAgICAgaWYgKCFmLmVxdWFscyhkKSB8fCAhZy5lcXVhbHMoZSkpIFN5c3RlbS5vdXQucHJpbnRsbigiISEhISEhU0tZIElTIEZBTExJTkchISEhISEiKTsKICAgICAgICB9CiAgICB9CiAKICAgIHN0YXRpYyBwdWJsaWMgdm9pZCB3cml0ZUNhc2VGb2xkaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIldyaXRpbmcgSmF2YXNjcmlwdCBkYXRhIik7CiAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoRElSMzEgKyAiQ2FzZUZvbGRpbmctMy5kMy5hbHBoYS50eHQiKSwgNjQqMTAyNCk7CiAgICAgICAgbG9nID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJDYXNlRm9sZGluZ19kYXRhLmpzIikpOwogICAgICAgIGxvZy5wcmludGxuKCJ2YXIgQ0YgPSBuZXcgT2JqZWN0KCk7Iik7CiAgICAgICAgaW50IGNvdW50ID0gMDsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICBTdHJpbmcgbGluZSA9IGluLnJlYWRMaW5lKCk7CiAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIGJyZWFrOwogICAgICAgICAgICBpbnQgY29tbWVudCA9IGxpbmUuaW5kZXhPZignIycpOyAgICAgICAgICAgICAgICAgICAgLy8gc3RyaXAgY29tbWVudHMKICAgICAgICAgICAgaWYgKGNvbW1lbnQgIT0gLTEpIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLGNvbW1lbnQpOwogICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSBjb250aW51ZTsKICAgICAgICAgICAgaW50IHNlbWkxID0gbGluZS5pbmRleE9mKCc7Jyk7CiAgICAgICAgICAgIGludCBzZW1pMiA9IGxpbmUuaW5kZXhPZignOycsIHNlbWkxKzEpOwogICAgICAgICAgICBpbnQgc2VtaTMgPSBsaW5lLmluZGV4T2YoJzsnLCBzZW1pMisxKTsKICAgICAgICAgICAgY2hhciB0eXBlID0gbGluZS5zdWJzdHJpbmcoc2VtaTErMSxzZW1pMikudHJpbSgpLmNoYXJBdCgwKTsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ0MnIHx8IHR5cGUgPT0gJ0YnIHx8IHR5cGUgPT0gJ1QnKSB7CiAgICAgICAgICAgICAgICBTdHJpbmcgY29kZSA9IGxpbmUuc3Vic3RyaW5nKDAsc2VtaTEpLnRyaW0oKTsKICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSAiICIgKyBsaW5lLnN1YnN0cmluZyhzZW1pMisxLHNlbWkzKS50cmltKCk7CiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXBsYWNlKHJlc3VsdCwgJyAnLCAiXFx1Iik7CiAgICAgICAgICAgICAgICBsb2cucHJpbnRsbigiXHQgQ0ZbMHgiICsgY29kZSArICJdPSciICsgcmVzdWx0ICsgIic7Iik7CiAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxvZy5wcmludGxuKCIvLyAiICsgY291bnQgKyAiIGNhc2UgZm9sZGluZ3MgdG90YWwiKTsKICAgICAgICAKICAgICAgICBpbi5jbG9zZSgpOwogICAgICAgIGxvZy5jbG9zZSgpOwogICAgfQogICAgCiAgICBzdGF0aWMgcHVibGljIFN0cmluZyByZXBsYWNlKFN0cmluZyBzb3VyY2UsIGNoYXIgdG9CZVJlcGxhY2VkLCBTdHJpbmcgdG9SZXBsYWNlKSB7CiAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGgoKTsgKytpKSB7CiAgICAgICAgICAgIGNoYXIgYyA9IHNvdXJjZS5jaGFyQXQoaSk7CiAgICAgICAgICAgIGlmIChjID09IHRvQmVSZXBsYWNlZCkgewogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b1JlcGxhY2UpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAgICB9CiAgICAKICAgIHN0YXRpYyB2b2lkIHdyaXRlQ29uZm9ybWFuY2UoU3RyaW5nIGZpbGVuYW1lLCBieXRlIG9wdGlvbikgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgUHJpbnRXcml0ZXIgbG9nID0gVXRpbGl0eS5vcGVuUHJpbnRXcml0ZXIoZmlsZW5hbWUpOwoKICAgICAgICBsb2cud3JpdGUoJ1x1RkVGRicpOwogICAgICAgIAogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU29ydGluZyIpOwogICAgICAgIAogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IDB4RkZGRjsgKytpKSB7CiAgICAgICAgICAgIGNoYXIgYyA9IChjaGFyKWk7CiAgICAgICAgICAgIGlmICghdWNkLmlzUmVwcmVzZW50ZWQoYykpIGNvbnRpbnVlOwogICAgICAgICAgICAvL2lmICgweEEwMDAgPD0gYyAmJiBjIDw9IDB4QTQ4RikgY29udGludWU7IC8vIHNraXAgWUkKICAgICAgICAgICAgYWRkU3RyaW5nWChjLCBvcHRpb24pOwogICAgICAgIH0KICAgICAgICAKCiAgICAgICAgSGFzaHRhYmxlIG11bHRpVGFibGUgPSBjb2xsYXRvci5nZXRDb250cmFjdGluZygpOwogICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSBtdWx0aVRhYmxlLmtleXMoKTsKICAgICAgICB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewogICAgICAgICAgICBhZGRTdHJpbmdYKChTdHJpbmcpZW51bS5uZXh0RWxlbWVudCgpLCBvcHRpb24pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhcy5sZW5ndGg7ICsraSkgeyAvLyBwdXQgaW4gc2FtcGxlIG5vbi1jaGFyYWN0ZXJzCiAgICAgICAgICAgIGFkZFN0cmluZ1goZXh0cmFzW2ldLCBvcHRpb24pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhUmFuZ2VzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgIGNoYXIgc3RhcnQgPSBleHRyYVJhbmdlc1tpXVswXTsKICAgICAgICAgICAgY2hhciBlbmQgPSBleHRyYVJhbmdlc1tpXVsxXTsKICAgICAgICAgICAgaW50IGluY3JlbWVudCA9ICgoZW5kIC0gc3RhcnQgKyAxKSAvIDMwMykgKyAxOwogICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiUmFuZ2U6ICIgKyBzdGFydCArICIsICIgKyBlbmQgKyAiLCAiICsgaW5jcmVtZW50KTsKICAgICAgICAgICAgYWRkU3RyaW5nWChzdGFydCwgb3B0aW9uKTsKICAgICAgICAgICAgZm9yIChjaGFyIGogPSAoY2hhcikoc3RhcnQrMSk7IGogPCBlbmQtMTsgaiArPSBpbmNyZW1lbnQpIHsKICAgICAgICAgICAgICAgIGFkZFN0cmluZ1goaiwgb3B0aW9uKTsKICAgICAgICAgICAgICAgIGFkZFN0cmluZ1goaisxLCBvcHRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFkZFN0cmluZ1goZW5kLTEsIG9wdGlvbik7CiAgICAgICAgICAgIGFkZFN0cmluZ1goZW5kLCBvcHRpb24pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsOiAiICsgc29ydGVkRC5zaXplKCkpOwogICAgICAgIEl0ZXJhdG9yIGl0OwogICAgICAgIAogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JpdGluZyIpOwogICAgICAgIC8vU3RyaW5nIHZlcnNpb24gPSBjb2xsYXRvci5nZXRWZXJzaW9uKCk7CiAgICAgICAgCiAgICAgICAgaXQgPSBzb3J0ZWRELmtleVNldCgpLml0ZXJhdG9yKCk7CiAgICAgICAgCiAgICAgICAgU3RyaW5nIGxhc3RLZXkgPSAiIjsKICAgICAgICAKICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CiAgICAgICAgICAgIFN0cmluZyBzb3VyY2UgPSAoU3RyaW5nKSBzb3J0ZWRELmdldChrZXkpOwogICAgICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGtleS5sZW5ndGgoKS0yKTsKICAgICAgICAgICAgLy9TdHJpbmcgc3RhdHVzID0ga2V5LmVxdWFscyhsYXN0S2V5KSA/ICIqIiA6ICIiOwogICAgICAgICAgICAvL2xhc3RLZXkgPSBrZXk7CiAgICAgICAgICAgIC8vbG9nLnByaW50bG4oc291cmNlKTsKICAgICAgICAgICAgU3RyaW5nIGNsaXBwZWQgPSBzb3VyY2Uuc3Vic3RyaW5nKDAsIHNvdXJjZS5sZW5ndGgoKS0xKTsKICAgICAgICAgICAgU3RyaW5nIHN0cmVuID0gc291cmNlLnN1YnN0cmluZyhzb3VyY2UubGVuZ3RoKCktMSk7CiAgICAgICAgICAgIGxvZy5wcmludChzb3VyY2UgKyAiXHQiICsgVXRpbGl0eS5oZXgoY2xpcHBlZCkpOwogICAgICAgICAgICBpZiAoV1JJVEVfTkFNRV9JTl9DT05GT1JNQU5DRSkgewogICAgICAgICAgICAgICAgbG9nLnByaW50KAogICAgICAgICAgICAgICAgICAgICJcdCIgKyB1Y2QuZ2V0TmFtZShjbGlwcGVkKSsgIlx0IiArIFVDQS50b1N0cmluZyhrZXkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsb2cucHJpbnRsbigpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2cuY2xvc2UoKTsKICAgICAgICBzb3J0ZWRELmNsZWFyKCk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb25lIik7CiAgICB9CiAgICAKICAgIAogICAgc3RhdGljIHZvaWQgYWRkU3RyaW5nWChpbnQgeCwgYnl0ZSBvcHRpb24pIHsKICAgICAgICBhZGRTdHJpbmdYKFN0cmluZy52YWx1ZU9mKChjaGFyKXgpLCBvcHRpb24pOwogICAgfQogICAKICAgIHN0YXRpYyB2b2lkIGFkZFN0cmluZ1goU3RyaW5nIHMsIGJ5dGUgb3B0aW9uKSB7CiAgICAgICAgYWRkU3RyaW5nWShzICsgJ2EnLCBvcHRpb24pOwogICAgICAgIGFkZFN0cmluZ1kocyArICdBJywgb3B0aW9uKTsKICAgICAgICBhZGRTdHJpbmdZKHMgKyAn4ScsIG9wdGlvbik7CiAgICAgICAgYWRkU3RyaW5nWShzICsgJ2InLCBvcHRpb24pOwogICAgICAgIGFkZFN0cmluZ1kocyArICdcdTAzMjUnLCBvcHRpb24pOwogICAgICAgIGFkZFN0cmluZ1kocyArICdfJywgb3B0aW9uKTsKICAgIH0KICAgIAogICAgc3RhdGljIGNoYXIgY291bnRlcjsKICAgIAogICAgc3RhdGljIHZvaWQgYWRkU3RyaW5nWShTdHJpbmcgcywgYnl0ZSBvcHRpb24pIHsKICAgICAgICBTdHJpbmcgY29sRGJhc2UgPSBjb2xsYXRvci5nZXRTb3J0S2V5KHMsIG9wdGlvbiwgdHJ1ZSkgKyAiXHUwMDAwIiArIHMuY2hhckF0KDApOwogICAgICAgIHNvcnRlZEQucHV0KGNvbERiYXNlLCBzKTsKICAgIH0KICAgIAogICAgKi8vKiogCiAgICAgKiBDaGVjayB0aGF0IHRoZSBwcmltYXJpZXMgYXJlIHRoZSBzYW1lIGFzIHRoZSBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24uCiAgICAgKi8vKgogICAgc3RhdGljIHZvaWQgY2hlY2tCYWREZWNvbXBzKGludCBzdHJlbmd0aCwgYm9vbGVhbiBkZWNvbXBvc2l0aW9uKSB7CiAgICAgICAgaW50IG9sZFN0cmVuZ3RoID0gY29sbGF0b3IuZ2V0U3RyZW5ndGgoKTsKICAgICAgICBjb2xsYXRvci5zZXRTdHJlbmd0aChzdHJlbmd0aCk7CiAgICAgICAgLy9Ob3JtYWxpemVyIG5ma2QgPSBuZXcgTm9ybWFsaXplcihOb3JtYWxpemVyLk5GS0QpOwogICAgICAgIGlmIChzdHJlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgIGxvZy5wcmludGxuKCI8aDI+My4gUHJpbWFyaWVzIEluY29tcGF0aWJsZSB3aXRoIERlY29tcG9zaXRpb25zPC9oMj48dGFibGUgYm9yZGVyPScxJz4iKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb2cucHJpbnRsbigiPGgyPjQuIFNlY29uZGFyaWVzIEluY29tcGF0aWJsZSB3aXRoIERlY29tcG9zaXRpb25zPC9oMj48dGFibGUgYm9yZGVyPScxJz4iKTsKICAgICAgICB9CiAgICAgICAgbG9nLnByaW50bG4oIjx0cj48dGg+Q29kZTwvdGQ+PHRoPlNvcnQgS2V5PC90aD48dGg+RGVjb21wb3NlZCBTb3J0IEtleTwvdGg+PHRoPk5hbWU8L3RoPjwvdHI+Iik7CiAgICAgICAgZm9yIChjaGFyIGNoID0gMDsgY2ggPCAweEZGRkY7ICsrY2gpIHsKICAgICAgICAgICAgaWYgKG5ma2QuaXNOb3JtYWxpemVkKGNoKSkgY29udGludWU7CiAgICAgICAgICAgIGlmIChjaCA+IDB4QUMwMCAmJiBjaCA8IDB4RDdBMykgY29udGludWU7IC8vIHNraXAgbW9zdCBvZiBIYW5ndWwKICAgICAgICAgICAgU3RyaW5nIHNvcnRLZXkgPSBjb2xsYXRvci5nZXRTb3J0S2V5KFN0cmluZy52YWx1ZU9mKGNoKSwgVUNBLk5PTl9JR05PUkFCTEUsIGRlY29tcG9zaXRpb24pOwogICAgICAgICAgICBTdHJpbmcgZGVjb21wU29ydEtleSA9IGNvbGxhdG9yLmdldFNvcnRLZXkobmZrZC5ub3JtYWxpemUoY2gpLCBVQ0EuTk9OX0lHTk9SQUJMRSwgZGVjb21wb3NpdGlvbik7CiAgICAgICAgICAgIGlmIChmYWxzZSAmJiBzdHJlbmd0aCA9PSAyKSB7CiAgICAgICAgICAgICAgICBzb3J0S2V5ID0gcmVtb3ZlKHNvcnRLZXksICdcdTAwMjAnKTsKICAgICAgICAgICAgICAgIGRlY29tcFNvcnRLZXkgPSByZW1vdmUoZGVjb21wU29ydEtleSwgJ1x1MDAyMCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc29ydEtleS5lcXVhbHMoZGVjb21wU29ydEtleSkpIHsKICAgICAgICAgICAgICAgIGxvZy5wcmludGxuKCI8dHI+PHRkPiIgKyBVdGlsaXR5LmhleChjaCkKICAgICAgICAgICAgICAgICAgICArICI8L3RkPjx0ZD4iICsgVUNBLnRvU3RyaW5nKHNvcnRLZXkpCiAgICAgICAgICAgICAgICAgICAgKyAiPC90ZD48dGQ+IiArIFVDQS50b1N0cmluZyhkZWNvbXBTb3J0S2V5KQogICAgICAgICAgICAgICAgICAgICsgIjwvdGQ+PHRkPiIgKyB1Y2QuZ2V0TmFtZShjaCkKICAgICAgICAgICAgICAgICAgICArICI8L3RkPjwvdHI+IgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbG9nLnByaW50bG4oIjwvdGFibGU+Iik7CiAgICAgICAgY29sbGF0b3Iuc2V0U3RyZW5ndGgob2xkU3RyZW5ndGgpOwogICAgfQogICAgCiAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHJlbW92ZSAoU3RyaW5nIHMsIGNoYXIgY2gpIHsKICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgKytpKSB7CiAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOwogICAgICAgICAgICBpZiAoYyA9PSBjaCkgY29udGludWU7CiAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKICAgIH0KICAgIAogICAgICAgIAogICAgICAgIGxvZyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbSgiRnJlcXVlbmNpZXMuaHRtbCIpKTsKICAgICAgICBsb2cucHJpbnRsbigiPGh0bWw+PGJvZHk+Iik7CiAgICAgICAgTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KCI8dHI+PHRkPjx0dD57MH08L3R0PjwvdGQ+PHRkPjx0dD57MX08L3R0PjwvdGQ+PHRkIGFsaWduPSdyaWdodCc+PHR0PnsyfTwvdHQ+PC90ZD48dGQgYWxpZ249J3JpZ2h0Jz48dHQ+ezN9PC90dD48L3RkPjwvdHI+Iik7CiAgICAgICAgTWVzc2FnZUZvcm1hdCBtZjIgPSBuZXcgTWVzc2FnZUZvcm1hdCgiPHRyPjx0ZD48dHQ+ezB9PC90dD48L3RkPjx0ZCBhbGlnbj0ncmlnaHQnPjx0dD57MX08L3R0PjwvdGQ+PC90cj4iKTsKICAgICAgICBTdHJpbmcgaGVhZGVyID0gbWYuZm9ybWF0KG5ldyBTdHJpbmdbXSB7IlN0YXJ0IiwgIkVuZCIsICJDb3VudCIsICJTdWJ0b3RhbCJ9KTsKICAgICAgICBpbnQgY291bnQ7CiAgICAgICAgCiAgICAgICAgbG9nLnByaW50bG4oIjxoMj5Xcml0aW5nIFVzZWQgV2VpZ2h0czwvaDI+Iik7CiAgICAgICAgbG9nLnByaW50bG4oIjxwPlByaW1hcmllczwvcD48dGFibGUgYm9yZGVyPScxJz4iICsgbWYuZm9ybWF0KG5ldyBTdHJpbmdbXSB7IlN0YXJ0IiwgIkVuZCIsICJDb3VudCIsICJTdWJ0b3RhbCJ9KSk7CiAgICAgICAgY291bnQgPSBjb2xsYXRvci53cml0ZVVzZWRXZWlnaHRzKGxvZywgMSwgbWYpOwogICAgICAgIGxvZy5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCI8dHI+PHRkPkNvdW50OjwvdGQ+PHRkPnswfTwvdGQ+PC90cj4iLCBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGNvdW50KX0pKTsKICAgICAgICBsb2cucHJpbnRsbigiPC90YWJsZT4iKTsKICAgICAgICAKICAgICAgICBsb2cucHJpbnRsbigiPHA+U2Vjb25kYXJpZXM8L3A+PHRhYmxlIGJvcmRlcj0nMSc+IiArIG1mMi5mb3JtYXQobmV3IFN0cmluZ1tdIHsiQ29kZSIsICJGcmVxdWVuY3kifSkpOwogICAgICAgIGNvdW50ID0gY29sbGF0b3Iud3JpdGVVc2VkV2VpZ2h0cyhsb2csIDIsIG1mMik7CiAgICAgICAgbG9nLnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoIjx0cj48dGQ+Q291bnQ6PC90ZD48dGQ+ezB9PC90ZD48L3RyPiIsIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoY291bnQpfSkpOwogICAgICAgIGxvZy5wcmludGxuKCI8L3RhYmxlPiIpOwogICAgICAgIAogICAgICAgIGxvZy5wcmludGxuKCI8cD5UZXJ0aWFyaWVzPC9wPjx0YWJsZSBib3JkZXI9JzEnPiIgKyBtZjIuZm9ybWF0KG5ldyBTdHJpbmdbXSB7IkNvZGUiLCAiRnJlcXVlbmN5In0pKTsKICAgICAgICBjb3VudCA9IGNvbGxhdG9yLndyaXRlVXNlZFdlaWdodHMobG9nLCAzLCBtZjIpOwogICAgICAgIGxvZy5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCI8dHI+PHRkPkNvdW50OjwvdGQ+PHRkPnswfTwvdGQ+PC90cj4iLCBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGNvdW50KX0pKTsKICAgICAgICBsb2cucHJpbnRsbigiPC90YWJsZT4iKTsKICAgICAgICBsb2cucHJpbnRsbigiPC9ib2R5PjwvaHRtbD4iKTsKICAgICAgICBsb2cuY2xvc2UoKTsKICAgICAgICAKICAgICAgICAKICAgIHN0YXRpYyBpbnRbXSBjb21wYWN0U2Vjb25kYXJ5OwogICAgCiAgICBzdGF0aWMgdm9pZCBjaGVja0VxdWl2YWxlbnRzKCkgewogICAgICAgIE5vcm1hbGl6ZXIgbmZrZCA9IG5ldyBOb3JtYWxpemVyKE5vcm1hbGl6ZXIuTkZLQyk7CiAgICAgICAgTm9ybWFsaXplciBuZmQgPSBuZXcgTm9ybWFsaXplcihOb3JtYWxpemVyLk5GS0QpOwogICAgICAgIGZvciAoY2hhciBjID0gMDsgYyA8IDB4RkZGRjsgKytjKSB7CiAgICAgICAgICAgIAogICAgfQogICAgCiAgICBzdGF0aWMgdm9pZCB0ZXN0Q29tcGF0aWJpbGl0eUNoYXJhY3RlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIGxvZyA9IG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKEdFTl9ESVIgKyAiVUNBX0NvbXBhdENvbXBhcmlzb24udHh0IiksICJVVEY4IiksIDMyKjEwMjQpKTsKICAgICAgICAKICAgICAgICBpbnRbXSBrZW5DZXMgPSBuZXcgaW50WzUwXTsKICAgICAgICBpbnRbXSBtYXJrQ2VzID0gbmV3IGludFs1MF07CiAgICAgICAgaW50W10ga2VuQ29tcCA9IG5ldyBpbnRbNTBdOwogICAgICAgIE1hcCBmb3JMYXRlciA9IG5ldyBUcmVlTWFwKCk7CiAgICAgICAgaW50IGNvdW50ID0gMDsKICAgICAgICBpbnQgdHlwZUxpbWl0ID0gVUNEX1R5cGVzLkNBTk9OSUNBTDsKICAgICAgICBib29sZWFuIGRlY29tcFR5cGUgPSBmYWxzZTsKICAgICAgICBpZiAoZmFsc2UpIHsKICAgICAgICAgICAgdHlwZUxpbWl0ID0gVUNEX1R5cGVzLkNPTVBBVElCSUxJVFk7CiAgICAgICAgICAgIGRlY29tcFR5cGUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBmaXJzdCBmaW5kIGFsbCB0aGUgY2hhcmFjdGVycyB0aGF0IGNhbm5vdCBiZSBnZW5lcmF0ZWQgImNvcnJlY3RseSIKICAgICAgICAKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDB4RkZGRjsgKytpKSB7CiAgICAgICAgICAgIGludCB0eXBlID0gdWNkLmdldERlY29tcG9zaXRpb25UeXBlKGkpOwogICAgICAgICAgICBpZiAodHlwZSA8IHR5cGVMaW1pdCkgY29udGludWU7CiAgICAgICAgICAgIGludCBjZVR5cGUgPSBjb2xsYXRvci5nZXRDRVR5cGUoKGNoYXIpaSk7CiAgICAgICAgICAgIGlmIChjZVR5cGUgPj0gY29sbGF0b3IuRklYRURfQ0UpIGNvbnRpbnVlOwogICAgICAgICAgICAvLyBmaXggdHlwZQogICAgICAgICAgICB0eXBlID0gZ2V0RGVjb21wVHlwZShpKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIFN0cmluZyBzID0gU3RyaW5nLnZhbHVlT2YoKGNoYXIpaSk7CiAgICAgICAgICAgIGludCBrZW5MZW4gPSBjb2xsYXRvci5nZXRDRXMocywgZGVjb21wVHlwZSwga2VuQ2VzKTsgLy8gdHJ1ZQogICAgICAgICAgICBpbnQgbWFya0xlbiA9IGZpeENvbXBhdGliaWxpdHlDRShzLCB0cnVlLCBtYXJrQ2VzLCBmYWxzZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIWFycmF5c01hdGNoKGtlbkNlcywga2VuTGVuLCBtYXJrQ2VzLCBtYXJrTGVuKSkgewogICAgICAgICAgICAgICAgaW50IGtlbkNMZW4gPSBmaXhDb21wYXRpYmlsaXR5Q0UocywgdHJ1ZSwga2VuQ29tcCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBTdHJpbmcgY29tcCA9IENFTGlzdC50b1N0cmluZyhrZW5Db21wLCBrZW5DTGVuKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKGFycmF5c01hdGNoKGtlbkNlcywga2VuTGVuLCBrZW5Db21wLCBrZW5DTGVuKSkgewogICAgICAgICAgICAgICAgICAgIGZvckxhdGVyLnB1dCgoY2hhcikoQ09NUFJFU1NFRCB8IHR5cGUpICsgcywgY29tcCk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gdWNkLkNBTk9OSUNBTCAmJiBtdWx0aXBsZVplcm9QcmltYXJpZXMobWFya0NlcywgbWFya0xlbikpIHsKICAgICAgICAgICAgICAgICAgICBmb3JMYXRlci5wdXQoKGNoYXIpKE1VTFRJUExFUyB8IHR5cGUpICsgcywgY29tcCk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3JMYXRlci5wdXQoKGNoYXIpdHlwZSArIHMsIGNvbXApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIEl0ZXJhdG9yIGl0ID0gZm9yTGF0ZXIua2V5U2V0KCkuaXRlcmF0b3IoKTsKICAgICAgICBieXRlIG9sZFR5cGUgPSAoYnl0ZSkweEZGOyAvLyBhbnl0aGluZyB1bmlxdWUKICAgICAgICBpbnQgY2FzZUNvdW50ID0gMDsKICAgICAgICBsb2cucHJpbnRsbigiR2VuZXJhdGVkOiAiICsgbmV3IERhdGUoKSk7CiAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewogICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaXQubmV4dCgpOwogICAgICAgICAgICBieXRlIHR5cGUgPSAoYnl0ZSlrZXkuY2hhckF0KDApOwogICAgICAgICAgICBpZiAodHlwZSAhPSBvbGRUeXBlKSB7CiAgICAgICAgICAgICAgICBvbGRUeXBlID0gdHlwZTsKICAgICAgICAgICAgICAgIGxvZy5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKICAgICAgICAgICAgICAgIGxvZy5wcmludCgiQ0FTRSAiICsgKGNhc2VDb3VudCsrKSArICI6ICIpOwogICAgICAgICAgICAgICAgYnl0ZSByVHlwZSA9IChieXRlKSh0eXBlICYgT1RIRVJfTUFTSyk7CiAgICAgICAgICAgICAgICBsb2cucHJpbnRsbigiICAgIERlY29tcG9zaXRpb24gVHlwZSA9ICIgKyB1Y2QuZ2V0RGVjb21wb3NpdGlvblR5cGVJRF9mcm9tSW5kZXgoclR5cGUpKTsKICAgICAgICAgICAgICAgIGlmICgodHlwZSAmIENPTVBSRVNTRUQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBsb2cucHJpbnRsbigiICAgIFN1Y2Nlc3NmdWxseSBDb21wcmVzc2VkIGEgbGEgS2VuIik7CiAgICAgICAgICAgICAgICAgICAgbG9nLnByaW50bG4oIiAgICBbWFhYWC4wMDIwLllZWVldWzAwMDAuWlpaWi4wMDAyXSA9PiBbWFhYWC5aWlpaLllZWVldIik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0eXBlICYgTVVMVElQTEVTKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nLnByaW50bG4oIiAgICBNVUxUSVBMRSBBQ0NFTlRTIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsb2cucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CiAgICAgICAgICAgICAgICBsb2cucHJpbnRsbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFN0cmluZyBzID0ga2V5LnN1YnN0cmluZygxKTsKICAgICAgICAgICAgU3RyaW5nIGNvbXAgPSAoU3RyaW5nKWZvckxhdGVyLmdldChrZXkpOwogICAgICAgICAgICAKICAgICAgICAgICAgaW50IGtlbkxlbiA9IGNvbGxhdG9yLmdldENFcyhzLCBkZWNvbXBUeXBlLCBrZW5DZXMpOwogICAgICAgICAgICBTdHJpbmcga2VuU3RyID0gQ0VMaXN0LnRvU3RyaW5nKGtlbkNlcywga2VuTGVuKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGludCBtYXJrTGVuID0gZml4Q29tcGF0aWJpbGl0eUNFKHMsIHRydWUsIG1hcmtDZXMsIGZhbHNlKTsKICAgICAgICAgICAgU3RyaW5nIG1hcmtTdHIgPSBDRUxpc3QudG9TdHJpbmcobWFya0NlcywgbWFya0xlbik7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoKHR5cGUgJiBDT01QUkVTU0VEKSAhPSAwKSB7CiAgICAgICAgICAgICAgICBsb2cucHJpbnRsbigiQ09NUFJFU1NFRCAjIiArICgrK2NvdW50KSArICI6ICIgKyB1Y2QuZ2V0Q29kZUFuZE5hbWUocykpOwogICAgICAgICAgICAgICAgbG9nLnByaW50bG4oIiAgICAgICAgIDogIiArIGNvbXApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbG9nLnByaW50bG4oIkRJRkZFUkVOQ0UgIyIgKyAoKytjb3VudCkgKyAiOiAiICsgdWNkLmdldENvZGVBbmROYW1lKHMpKTsKICAgICAgICAgICAgICAgIGxvZy5wcmludGxuKCJnZW5lcmF0ZWQgOiAiICsgbWFya1N0cik7CiAgICAgICAgICAgICAgICBpZiAoIW1hcmtTdHIuZXF1YWxzKGNvbXApKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nLnByaW50bG4oImNvbXByZXNzZWQ6ICIgKyBjb21wKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxvZy5wcmludGxuKCJLZW4ncyAgICAgOiAiICsga2VuU3RyKTsKICAgICAgICAgICAgICAgIFN0cmluZyBuZmtkc3RyID0gbmZrZC5ub3JtYWxpemUocyk7CiAgICAgICAgICAgICAgICBsb2cucHJpbnRsbigiTkZLRCAgICAgIDogIiArIHVjZC5nZXRDb2RlQW5kTmFtZShuZmtkc3RyKSk7CiAgICAgICAgICAgICAgICBTdHJpbmcgbmZkc3RyID0gbmZkLm5vcm1hbGl6ZShzKTsKICAgICAgICAgICAgICAgIGlmICghbmZkc3RyLmVxdWFscyhuZmtkc3RyKSkgewogICAgICAgICAgICAgICAgICAgIGxvZy5wcmludGxuKCJORkQgICAgICAgOiAiICsgdWNkLmdldENvZGVBbmROYW1lKG5mZHN0cikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy9rZW5DTGVuID0gY29sbGF0b3IuZ2V0Q0VzKGRlY29tcCwgdHJ1ZSwga2VuQ29tcCk7CiAgICAgICAgICAgICAgICAvL2xvZy5wcmludGxuKCJkZWNvbXAgY2U6ICIgKyBDRUxpc3QudG9TdHJpbmcoa2VuQ29tcCwga2VuQ0xlbikpOyAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICBsb2cucHJpbnRsbigpOwogICAgICAgIH0KICAgICAgICBsb2cucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CiAgICAgICAgbG9nLnByaW50bG4oKTsKICAgICAgICBsb2cucHJpbnRsbigiQ29tcHJlc3NpYmxlIFNlY29uZGFyaWVzIik7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wcmVzc1NldC5zaXplKCk7ICsraSkgewogICAgICAgICAgICBpZiAoKGkgJiAweEYpID09IDApIGxvZy5wcmludGxuKCk7CiAgICAgICAgICAgIGlmICghY29tcHJlc3NTZXQuZ2V0KGkpKSBsb2cucHJpbnQoIi0gICIpOwogICAgICAgICAgICBlbHNlIGxvZy5wcmludChVdGlsaXR5LmhleChpLCAzKSArICIsICIpOwogICAgICAgIH0KICAgICAgICBsb2cuY2xvc2UoKTsKICAgIH0KICAgIAogICAgc3RhdGljIGZpbmFsIGJ5dGUgZ2V0RGVjb21wVHlwZShpbnQgY3ApIHsKICAgICAgICBieXRlIHJlc3VsdCA9IHVjZC5nZXREZWNvbXBvc2l0aW9uVHlwZShjcCk7CiAgICAgICAgaWYgKHJlc3VsdCA9PSB1Y2QuQ0FOT05JQ0FMKSB7CiAgICAgICAgICAgIFN0cmluZyBkID0gbmZkLm5vcm1hbGl6ZSgoY2hhciljcCk7IC8vIFRPRE8KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkLmxlbmd0aCgpOyArK2kpIHsKICAgICAgICAgICAgICAgIGJ5dGUgdCA9IHVjZC5nZXREZWNvbXBvc2l0aW9uVHlwZShkLmNoYXJBdChpKSk7CiAgICAgICAgICAgICAgICBpZiAodCA+IHVjZC5DQU5PTklDQUwpIHJldHVybiB0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAKICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIG11bHRpcGxlWmVyb1ByaW1hcmllcyhpbnRbXSBhLCBpbnQgYUxlbikgewogICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhTGVuOyArK2kpIHsKICAgICAgICAgICAgaWYgKFVDQS5nZXRQcmltYXJ5KGFbaV0pID09IDApIHsKICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAxKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb3VudCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgCiAgICBzdGF0aWMgZmluYWwgYnl0ZSBNVUxUSVBMRVMgPSAweDIwLCBDT01QUkVTU0VEID0gMHg0MCwgT1RIRVJfTUFTSyA9IDB4MUY7CiAgICBzdGF0aWMgZmluYWwgQml0U2V0IGNvbXByZXNzU2V0ID0gbmV3IEJpdFNldCgpOwogICAgICAgIAogICAgc3RhdGljIGludCBrZW5Db21wcmVzcyhpbnRbXSBtYXJrQ2VzLCBpbnQgbWFya0xlbikgewogICAgICAgIGlmIChtYXJrTGVuID09IDApIHJldHVybiAwOwogICAgICAgIGludCBvdXQgPSAxOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbWFya0xlbjsgKytpKSB7CiAgICAgICAgICAgIGludCBuZXh0ID0gbWFya0Nlc1tpXTsKICAgICAgICAgICAgaW50IHByZXYgPSBtYXJrQ2VzW291dC0xXTsKICAgICAgICAgICAgaWYgKFVDQS5nZXRQcmltYXJ5KG5leHQpID09IDAgCiAgICAgICAgICAgICAgJiYgVUNBLmdldFNlY29uZGFyeShwcmV2KSA9PSAweDIwCiAgICAgICAgICAgICAgJiYgVUNBLmdldFRlcnRpYXJ5KG5leHQpID09IDB4MikgewogICAgICAgICAgICAgICAgbWFya0Nlc1tvdXQtMV0gPSBVQ0EubWFrZUtleSgKICAgICAgICAgICAgICAgICAgVUNBLmdldFByaW1hcnkocHJldiksIAogICAgICAgICAgICAgICAgICBVQ0EuZ2V0U2Vjb25kYXJ5KG5leHQpLCAKICAgICAgICAgICAgICAgICAgVUNBLmdldFRlcnRpYXJ5KHByZXYpKTsKICAgICAgICAgICAgICAgIGNvbXByZXNzU2V0LnNldChVQ0EuZ2V0U2Vjb25kYXJ5KG5leHQpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG1hcmtDZXNbb3V0KytdID0gbmV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gb3V0OwogICAgfQogICAgCiAgICAKICAgIHN0YXRpYyBib29sZWFuIGFycmF5c01hdGNoKGludFtdIGEsIGludCBhTGVuLCBpbnRbXSBiLCBpbnQgYkxlbikgewogICAgICAgIGlmIChhTGVuICE9IGJMZW4pIHJldHVybiBmYWxzZTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFMZW47ICsraSkgewogICAgICAgICAgICBpZiAoYVtpXSAhPSBiW2ldKSByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgCiAgICBzdGF0aWMgaW50W10gbWFya0NlcyA9IG5ldyBpbnRbNTBdOwogICAgCiAgICBzdGF0aWMgaW50IGZpeENvbXBhdGliaWxpdHlDRShTdHJpbmcgcywgYm9vbGVhbiBkZWNvbXBvc2UsIGludFtdIG91dHB1dCwgYm9vbGVhbiBjb21wcmVzcykgewogICAgICAgIGludCB0eXBlID0gZ2V0RGVjb21wVHlwZShzLmNoYXJBdCgwKSk7CiAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KDApOwogICAgICAgIAogICAgICAgIFN0cmluZyBkZWNvbXAgPSBuZmtkLm5vcm1hbGl6ZShzKTsKICAgICAgICBpbnQgbGVuID0gMDsKICAgICAgICBpbnQgbWFya0xlbiA9IGNvbGxhdG9yLmdldENFcyhkZWNvbXAsIHRydWUsIG1hcmtDZXMpOwogICAgICAgIGlmIChjb21wcmVzcykgbWFya0xlbiA9IGtlbkNvbXByZXNzKG1hcmtDZXMsIG1hcmtMZW4pOwogICAgICAgIAogICAgICAgIC8vZm9yIChpbnQgaiA9IDA7IGogPCBkZWNvbXAubGVuZ3RoKCk7ICsraikgewogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IG1hcmtMZW47ICsraykgewogICAgICAgICAgICAgICAgaW50IHQgPSBVQ0EuZ2V0VGVydGlhcnkobWFya0Nlc1trXSk7CiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBDQU5PTklDQUwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoMHgzMDQxIDw9IGNoICYmIGNoIDw9IDB4MzA5NCkgdCA9IDB4RTsgLy8gaGlyYWdhbmEKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgweDMwQTEgPD0gY2ggJiYgY2ggPD0gMHgzMEZBKSB0ID0gMHgxMTsgLy8ga2F0YWthbmEKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgQ09NUEFUSUJJTElUWTogdCA9ICh0ID09IDgpID8gMHhBIDogNDsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBDT01QQVRfRk9OVDogIHQgPSAodCA9PSA4KSA/IDB4QiA6IDU7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgQ09NUEFUX05PQlJFQUs6IHQgPSAweDFCOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIENPTVBBVF9JTklUSUFMOiB0ID0gMHgxNzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBDT01QQVRfTUVESUFMOiB0ID0gMHgxODsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBDT01QQVRfRklOQUw6IHQgPSAweDE5OyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIENPTVBBVF9JU09MQVRFRDogdCA9IDB4MUE7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgQ09NUEFUX0NJUkNMRTogdCA9ICh0ID09IDB4MTEpID8gMHgxMyA6ICh0ID09IDgpID8gMHhDIDogNjsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBDT01QQVRfU1VQRVI6IHQgPSAweDE0OyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIENPTVBBVF9TVUI6IHQgPSAweDE1OyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIENPTVBBVF9WRVJUSUNBTDogdCA9IDB4MTY7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgQ09NUEFUX1dJREU6IHQ9ICh0ID09IDgpID8gOSA6IDM7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgQ09NUEFUX05BUlJPVzogdCA9ICgweEZGNjcgPD0gY2ggJiYgY2ggPD0gMHhGRjZGKSA/IDB4MTAgOiAweDEyOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIENPTVBBVF9TTUFMTDogdCA9ICh0ID09IDB4RSkgPyAweEUgOiAweEY7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgQ09NUEFUX1NRVUFSRTogdCA9ICh0ID09IDgpID8gMHgxRCA6IDB4MUM7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgQ09NUEFUX0ZSQUNUSU9OOiB0ID0gMHgxRTsgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvdXRwdXRbbGVuKytdID0gVUNBLm1ha2VLZXkoCiAgICAgICAgICAgICAgICAgICAgVUNBLmdldFByaW1hcnkobWFya0Nlc1trXSksCiAgICAgICAgICAgICAgICAgICAgVUNBLmdldFNlY29uZGFyeShtYXJrQ2VzW2tdKSwKICAgICAgICAgICAgICAgICAgICB0KTsKICAgICAgICAgICAgLy99CiAgICAgICAgfQogICAgICAgIHJldHVybiBsZW47CiAgICB9CiAgICAKICAgIHN0YXRpYyBmaW5hbCBieXRlIFdJVEhPVVRfTkFNRVMgPSAwLCBXSVRIX05BTUVTID0gMTsKICAgIAogICAgc3RhdGljIHZvaWQgd3JpdGVSdWxlcyAoYnl0ZSBvcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgaW50W10gY2VzID0gbmV3IGludFs1MF07CiAgICAgICAgCiAgICAgICAgewogICAgICAgIGludCBsZW4yID0gY29sbGF0b3IuZ2V0Q0VzKCJcdTI0NzQiLCB0cnVlLCBjZXMpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihDRUxpc3QudG9TdHJpbmcoY2VzLCBsZW4yKSk7CgogICAgICAgIFN0cmluZyBhID0gY29sbGF0b3IuZ2V0U29ydEtleSgiYSIpOwogICAgICAgIFN0cmluZyBiID0gY29sbGF0b3IuZ2V0U29ydEtleSgiQSIpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjb2xsYXRvci5zdHJlbmd0aERpZmZlcmVuY2UoYSwgYikpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNvcnRpbmciKTsKICAgICAgICBNYXAgYmFja01hcCA9IG5ldyBIYXNoTWFwKCk7CiAgICAgICAgTWFwIG9yZGVyZWQgPSBuZXcgVHJlZU1hcCgpOwogICAgICAgIAogICAgICAgIGZvciAoY2hhciBjaCA9IDA7IGNoIDwgMHhGRkZGOyArK2NoKSB7CiAgICAgICAgICAgIGJ5dGUgdHlwZSA9IGNvbGxhdG9yLmdldENFVHlwZShjaCk7CiAgICAgICAgICAgIGlmICh0eXBlID49IFVDQS5GSVhFRF9DRSkgY29udGludWU7CiAgICAgICAgICAgIFN0cmluZyBzID0gU3RyaW5nLnZhbHVlT2YoY2gpOwogICAgICAgICAgICBpbnQgbGVuID0gY29sbGF0b3IuZ2V0Q0VzKHMsIHRydWUsIGNlcyk7CiAgICAgICAgICAgIGlmIChsZW4gPT0gMSkgYmFja01hcC5wdXQobmV3IEludGVnZXIoY2VzWzBdKSwgcyk7CiAgICAgICAgICAgIG9yZGVyZWQucHV0KGNvbGxhdG9yLmdldFNvcnRLZXkocywgVUNBLk5PTl9JR05PUkFCTEUpICsgJ1x1MDAwMCcgKyBzLCBzKTsKICAgICAgICB9CiAgICAgICAgSGFzaHRhYmxlIG11bHRpVGFibGUgPSBjb2xsYXRvci5nZXRDb250cmFjdGluZygpOwogICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSBtdWx0aVRhYmxlLmtleXMoKTsKICAgICAgICB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewogICAgICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpZW51bS5uZXh0RWxlbWVudCgpOwogICAgICAgICAgICBvcmRlcmVkLnB1dChjb2xsYXRvci5nZXRTb3J0S2V5KHMsIFVDQS5OT05fSUdOT1JBQkxFKSArICdcdTAwMDAnICsgcywgcyk7CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JpdGluZyIpOwogICAgICAgIAogICAgICAgIFN0cmluZyBmaWxlbmFtZSA9ICJVQ0FfUnVsZXMudHh0IjsKICAgICAgICBpZiAob3B0aW9uID09IFdJVEhfTkFNRVMpIGZpbGVuYW1lID0gIlVDQV9SdWxlc19XaXRoX05hbWVzLnR4dCI7CiAgICAgICAgbG9nID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAogICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0oR0VOX0RJUiArIGZpbGVuYW1lKSwgIlVURjgiKSwgMzIqMTAyNCkpOwogICAgICAgIGxvZy53cml0ZSgnXHVGRUZGJyk7IC8vIEJPTQogICAgICAgIGxvZy5wcmludGxuKCImIFt0b3BdIik7IC8vIFJFU0VUCiAgICAgICAgCiAgICAgICAgSXRlcmF0b3IgaXQgPSBvcmRlcmVkLmtleVNldCgpLml0ZXJhdG9yKCk7CiAgICAgICAgaW50IG9sZEZpcnN0UHJpbWFyeSA9IFVDQS5nZXRQcmltYXJ5KFVDQS5URVJNSU5BVE9SKTsKICAgICAgICBib29sZWFuIHdhc1ZhcmlhYmxlID0gZmFsc2U7CiAgICAgICAgCiAgICAgICAgLy9TdHJpbmcgbGFzdFNvcnRLZXkgPSBjb2xsYXRvci5nZXRTb3J0S2V5KCJcdTAwMDAiKTs7CiAgICAgICAgLy8gMTIxNjEwMDQKICAgICAgICBpbnQgbGFzdENFID0gMDsKICAgICAgICAKICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgIFN0cmluZyBzb3J0S2V5ID0gKFN0cmluZykgaXQubmV4dCgpOwogICAgICAgICAgICBTdHJpbmcgY2hyID0gKFN0cmluZylvcmRlcmVkLmdldChzb3J0S2V5KTsKICAgICAgICAgICAgU3RyaW5nIHJlbGF0aW9uID0gIiI7CiAgICAgICAgICAgIGludCBsZW4gPSBjb2xsYXRvci5nZXRDRXMoY2hyLCB0cnVlLCBjZXMpOwogICAgICAgICAgICBpbnQgY2UgPSBjZXNbMF07CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHJlbGF0aW9ucyB0byBmaXhlZCBpdGVtcwogICAgICAgICAgICAKICAgICAgICAgICAgU3RyaW5nIHJlc2V0ID0gIiI7CiAgICAgICAgICAgIGNoYXIgcHJpbWFyeSA9IGNvbGxhdG9yLmdldFByaW1hcnkoY2UpOwogICAgICAgICAgICBpZiAocHJpbWFyeSA+PSAweDM0MDApIHsKICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5ID09IDB4OUZBNikgewogICAgICAgICAgICAgICAgICAgIHByaW1hcnkgPSAnXHU5RkE1JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5IDwgMHg5RkE2KSB7CiAgICAgICAgICAgICAgICAgICAgbGFzdENFID0gY29sbGF0b3IubWFrZUtleShwcmltYXJ5LCBjb2xsYXRvci5ORVVUUkFMX1NFQ09OREFSWSwgY29sbGF0b3IuTkVVVFJBTF9URVJUSUFSWSk7CiAgICAgICAgICAgICAgICAgICAgcmVzZXQgPSAiJiAiICsgcHJpbWFyeSArICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy8gZ2V0IHJlbGF0aW9uJwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGNlID09IGxhc3RDRSkgcmVsYXRpb24gPSAiICAgICAgICA9IjsKICAgICAgICAgICAgZWxzZSBpZiAoY29sbGF0b3IuZ2V0UHJpbWFyeShjZSkgIT0gY29sbGF0b3IuZ2V0UHJpbWFyeShsYXN0Q0UpKSByZWxhdGlvbiA9ICI8IjsKICAgICAgICAgICAgZWxzZSBpZiAoY29sbGF0b3IuZ2V0U2Vjb25kYXJ5KGNlKSAhPSBjb2xsYXRvci5nZXRTZWNvbmRhcnkobGFzdENFKSkgcmVsYXRpb24gPSAiICA8PCI7CiAgICAgICAgICAgIGVsc2UgaWYgKGNvbGxhdG9yLmdldFRlcnRpYXJ5KGNlKSAhPSBjb2xsYXRvci5nZXRUZXJ0aWFyeShsYXN0Q0UpKSByZWxhdGlvbiA9ICIgICAgPDw8IjsKICAgICAgICAgICAgbGFzdENFID0gY2U7CiAgICAgICAgICAgIGlmIChjaHIuZXF1YWxzKCJcdTI0NzQiKSkgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKENFTGlzdC50b1N0cmluZyhjZXMsIGxlbikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBjaGVjayBleHBhbnNpb25zCiAgICAgICAgICAgIAogICAgICAgICAgICBTdHJpbmcgZXhwYW5zaW9uID0gIiI7CiAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7CiAgICAgICAgICAgICAgICBpbnQgdGVydDAgPSBjZXNbMF0gJiAweEZGOwogICAgICAgICAgICAgICAgYm9vbGVhbiBpc0NvbXBhdCA9IHRlcnQwICE9IDIgJiYgdGVydDAgIT0gODsKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICBpbnQgcHJvYmUgPSBjZXNbaV07CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBnZXRGcm9tQmFja01hcChiYWNrTWFwLCBwcm9iZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGJhY2sgbWFwIGZvciAiICsgQ0VMaXN0LnRvU3RyaW5nKGNlc1tpXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIHVjZC5nZXRDb2RlQW5kTmFtZShjaHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5zaW9uICs9ICJbIiArIFV0aWxpdHkuaGV4KGNlc1tpXSkgKyAiXSI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5zaW9uICs9IHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBwcmludCByZXN1bHRzCiAgICAgICAgICAgIAogICAgICAgICAgICBsb2cucHJpbnQocmVzZXQgKyByZWxhdGlvbiArICIgIiArIHF1b3RlT3BlcmFuZChjaHIpKTsKICAgICAgICAgICAgaWYgKGxlbiA+IDEpIGxvZy5wcmludCgiIC8gIiArIGV4cGFuc2lvbik7CiAgICAgICAgICAgIGlmIChvcHRpb24gPT0gV0lUSF9OQU1FUykgewogICAgICAgICAgICAgICAgbG9nLnByaW50KCIgIyAiICsgdWNkLmdldENvZGVBbmROYW1lKGNocikpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIGxvZy5wcmludCgiIC8gIiArIFV0aWxpdHkuaGV4KGV4cGFuc2lvbikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvZy5wcmludGxuKCk7CiAgICAgICAgfQogICAgICAgIGxvZy5wcmludGxuKCImIFt0b3BdIik7IC8vIFJFU0VUCiAgICAgICAgbG9nLmNsb3NlKCk7CiAgICB9CiAgICAKICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0RnJvbUJhY2tNYXAoTWFwIGJhY2tNYXAsIGludCBwcm9iZSkgewogICAgICAgIFN0cmluZyBzID0gKFN0cmluZyliYWNrTWFwLmdldChuZXcgSW50ZWdlcihwcm9iZSkpOwogICAgICAgIGlmIChzICE9IG51bGwpIHJldHVybiBzOwogICAgICAgIAogICAgICAgIGNoYXIgcHJpbWFyeSA9IGNvbGxhdG9yLmdldFByaW1hcnkocHJvYmUpOwogICAgICAgIGNoYXIgc2Vjb25kYXJ5ID0gY29sbGF0b3IuZ2V0U2Vjb25kYXJ5KHByb2JlKTsKICAgICAgICBjaGFyIHRlcnRpYXJ5ID0gY29sbGF0b3IuZ2V0VGVydGlhcnkocHJvYmUpOwogICAgICAgIAogICAgICAgIGlmIChwcmltYXJ5ID4gMHgzNDAwKSB7CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihwcmltYXJ5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbnQgdGVydCA9IHRlcnRpYXJ5OwogICAgICAgICAgICBzd2l0Y2ggKHRlcnQpIHsKICAgICAgICAgICAgY2FzZSA4OiBjYXNlIDk6IGNhc2UgMHhBOiBjYXNlIDB4QjogY2FzZSAweEM6IGNhc2UgMHgxRDoKICAgICAgICAgICAgICAgIHRlcnQgPSA4OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHhEOiBjYXNlIDB4MTA6IGNhc2UgMHgxMTogY2FzZSAweDEyOiBjYXNlIDB4MTM6IGNhc2UgMHgxQzoKICAgICAgICAgICAgICAgIHRlcnQgPSAweEU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRlcnQgPSAyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvYmUgPSBjb2xsYXRvci5tYWtlS2V5KHByaW1hcnksIHNlY29uZGFyeSwgdGVydCk7CiAgICAgICAgICAgIHMgPSAoU3RyaW5nKWJhY2tNYXAuZ2V0KG5ldyBJbnRlZ2VyKHByb2JlKSk7CiAgICAgICAgICAgIGlmIChzICE9IG51bGwpIHJldHVybiBzOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHByb2JlID0gY29sbGF0b3IubWFrZUtleShwcmltYXJ5LCBzZWNvbmRhcnksIGNvbGxhdG9yLk5FVVRSQUxfVEVSVElBUlkpOwogICAgICAgICAgICBzID0gKFN0cmluZyliYWNrTWFwLmdldChuZXcgSW50ZWdlcihwcm9iZSkpOwogICAgICAgIH0KICAgICAgICBpZiAocyAhPSBudWxsKSByZXR1cm4gczsKICAgICAgICAKICAgICAgICBpZiAocHJpbWFyeSAhPSAwICYmIHNlY29uZGFyeSAhPSBjb2xsYXRvci5ORVVUUkFMX1NFQ09OREFSWSkgewogICAgICAgICAgICBTdHJpbmcgZmlyc3QgPSBnZXRGcm9tQmFja01hcChiYWNrTWFwLCAKICAgICAgICAgICAgICAgIGNvbGxhdG9yLm1ha2VLZXkocHJpbWFyeSwgY29sbGF0b3IuTkVVVFJBTF9TRUNPTkRBUlksIHRlcnRpYXJ5KSk7CiAgICAgICAgICAgIFN0cmluZyBzZWNvbmQgPSBnZXRGcm9tQmFja01hcChiYWNrTWFwLCAKICAgICAgICAgICAgICAgIGNvbGxhdG9yLm1ha2VLZXkoMCwgc2Vjb25kYXJ5LCBjb2xsYXRvci5ORVVUUkFMX1RFUlRJQVJZKSk7CiAgICAgICAgICAgIGlmIChmaXJzdCAhPSBudWxsICYmIHNlY29uZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBzID0gZmlyc3QgKyBzZWNvbmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHM7CiAgICB9CiAgICAKICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBSRUxBVElPTiA9IHsKICAgICAgICAiPCIsICIgPDwgIiwgIiAgPDw8ICAiLCAiICAgID0gICAgIiwgIiAgICA9ICAgICIsICIgICAgPSAgICAiLCAiICA+Pj4gICIsICIgPj4gIiwgIj4iCiAgICB9OwogICAgCiAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHF1b3RlT3BlcmFuZChTdHJpbmcgcykgewogICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyArK2kpIHsKICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CiAgICAgICAgICAgIHN3aXRjaCAoYykgewogICAgICAgICAgICAgIGNhc2UgJzwnOiAgY2FzZSAnPic6ICBjYXNlICcjJzogY2FzZSAnPSc6IGNhc2UgJyYnOiBjYXNlICcvJzoKICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJ1wnJykuYXBwZW5kKGMpLmFwcGVuZCgnXCcnKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgJ1wnJzoKICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIicnIik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgaWYgKDAgPD0gYyAmJiBjIDwgMHgyMCB8fCAweDdGIDw9IGMgJiYgYyA8IDB4QTApIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcXHUiKS5hcHBlbmQoVXRpbGl0eS5oZXgoYykpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICAgIH0KICAgIAogICAgLy9zdGF0aWMgTm9ybWFsaXplciBORktEID0gbmV3IE5vcm1hbGl6ZXIoTm9ybWFsaXplci5ORktEKTsKICAgIC8vc3RhdGljIE5vcm1hbGl6ZXIgTkZEID0gbmV3IE5vcm1hbGl6ZXIoTm9ybWFsaXplci5ORkQpOwogICAgCiAgICBzdGF0aWMgaW50IHZhcmlhYmxlSGlnaCA9IDA7CiAgICBzdGF0aWMgZmluYWwgaW50IENPTU1PTiA9IDU7CiAgICAKICAgIHN0YXRpYyBpbnQgZ2FwRm9yQSA9IDA7CgogICAgc3RhdGljIHZvaWQgd3JpdGVGcmFjdGlvbmFsVUNBKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAKICAgICAgICB2YXJpYWJsZUhpZ2ggPSBjb2xsYXRvci5nZXRWYXJpYWJsZUhpZ2goKSA+PiAxNjsKICAgICAgICBCaXRTZXQgc2Vjb25kYXJ5U2V0ID0gY29sbGF0b3IuZ2V0V2VpZ2h0VXNhZ2UoMik7CiAgICAgICAgCiAgICAgICAgLy8gSEFDSyBmb3IgQ0pLCiAgICAgICAgc2Vjb25kYXJ5U2V0LnNldCgweDAwNDApOwogICAgICAgIAogICAgICAgIGludCBzdWJ0b3RhbCA9IDA7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaXhpbmcgU2Vjb25kYXJpZXMiKTsKICAgICAgICBjb21wYWN0U2Vjb25kYXJ5ID0gbmV3IGludFtzZWNvbmRhcnlTZXQuc2l6ZSgpXTsKICAgICAgICBmb3IgKGludCBzZWNvbmRhcnkgPSAwOyBzZWNvbmRhcnkgPCBjb21wYWN0U2Vjb25kYXJ5Lmxlbmd0aDsgKytzZWNvbmRhcnkpIHsKICAgICAgICAgICAgaWYgKHNlY29uZGFyeVNldC5nZXQoc2Vjb25kYXJ5KSkgewogICAgICAgICAgICAgICAgY29tcGFjdFNlY29uZGFyeVtzZWNvbmRhcnldID0gc3VidG90YWwrKzsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY29tcGFjdFsiICsgVXRpbGl0eS5oZXgoc2Vjb25kYXJ5KQogICAgICAgICAgICAgICAgICAgICsgIl09IiArIFV0aWxpdHkuaGV4KGNvbXBhY3RTZWNvbmRhcnlbc2Vjb25kYXJ5XSkKICAgICAgICAgICAgICAgICAgICArICIsICIgKyBVdGlsaXR5LmhleChmaXhTZWNvbmRhcnkoc2Vjb25kYXJ5KSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwoKICAgICAgICAvL1RPIERPOiBmaW5kIHNlY29uZGFyaWVzIHRoYXQgZG9uJ3Qgb3ZlcmxhcCwgYW5kIHJlYXNzaWduCiAgICAgICAgCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaW5kaW5nIEJ1bXBzIik7ICAgICAgICAKICAgICAgICBjaGFyW10gcmVwcmVzZW50YXRpdmVzID0gbmV3IGNoYXJbNjU1MzZdOwogICAgICAgIGZpbmRCdW1wcyhyZXByZXNlbnRhdGl2ZXMpOwogICAgICAgIAogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRml4aW5nIFByaW1hcmllcyIpOwogICAgICAgIEJpdFNldCBwcmltYXJ5U2V0ID0gY29sbGF0b3IuZ2V0V2VpZ2h0VXNhZ2UoMSk7ICAgICAgICAKICAgICAgICBpbnRbXSBwcmltYXJ5RGVsdGEgPSBuZXcgaW50WzY1NTM2XTsKICAgICAgICAvLyBzdGFydCBhdCAxIHNvIHplcm8gc3RheXMgemVyby4KICAgICAgICBmb3IgKGludCBwcmltYXJ5ID0gMTsgcHJpbWFyeSA8IDB4RkZGRjsgKytwcmltYXJ5KSB7CiAgICAgICAgICAgIGlmIChwcmltYXJ5U2V0LmdldChwcmltYXJ5KSkgcHJpbWFyeURlbHRhW3ByaW1hcnldID0gMjsKICAgICAgICAgICAgZWxzZSBpZiAocHJpbWFyeSA9PSAweDEyOTkpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV0hPT1BTISBNaXNzaW5nIHdlaWdodCIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGludCBidW1wTmV4dFRvbyA9IDA7CiAgICAgICAgCiAgICAgICAgc3VidG90YWwgPSAoQ09NTU9OIDw8IDgpICsgQ09NTU9OOyAvLyBza2lwIGZvcmJpZGRlbiBieXRlcywgbGVhdmUgZ2FwCiAgICAgICAgCiAgICAgICAgLy8gc3RhcnQgYXQgMSBzbyB6ZXJvIHN0YXlzIHplcm8uCiAgICAgICAgZm9yIChpbnQgcHJpbWFyeSA9IDE7IHByaW1hcnkgPCAweEZGRkY7ICsrcHJpbWFyeSkgewogICAgICAgICAgICBpZiAocHJpbWFyeURlbHRhW3ByaW1hcnldICE9IDApIHsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3VidG90YWwgKz0gcHJpbWFyeURlbHRhW3ByaW1hcnldOyAgLy8gd2Ugd2lsbCBjb252ZXJ0IGZyb20gcmVsYXRpdmUgdG8gYWJzb2x1dGUKICAgICAgICAgICAgICAgIGlmIChzaW5nbGVzLmdldChwcmltYXJ5KSkgewogICAgICAgICAgICAgICAgICAgIHN1YnRvdGFsID0gKHN1YnRvdGFsICYgMHhGRjAwKSArIDB4MTAwOwogICAgICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5ID09IGdhcEZvckEpIHN1YnRvdGFsICs9IDB4MjAwOwogICAgICAgICAgICAgICAgICAgIGlmIChidW1wTmV4dFRvbyA9PSAweDQwKSBzdWJ0b3RhbCArPSAweDEwMDsgLy8gbWFrZSBzdXJlIG9mIGdhcCBiZXR3ZWVuIHNpbmdsZXMhISEKICAgICAgICAgICAgICAgICAgICBidW1wTmV4dFRvbyA9IDB4NDA7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByaW1hcnkgPiB2YXJpYWJsZUhpZ2gpIHsKICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUhpZ2ggPSAweEZGRkY7IC8vIG5ldmVyIGRvIGFnYWluIQogICAgICAgICAgICAgICAgICAgIHN1YnRvdGFsID0gKHN1YnRvdGFsICYgMHhGRjAwKSArIDB4MzIwICsgYnVtcE5leHRUb287CiAgICAgICAgICAgICAgICAgICAgYnVtcE5leHRUb28gPSAwOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChidW1wTmV4dFRvbyA+IDAgfHwgYnVtcHMuZ2V0KHByaW1hcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgc3VidG90YWwgPSAoKHN1YnRvdGFsICsgMHgyMCkgJiAweEZGMDApICsgMHgxMjAgKyBidW1wTmV4dFRvbzsKICAgICAgICAgICAgICAgICAgICBidW1wTmV4dFRvbyA9IDA7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGludCBsYXN0Qnl0ZSA9IHN1YnRvdGFsICYgMHhGRjsKICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGFsbCB2YWx1ZXMgb2YgRkYsIDAwLCAwMSwgMDIsCiAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gbGFzdEJ5dGUgJiYgbGFzdEJ5dGUgPCBDT01NT04gfHwgbGFzdEJ5dGUgPT0gMHhGRikgewogICAgICAgICAgICAgICAgICAgICAgICBzdWJ0b3RhbCA9ICgoc3VidG90YWwgKyAxKSAmIDB4RkZGRkZGMDApICsgQ09NTU9OOyAvLyBza2lwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHJpbWFyeURlbHRhW3ByaW1hcnldID0gc3VidG90YWw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZml4dXAgZm9yIEthbmppCiAgICAgICAgICAgIGlmIChwcmltYXJ5ID49IDB4MzQwMCkgewogICAgICAgICAgICAgICAgaW50IENFID0gZ2V0SW1wbGljaXRQcmltYXJ5KHByaW1hcnkpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwcmltYXJ5RGVsdGFbcHJpbWFyeV0gPSBDRSA+Pj4gODsgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChwcmltYXJ5ICYgMHhGRikgPT0gMCkgU3lzdGVtLm91dC5wcmludGxuKFV0aWxpdHkuaGV4KHByaW1hcnkpICsgIiA9PiAiICsgaGV4Qnl0ZXMocHJpbWFyeURlbHRhW3ByaW1hcnldKSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIC8vIG5vdyB0cmFuc2xhdGUhIQogICAgICAgIAogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU29ydGluZyIpOwogICAgICAgIE1hcCBvcmRlcmVkID0gbmV3IFRyZWVNYXAoKTsKICAgICAgICAKICAgICAgICBmb3IgKGNoYXIgY2ggPSAwOyBjaCA8IDB4RkZGRjsgKytjaCkgewogICAgICAgICAgICBieXRlIHR5cGUgPSBjb2xsYXRvci5nZXRDRVR5cGUoY2gpOwogICAgICAgICAgICBpZiAodHlwZSA+PSBVQ0EuRklYRURfQ0UpIGNvbnRpbnVlOwogICAgICAgICAgICBTdHJpbmcgcyA9IFN0cmluZy52YWx1ZU9mKGNoKTsKICAgICAgICAgICAgb3JkZXJlZC5wdXQoY29sbGF0b3IuZ2V0U29ydEtleShzLCBVQ0EuTk9OX0lHTk9SQUJMRSkgKyAnXHUwMDAwJyArIHMsIHMpOwogICAgICAgIH0KICAgICAgICBIYXNodGFibGUgbXVsdGlUYWJsZSA9IGNvbGxhdG9yLmdldENvbnRyYWN0aW5nKCk7CiAgICAgICAgRW51bWVyYXRpb24gZW51bSA9IG11bHRpVGFibGUua2V5cygpOwogICAgICAgIHdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7CiAgICAgICAgICAgIFN0cmluZyBzID0gKFN0cmluZyllbnVtLm5leHRFbGVtZW50KCk7CiAgICAgICAgICAgIG9yZGVyZWQucHV0KGNvbGxhdG9yLmdldFNvcnRLZXkocywgVUNBLk5PTl9JR05PUkFCTEUpICsgJ1x1MDAwMCcgKyBzLCBzKTsKICAgICAgICB9CiAgICAgICAgLy8gSlVTVCBGT1IgVEVTVElORwogICAgICAgIGlmIChmYWxzZSkgewogICAgICAgICAgICBTdHJpbmcgc2FtcGxlID0gIlx1MzQwMFx1MzQwMVx1NERCNFx1NERCNVx1NEUwMFx1NEUwMVx1OUZBNFx1OUZBNVx1QUMwMFx1QUMwMVx1RDdBMlx1RDdBMyI7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2FtcGxlLmxlbmd0aCgpOyArK2kpIHsKICAgICAgICAgICAgICAgIFN0cmluZyBzID0gc2FtcGxlLnN1YnN0cmluZyhpLCBpKzEpOwogICAgICAgICAgICAgICAgb3JkZXJlZC5wdXQoY29sbGF0b3IuZ2V0U29ydEtleShzLCBVQ0EuTk9OX0lHTk9SQUJMRSkgKyAnXHUwMDAwJyArIHMsIHMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JpdGluZyIpOwogICAgICAgIGxvZyA9IG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoR0VOX0RJUiArIGZpbGVuYW1lKSwgMzIqMTAyNCkpOwogICAgICAgIFByaW50V3JpdGVyIHN1bW1hcnkgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKEdFTl9ESVIgKyAibG9nLSIgKyBmaWxlbmFtZSksIDMyKjEwMjQpKTsKICAgICAgICAvL2xvZy5wcmludGxuKCJbVmFyaWFibGUgTG93ID0gIiArIFVDQS50b1N0cmluZyhjb2xsYXRvci5nZXRWYXJpYWJsZUxvdygpKSArICJdIik7CiAgICAgICAgLy9sb2cucHJpbnRsbigiW1ZhcmlhYmxlIEhpZ2ggPSAiICsgVUNBLnRvU3RyaW5nKGNvbGxhdG9yLmdldFZhcmlhYmxlSGlnaCgpKSArICJdIik7CiAgICAgICAgCiAgICAgICAgaW50W10gY2VzID0gbmV3IGludFsxMDBdOwogICAgICAgIAogICAgICAgIFN0cmluZ0J1ZmZlciBuZXdQcmltYXJ5ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgIFN0cmluZ0J1ZmZlciBuZXdTZWNvbmRhcnkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgU3RyaW5nQnVmZmVyIG5ld1RlcnRpYXJ5ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgIFN0cmluZ0J1ZmZlciBvbGRTdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgogICAgICAgIEVxdWl2YWxlbmNlQ2xhc3Mgc2VjRXEgPSBuZXcgRXF1aXZhbGVuY2VDbGFzcygiXHJcbiMiLCA0LCB0cnVlKTsKICAgICAgICBFcXVpdmFsZW5jZUNsYXNzIHRlckVxID0gbmV3IEVxdWl2YWxlbmNlQ2xhc3MoIlxyXG4jIiwgNCwgdHJ1ZSk7CiAgICAgICAgU3RyaW5nW10gc2FtcGxlRXEgPSBuZXcgU3RyaW5nWzUwMF07CiAgICAgICAgCiAgICAgICAgSXRlcmF0b3IgaXQgPSBvcmRlcmVkLmtleVNldCgpLml0ZXJhdG9yKCk7CiAgICAgICAgaW50IG9sZEZpcnN0UHJpbWFyeSA9IFVDQS5nZXRQcmltYXJ5KFVDQS5URVJNSU5BVE9SKTsKICAgICAgICBib29sZWFuIHdhc1ZhcmlhYmxlID0gZmFsc2U7CiAgICAgICAgCiAgICAgICAgbG9nLnByaW50bG4oIiMgRnJhY3Rpb25hbCBVQ0EgVGFibGUsIEdlbmVyYXRlZCBmcm9tIFVDQSIpOwogICAgICAgIGxvZy5wcmludGxuKCIjIE0uIERhdmlzLCAiICsgbmV3IERhdGUoKSk7CiAgICAgICAgbG9nLnByaW50bG4oIiMgR2VuZXJhdGVkIHByb2Nlc3NlZCB2ZXJzaW9uLCBhcyBkZXNjcmliZWQgaW4gZGVzaWduIGRvY3VtZW50LiIpOwogICAgICAgIGxvZy5wcmludGxuKCIjIE5vdGVzIik7CiAgICAgICAgbG9nLnByaW50bG4oIiMgIC0gQnVncyBpbiBVQ0EgZGF0YSBhcmUgTk9UIEZJWEVELCBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcgcHJvYmxlbXM6Iik7CiAgICAgICAgbG9nLnByaW50bG4oIiMgICAgLSBjYW5vbmljYWwgZXF1aXZhbGVudHMgYXJlIGRlY29tcG9zZWQgZGlyZWN0bHkgKHNvbWUgYmV0YSBVQ0EgYXJlIHdyb25nKS4iKTsKICAgICAgICBsb2cucHJpbnRsbigiIyAgICAtIG92ZXJsYXBwaW5nIHZhcmlhYmxlIHJhbmdlcyBhcmUgZml4ZWQuIik7CiAgICAgICAgbG9nLnByaW50bG4oIiMgIC0gRm9ybWF0IGlzIGFzIGZvbGxvd3M6Iik7CiAgICAgICAgbG9nLnByaW50bG4oIiMgICAgICA8Y29kZXBvaW50PiAoJyAnIDxjb2RlcG9pbnQ+KSogJzsnICgnTCcgfCAnUycpICc7JyA8ZnJhY3Rpb25hbENFPisgJyAjICcgPFVDQV9DRT4gJyMgJyA8bmFtZT4gIik7CiAgICAgICAgbG9nLnByaW50bG4oIiMgICAgLSB6ZXJvIHdlaWdodHMgYXJlIG5vdCBwcmludGVkIik7CiAgICAgICAgbG9nLnByaW50bG4oIiMgICAgLSBTOiBjb250YWlucyBhdCBsZWFzdCBvbmUgbG93ZXJjYXNlIG9yIFNNQUxMIGthbmEiKTsKICAgICAgICBsb2cucHJpbnRsbigiIyAgICAtIEw6IG90aGVyd2lzZSIpOwogICAgICAgIGxvZy5wcmludGxuKCIjICAgIC0gRGlmZmVyZW50IHByaW1hcmllcyBhcmUgc2VwYXJhdGVkIGJ5IGEgYmxhbmsgbGluZS4iKTsKICAgICAgICBsb2cucHJpbnRsbigpOwogICAgICAgIAogICAgICAgIFN0cmluZyBsYXN0Q2hyID0gIiI7CiAgICAgICAgaW50IGxhc3ROcCA9IDA7CiAgICAgICAgYm9vbGVhbiBkb1ZhcmlhYmxlID0gZmFsc2U7CiAgICAgICAgCiAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewogICAgICAgICAgICBPYmplY3Qgc29ydEtleSA9IGl0Lm5leHQoKTsKICAgICAgICAgICAgU3RyaW5nIGNociA9IChTdHJpbmcpb3JkZXJlZC5nZXQoc29ydEtleSk7CgogICAgICAgICAgICAvLyBnZXQgQ0VzIGFuZCBmaXgKICAgICAgICAgICAgaW50IGxlbiA9IGNvbGxhdG9yLmdldENFcyhjaHIsIHRydWUsIGNlcyk7CiAgICAgICAgICAgIGludCBmaXJzdFByaW1hcnkgPSBVQ0EuZ2V0UHJpbWFyeShjZXNbMF0pOwogICAgICAgICAgICBpZiAoZmlyc3RQcmltYXJ5ICE9IG9sZEZpcnN0UHJpbWFyeSkgewogICAgICAgICAgICAgICAgbG9nLnByaW50bG4oKTsKICAgICAgICAgICAgICAgIG9sZEZpcnN0UHJpbWFyeSA9IGZpcnN0UHJpbWFyeTsKICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNWYXJpYWJsZSA9IGNvbGxhdG9yLmlzVmFyaWFibGUoY2VzWzBdKTsKICAgICAgICAgICAgICAgIGlmIChpc1ZhcmlhYmxlICE9IHdhc1ZhcmlhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFyaWFibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnByaW50bG4oIiMgU1RBUlQgT0YgVkFSSUFCTEUgU0VDVElPTiEhISIpOwogICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5LnByaW50bG4oIiMgU1RBUlQgT0YgVkFSSUFCTEUgU0VDVElPTiEhISIpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5wcmludGxuKCJbdmFyaWFibGUgdG9wID0gIiArIFV0aWxpdHkuaGV4KHByaW1hcnlEZWx0YVtmaXJzdFByaW1hcnldKSArICJdICMgRU5EIE9GIFZBUklBQkxFIFNFQ1RJT04hISEiKTsKICAgICAgICAgICAgICAgICAgICAgICAgZG9WYXJpYWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxvZy5wcmludGxuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3YXNWYXJpYWJsZSA9IGlzVmFyaWFibGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2xkU3RyLnNldExlbmd0aCgwKTsKICAgICAgICAgICAgbG9nLnByaW50KFV0aWxpdHkuaGV4KGNociwgIiAiKSArICI7ICIgKyAobmVlZHNDYXNlQml0KGNocikgPyAnMScgOiAnMCcpICsgIjsgIik7CiAgICAgICAgICAgIGJvb2xlYW4gbm9uZVByaW50ZWQgPSB0cnVlOwogICAgICAgICAgICBmb3IgKGludCBxID0gMDsgcSA8IGxlbjsgKytxKSB7CiAgICAgICAgICAgICAgICBub25lUHJpbnRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgbmV3UHJpbWFyeS5zZXRMZW5ndGgoMCk7CiAgICAgICAgICAgICAgICBuZXdTZWNvbmRhcnkuc2V0TGVuZ3RoKDApOwogICAgICAgICAgICAgICAgbmV3VGVydGlhcnkuc2V0TGVuZ3RoKDApOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpbnQgcHJpID0gVUNBLmdldFByaW1hcnkoY2VzW3FdKTsKICAgICAgICAgICAgICAgIGludCBzZWMgPSBVQ0EuZ2V0U2Vjb25kYXJ5KGNlc1txXSk7IAogICAgICAgICAgICAgICAgaW50IHRlciA9IFVDQS5nZXRUZXJ0aWFyeShjZXNbcV0pOyAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHNlYyAhPSAweDIwKSB7CiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gc2VjRXEuYWRkKG5ldyBJbnRlZ2VyKHNlYyksIG5ldyBJbnRlZ2VyKHByaSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRlciAhPSAweDIpIHsKICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSB0ZXJFcS5hZGQobmV3IEludGVnZXIodGVyKSwgbmV3IEludGVnZXIoKHByaSA8PCAxNikgfCBzZWMpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzYW1wbGVFcVtzZWNdID09IG51bGwpIHNhbXBsZUVxW3NlY10gPSBjaHI7CiAgICAgICAgICAgICAgICBpZiAoc2FtcGxlRXFbdGVyXSA9PSBudWxsKSBzYW1wbGVFcVt0ZXJdID0gY2hyOwogICAgICAgICAgICAgICAgb2xkU3RyLmFwcGVuZChDRUxpc3QudG9TdHJpbmcoY2VzW3FdKSk7Ly8gKyAiLCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNlc1txXSwxNik7CiAgICAgICAgICAgICAgICBpbnQgbnAgPSBwcmltYXJ5RGVsdGFbVUNBLmdldFByaW1hcnkoY2VzW3FdKV07CiAgICAgICAgICAgICAgICBoZXhCeXRlcyhucCwgbmV3UHJpbWFyeSk7CiAgICAgICAgICAgICAgICBoZXhCeXRlcyhmaXhTZWNvbmRhcnkoVUNBLmdldFNlY29uZGFyeShjZXNbcV0pKSwgbmV3U2Vjb25kYXJ5KTsKICAgICAgICAgICAgICAgIGhleEJ5dGVzKGZpeFRlcnRpYXJ5KFVDQS5nZXRUZXJ0aWFyeShjZXNbcV0pKSwgbmV3VGVydGlhcnkpOwogICAgICAgICAgICAgICAgaWYgKHEgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGlmICghc2FtZVRvcEJ5dGUobnAsIGxhc3ROcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeS5wcmludGxuKCJMYXN0OiAgIiArIFV0aWxpdHkuaGV4KGxhc3ROcCkgKyAiICIgKyB1Y2QuZ2V0TmFtZShsYXN0Q2hyLmNoYXJBdCgwKSkpOwogICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5LnByaW50bG4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvVmFyaWFibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvVmFyaWFibGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkucHJpbnRsbigiW3ZhcmlhYmxlIHRvcCA9ICIgKyBVdGlsaXR5LmhleChwcmltYXJ5RGVsdGFbZmlyc3RQcmltYXJ5XSkgKyAiXSAjIEVORCBPRiBWQVJJQUJMRSBTRUNUSU9OISEhIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5LnByaW50bG4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5LnByaW50bG4oIkZpcnN0OiAiICsgVXRpbGl0eS5oZXgobnApICsgIiAiICsgdWNkLmdldE5hbWUoY2hyLmNoYXJBdCgwKSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsYXN0TnAgPSBucDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxvZy5wcmludCgiWyIgKyBuZXdQcmltYXJ5IAogICAgICAgICAgICAgICAgICAgICsgIiwgIiArIG5ld1NlY29uZGFyeSAKICAgICAgICAgICAgICAgICAgICArICIsICIgKyBuZXdUZXJ0aWFyeSAKICAgICAgICAgICAgICAgICAgICArICJdIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5vbmVQcmludGVkKSB7CiAgICAgICAgICAgICAgICBsb2cucHJpbnQoIlssLF0iKTsKICAgICAgICAgICAgICAgIG9sZFN0ci5hcHBlbmQoQ0VMaXN0LnRvU3RyaW5nKDApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsb2cucHJpbnRsbigiICAgICMgIiArIG9sZFN0ciArICIgIyAiICsgdWNkLmdldE5hbWUoY2hyLmNoYXJBdCgwKSkpOwogICAgICAgICAgICBsYXN0Q2hyID0gY2hyOwogICAgICAgIH0KICAgICAgICBzdW1tYXJ5LnByaW50bG4oIkxhc3Q6ICAiICsgVXRpbGl0eS5oZXgobGFzdE5wKSArICIgIiArIHVjZC5nZXROYW1lKGxhc3RDaHIuY2hhckF0KDApKSk7CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgU3RyaW5nIHNhbXBsZSA9ICJcdTM0MDBcdTM0MDFcdTREQjRcdTREQjVcdTRFMDBcdTRFMDFcdTlGQTRcdTlGQTVcdUFDMDBcdUFDMDFcdUQ3QTJcdUQ3QTMiOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2FtcGxlLmxlbmd0aCgpOyArK2kpIHsKICAgICAgICAgICAgY2hhciBjaCA9IHNhbXBsZS5jaGFyQXQoaSk7CiAgICAgICAgICAgIGxvZy5wcmludGxuKFV0aWxpdHkuaGV4KGNoKSArICIgPT4gIiArIFV0aWxpdHkuaGV4KGZpeEhhbihjaCkpCiAgICAgICAgICAgICAgICAgICAgKyAiICAgICAgICAgICIgKyB1Y2QuZ2V0TmFtZShjaCkpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBzdW1tYXJ5LnByaW50bG4oKTsKICAgICAgICBzdW1tYXJ5LnByaW50bG4oIiMgRmlyc3QgSW1wbGljaXQ6ICIgKyBVdGlsaXR5LmhleCgweEZGRkZGRkZGTCAmIGdldEltcGxpY2l0UHJpbWFyeSgwKSkpOwogICAgICAgIHN1bW1hcnkucHJpbnRsbigiIyBMYXN0IEltcGxpY2l0OiAiICsgVXRpbGl0eS5oZXgoMHhGRkZGRkZGRkwgJiBnZXRJbXBsaWNpdFByaW1hcnkoMHgxMEZGRkYpKSk7CiAgICAgICAgc3VtbWFyeS5wcmludGxuKCJDb21wYWN0IFNlY29uZGFyeSAxNTM6ICIgKyBjb21wYWN0U2Vjb25kYXJ5WzB4MTUzXSk7CiAgICAgICAgc3VtbWFyeS5wcmludGxuKCJDb21wYWN0IFNlY29uZGFyeSAxNTc6ICIgKyBjb21wYWN0U2Vjb25kYXJ5WzB4MTU3XSk7CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgc3VtbWFyeS5wcmludGxuKCk7CiAgICAgICAgc3VtbWFyeS5wcmludGxuKCIjIERpc2pvaW50IGNsYXNzZXMgZm9yIFNlY29uZGFyaWVzIik7CiAgICAgICAgc3VtbWFyeS5wcmludGxuKCIjIiArIHNlY0VxLnRvU3RyaW5nKCkpOwogICAgICAgIAogICAgICAgIHN1bW1hcnkucHJpbnRsbigpOwogICAgICAgIHN1bW1hcnkucHJpbnRsbigiIyBEaXNqb2ludCBjbGFzc2VzIGZvciBUZXJ0aWFyaWVzIik7CiAgICAgICAgc3VtbWFyeS5wcmludGxuKCIjIiArIHRlckVxLnRvU3RyaW5nKCkpOwogICAgICAgIAogICAgICAgIHN1bW1hcnkucHJpbnRsbigpOwogICAgICAgIHN1bW1hcnkucHJpbnRsbigiIyBFeGFtcGxlIGNoYXJhY3RlcnMgZm9yIGVhY2ggVEVSVElBUlkgdmFsdWUiKTsKICAgICAgICBzdW1tYXJ5LnByaW50bG4oKTsKICAgICAgICBzdW1tYXJ5LnByaW50bG4oIiMgVUNBIDogKEZSQUMpIENPREUgWyAgICBVQ0EgQ0UgICAgXSBOYW1lIik7CiAgICAgICAgc3VtbWFyeS5wcmludGxuKCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzYW1wbGVFcS5sZW5ndGg7ICsraSkgewogICAgICAgICAgICBpZiAoc2FtcGxlRXFbaV0gPT0gbnVsbCkgY29udGludWU7CiAgICAgICAgICAgIGlmIChpID09IDB4MjApIHsKICAgICAgICAgICAgICAgIHN1bW1hcnkucHJpbnRsbigpOwogICAgICAgICAgICAgICAgc3VtbWFyeS5wcmludGxuKCIjIEV4YW1wbGUgY2hhcmFjdGVycyBmb3IgZWFjaCBTRUNPTkRBUlkgdmFsdWUiKTsKICAgICAgICAgICAgICAgIHN1bW1hcnkucHJpbnRsbigpOwogICAgICAgICAgICAgICAgc3VtbWFyeS5wcmludGxuKCIjIFVDQSA6IChGUkFDKSBDT0RFIFsgICAgVUNBIENFICAgIF0gTmFtZSIpOwogICAgICAgICAgICAgICAgc3VtbWFyeS5wcmludGxuKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IGxlbiA9IGNvbGxhdG9yLmdldENFcyhzYW1wbGVFcVtpXSwgdHJ1ZSwgY2VzKTsKICAgICAgICAgICAgaW50IG5ld3ZhbCA9IGkgPCAweDIwID8gZml4VGVydGlhcnkoaSkgOiBmaXhTZWNvbmRhcnkoaSk7CiAgICAgICAgICAgIHN1bW1hcnkucHJpbnQoIiMgIiArIFV0aWxpdHkuaGV4KGkpICsgIjogKCIgKyBVdGlsaXR5LmhleChuZXd2YWwpICsgIikgIgogICAgICAgICAgICAgICAgKyBVdGlsaXR5LmhleChzYW1wbGVFcVtpXSkgKyAiICIpOwogICAgICAgICAgICBmb3IgKGludCBxID0gMDsgcSA8IGxlbjsgKytxKSB7CiAgICAgICAgICAgICAgICBzdW1tYXJ5LnByaW50KENFTGlzdC50b1N0cmluZyhjZXNbcV0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdW1tYXJ5LnByaW50bG4oIiAiICsgdWNkLmdldE5hbWUoc2FtcGxlRXFbaV0pKTsKICAgICAgICB9CiAgICAgICAgbG9nLmNsb3NlKCk7CiAgICAgICAgc3VtbWFyeS5jbG9zZSgpOwogICAgfQogICAgCiAgICAvLyBDT05TVEFOVFMKICAgIAogICAgc3RhdGljIGZpbmFsIGludCAKICAgICAgICBIQU5fU1RBUlQgPSAweDM0MDAsCiAgICAgICAgSEFOX0xJTUlUID0gMHhBMDAwLAogICAgICAgIFNVUFBMRU1FTlRBUllfQ09VTlQgPSAweDEwMDAwMCwKICAgICAgICBCWVRFU19UT19BVk9JRCA9IDMsCiAgICAgICAgT1RIRVJfQ09VTlQgPSAyNTYgLSBCWVRFU19UT19BVk9JRCwKICAgICAgICBMQVNUX0NPVU5UID0gT1RIRVJfQ09VTlQgLyAyLAogICAgICAgIExBU1RfQ09VTlQyID0gKFNVUFBMRU1FTlRBUllfQ09VTlQgLSAxKSAvIChPVEhFUl9DT1VOVCAqIE9USEVSX0NPVU5UKSArIDEsIC8vIGxhc3QgYnl0ZQogICAgICAgIEhBTl9TSElGVCA9IExBU1RfQ09VTlQgKiBPVEhFUl9DT1VOVCAtIEhBTl9TVEFSVCwKICAgICAgICBCT1VOREFSWSA9IDIgKiBPVEhFUl9DT1VOVCAqIExBU1RfQ09VTlQgKyBIQU5fU1RBUlQsCiAgICAgICAgTEFTVDJfTVVMVElQTElFUiA9IE9USEVSX0NPVU5UIC8gTEFTVF9DT1VOVDI7CiAgICAKICAgIC8vIEdFVCBJTVBMSUNJVCBQUklNQVJZIFdFSUdIVFMKICAgIC8vIFJldHVybiB2YWx1ZSBpcyBsZWZ0IGp1c3RpZmllZCBwcmltYXJ5IGtleQogICAgCiAgICBzdGF0aWMgaW50IGdldEltcGxpY2l0UHJpbWFyeShpbnQgY3ApIHsKICAgICAgICAvLyB3ZSBtdXN0IHNraXAgYWxsIDAwLCAwMSwgMDIgYnl0ZXMsIHNvIG1vc3QgYnl0ZXMgaGF2ZSAyNTMgdmFsdWVzCiAgICAgICAgLy8gd2UgbXVzdCBsZWF2ZSBhIGdhcCBvZiAwMSBiZXR3ZWVuIGFsbCB2YWx1ZXMgb2YgdGhlIGxhc3QgYnl0ZSwgc28gdGhlIGxhc3QgYnl0ZSBoYXMgMTI2IHZhbHVlcyAoMyBieXRlIGNhc2UpCiAgICAgICAgLy8gd2Ugc2hpZnQgc28gdGhhdCBIQU4gYWxsIGhhcyB0aGUgc2FtZSBmaXJzdCBwcmltYXJ5LCBmb3IgY29tcHJlc3Npb24uCiAgICAgICAgLy8gZm9yIHRoZSA0IGJ5dGUgY2FzZSwgd2UgbWFrZSB0aGUgZ2FwIGFzIGxhcmdlIGFzIHdlIGNhbiBmaXQuCiAgICAgICAgLy8gVGhyZWUgYnl0ZSBmb3JtcyBhcmUgRUMgeHggeHgsIEVEIHh4IHh4LCBFRSB4eCB4eCAod2l0aCBhIGdhcCBvZiAxKQogICAgICAgIC8vIEZvdXIgYnl0ZSBmb3JtcyAobW9zdCBzdXBwbGVtZW50YXJpZXMpIGFyZSBFRiB4eCB4eCB4eCAod2l0aCBhIGdhcCBvZiBMQVNUMl9NVUxUSVBMSUVSID09IDE0KQogICAgICAgIAogICAgICAgIGludCBsYXN0MCA9IGNwIC0gQk9VTkRBUlk7CiAgICAgICAgaWYgKGxhc3QwIDwgMCkgewogICAgICAgICAgICBjcCArPSBIQU5fU0hJRlQ7IC8vIHNoaWZ0IHNvIEhBTiBzaGFyZXMgc2luZ2xlIGJsb2NrCiAgICAgICAgICAgIGludCBsYXN0MSA9IGNwIC8gTEFTVF9DT1VOVDsKICAgICAgICAgICAgbGFzdDAgPSBjcCAlIExBU1RfQ09VTlQ7CiAgICAgICAgICAgIGludCBsYXN0MiA9IGxhc3QxIC8gT1RIRVJfQ09VTlQ7CiAgICAgICAgICAgIGxhc3QxICU9IE9USEVSX0NPVU5UOwogICAgICAgICAgICByZXR1cm4gMHhFQzAzMDMwMCArIChsYXN0MiA8PCAyNCkgKyAobGFzdDEgPDwgMTYpICsgKGxhc3QwIDw8IDkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGludCBsYXN0MSA9IGxhc3QwIC8gTEFTVF9DT1VOVDI7CiAgICAgICAgICAgIGxhc3QwICU9IExBU1RfQ09VTlQyOwogICAgICAgICAgICBpbnQgbGFzdDIgPSBsYXN0MSAvIE9USEVSX0NPVU5UOwogICAgICAgICAgICBsYXN0MSAlPSBPVEhFUl9DT1VOVDsKICAgICAgICAgICAgcmV0dXJuIDB4RUYwMzAzMDMgKyAobGFzdDIgPDwgMTYpICsgKGxhc3QxIDw8IDgpICsgKGxhc3QwICogTEFTVDJfTVVMVElQTElFUik7CiAgICAgICAgfQogICAgfQogICAgCiAgICAvLyBURVNUIFBST0dSQU0KICAgIAogICAgc3RhdGljIHZvaWQgY2hlY2tJbXBsaWNpdCgpIHsKICAgICAgICBsb25nIG9sZFByaW1hcnkgPSAwOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgSW1wbGljaXQgQ2hlY2siKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSAweDEwRkZGRjsgKytpKSB7CiAgICAgICAgICAgIGxvbmcgbmV3UHJpbWFyeSA9IDB4RkZGRkZGRkZMICYgZ2V0SW1wbGljaXRQcmltYXJ5KGkpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gdGVzdCBjb3JyZWN0IHZhbHVlcwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKG5ld1ByaW1hcnkgPCBvbGRQcmltYXJ5KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWxpdHkuaGV4KGkpICsgIjogb3ZlcmxhcDogIiArIFV0aWxpdHkuaGV4KG9sZFByaW1hcnkpICsgIiA+ICIgKyBVdGlsaXR5LmhleChuZXdQcmltYXJ5KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGxvbmcgYjAgPSAobmV3UHJpbWFyeSA+PiAyNCkgJiAweEZGOwogICAgICAgICAgICBsb25nIGIxID0gKG5ld1ByaW1hcnkgPj4gMTYpICYgMHhGRjsKICAgICAgICAgICAgbG9uZyBiMiA9IChuZXdQcmltYXJ5ID4+IDgpICYgMHhGRjsKICAgICAgICAgICAgbG9uZyBiMyA9IG5ld1ByaW1hcnkgJiAweEZGOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGIwIDwgMHhFQyB8fCBiMCA+IDB4RUYgfHwgYjEgPCAzIHx8IGIyIDwgMyB8fCBiMyA9PSAxIHx8IGIzID09IDIpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbGl0eS5oZXgoaSkgKyAiOiBpbGxlZ2FsIGJ5dGUgdmFsdWU6ICIgKyBVdGlsaXR5LmhleChuZXdQcmltYXJ5KQogICAgICAgICAgICAgICAgICAgICsgIiwgIiArIFV0aWxpdHkuaGV4KGIxKSArICIsICIgKyBVdGlsaXR5LmhleChiMikgKyAiLCAiICsgVXRpbGl0eS5oZXgoYjMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy8gcHJpbnQgcmFuZ2UgdG8gbG9vayBhdAogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGZhbHNlKSB7CiAgICAgICAgICAgICAgICBpbnQgYiA9IGkgJiAweEZGOwogICAgICAgICAgICAgICAgaWYgKGIgPT0gMjU1IHx8IGIgPT0gMCB8fCBiID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oVXRpbGl0eS5oZXgoaSkgKyAiID0+ICIgKyBVdGlsaXR5LmhleChuZXdQcmltYXJ5KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2xkUHJpbWFyeSA9IG5ld1ByaW1hcnk7CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3VjY2Vzc2Z1bCBJbXBsaWNpdCBDaGVjayEhIik7CiAgICB9CiAgICAKICAgIHN0YXRpYyBib29sZWFuIHNhbWVUb3BCeXRlKGludCB4LCBpbnQgeSkgewogICAgICAgIGludCB4MSA9IHggJiAweEZGMDAwMDsKICAgICAgICBpbnQgeTEgPSB5ICYgMHhGRjAwMDA7CiAgICAgICAgaWYgKHgxICE9IDAgfHwgeTEgIT0gMCkgcmV0dXJuIHgxID09IHkxOwogICAgICAgIHgxID0geCAmIDB4RkYwMDsKICAgICAgICB5MSA9IHkgJiAweEZGMDA7CiAgICAgICAgcmV0dXJuIHgxID09IHkxOwogICAgfQogICAgCiAgICAgICAgLy8gcmV0dXJuIHRydWUgaWYgZWl0aGVyOgogICAgICAgIC8vIGEuIHRvTG93ZXIoTkZLRCh4KSkgIT0geCAodXNpbmcgRlVMTCBjYXNlIG1hcHBpbmdzKSwgT1IKICAgICAgICAvLyBiLiB0b1NtYWxsS2FuYShORktEKHgpKSAhPSB4LgoKICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIG5lZWRzQ2FzZUJpdChTdHJpbmcgeCkgewogICAgICAgIFN0cmluZyBzID0gbmZrZC5ub3JtYWxpemUoeCk7CiAgICAgICAgaWYgKCF1Y2QuZ2V0Q2FzZShzLCBGVUxMLCBMT1dFUikuZXF1YWxzKHMpKSByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAoIXRvU21hbGxLYW5hKHMpLmVxdWFscyhzKSkgcmV0dXJuIHRydWU7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgCiAgICBzdGF0aWMgZmluYWwgU3RyaW5nQnVmZmVyIHRvU21hbGxLYW5hQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgCiAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU21hbGxLYW5hKFN0cmluZyBzKSB7CiAgICAgICAgLy8gbm90ZTogZG9uJ3QgbmVlZCB0byBkbyBzdXJyb2dhdGVzOyBub25lIGV4aXN0CiAgICAgICAgYm9vbGVhbiBnb3RPbmUgPSBmYWxzZTsKICAgICAgICB0b1NtYWxsS2FuYUJ1ZmZlci5zZXRMZW5ndGgoMCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyArK2kpIHsKICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CiAgICAgICAgICAgIGlmICgnXHUzMDQyJyA8PSBjICYmIGMgPD0gJ1x1MzBFRicpIHsKICAgICAgICAgICAgICAgIHN3aXRjaChjIC0gMHgzMDAwKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgMHg0MjogY2FzZSAweDQ0OiBjYXNlIDB4NDY6IGNhc2UgMHg0ODogY2FzZSAweDRBOiBjYXNlIDB4NjQ6IGNhc2UgMHg4NDogY2FzZSAweDg2OiBjYXNlIDB4OEY6CiAgICAgICAgICAgICAgICAgIGNhc2UgMHhBMjogY2FzZSAweEE0OiBjYXNlIDB4QTY6IGNhc2UgMHhBODogY2FzZSAweEFBOiBjYXNlIDB4QzQ6IGNhc2UgMHhFNDogY2FzZSAweEU2OiBjYXNlIDB4RUY6CiAgICAgICAgICAgICAgICAgICAgLS1jOyAvLyBtYXBzIHRvIHByZXZpb3VzIGNoYXIKICAgICAgICAgICAgICAgICAgICBnb3RPbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIDB4QUI6CiAgICAgICAgICAgICAgICAgICAgYyA9ICdcdTMwRjUnOyAKICAgICAgICAgICAgICAgICAgICBnb3RPbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIDB4QjE6CiAgICAgICAgICAgICAgICAgICAgYyA9ICdcdTMwRjYnOyAKICAgICAgICAgICAgICAgICAgICBnb3RPbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRvU21hbGxLYW5hQnVmZmVyLmFwcGVuZChjKTsKICAgICAgICB9CiAgICAgICAgaWYgKGdvdE9uZSkgcmV0dXJuIHRvU21hbGxLYW5hQnVmZmVyLnRvU3RyaW5nKCk7CiAgICAgICAgcmV0dXJuIHM7CiAgICB9CiAgICAgICAgCiAgICAKMzBGNTtLQVRBS0FOQSBMRVRURVIgU01BTEwgS0E7TG87MDtMOzs7OztOOzs7OzsKMzBBQjtLQVRBS0FOQSBMRVRURVIgS0E7TG87MDtMOzs7OztOOzs7OzsKMzBGNjtLQVRBS0FOQSBMRVRURVIgU01BTEwgS0U7TG87MDtMOzs7OztOOzs7OzsKMzBCMTtLQVRBS0FOQSBMRVRURVIgS0U7TG87MDtMOzs7OztOOzs7OzsKCjMwQTE7S0FUQUtBTkEgTEVUVEVSIFNNQUxMIEE7TG87MDtMOzs7OztOOzs7OzsKMzBBMjtLQVRBS0FOQSBMRVRURVIgQTtMbzswO0w7Ozs7O047Ozs7OwozMEEzO0tBVEFLQU5BIExFVFRFUiBTTUFMTCBJO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwQTQ7S0FUQUtBTkEgTEVUVEVSIEk7TG87MDtMOzs7OztOOzs7OzsKMzBBNTtLQVRBS0FOQSBMRVRURVIgU01BTEwgVTtMbzswO0w7Ozs7O047Ozs7OwozMEE2O0tBVEFLQU5BIExFVFRFUiBVO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwQTc7S0FUQUtBTkEgTEVUVEVSIFNNQUxMIEU7TG87MDtMOzs7OztOOzs7OzsKMzBBODtLQVRBS0FOQSBMRVRURVIgRTtMbzswO0w7Ozs7O047Ozs7OwozMEE5O0tBVEFLQU5BIExFVFRFUiBTTUFMTCBPO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwQUE7S0FUQUtBTkEgTEVUVEVSIE87TG87MDtMOzs7OztOOzs7OzsKMzBDMztLQVRBS0FOQSBMRVRURVIgU01BTEwgVFU7TG87MDtMOzs7OztOOzs7OzsKMzBDNDtLQVRBS0FOQSBMRVRURVIgVFU7TG87MDtMOzs7OztOOzs7OzsKMzBFMztLQVRBS0FOQSBMRVRURVIgU01BTEwgWUE7TG87MDtMOzs7OztOOzs7OzsKMzBFNDtLQVRBS0FOQSBMRVRURVIgWUE7TG87MDtMOzs7OztOOzs7OzsKMzBFNTtLQVRBS0FOQSBMRVRURVIgU01BTEwgWVU7TG87MDtMOzs7OztOOzs7OzsKMzBFNjtLQVRBS0FOQSBMRVRURVIgWVU7TG87MDtMOzs7OztOOzs7OzsKMzBFNztLQVRBS0FOQSBMRVRURVIgU01BTEwgWU87TG87MDtMOzs7OztOOzs7OzsKMzBFODtLQVRBS0FOQSBMRVRURVIgWU87TG87MDtMOzs7OztOOzs7OzsKMzBFRTtLQVRBS0FOQSBMRVRURVIgU01BTEwgV0E7TG87MDtMOzs7OztOOzs7OzsKMzBFRjtLQVRBS0FOQSBMRVRURVIgV0E7TG87MDtMOzs7OztOOzs7OzsKCjMwNDE7SElSQUdBTkEgTEVUVEVSIFNNQUxMIEE7TG87MDtMOzs7OztOOzs7OzsKMzA0MjtISVJBR0FOQSBMRVRURVIgQTtMbzswO0w7Ozs7O047Ozs7OwozMDQzO0hJUkFHQU5BIExFVFRFUiBTTUFMTCBJO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwNDQ7SElSQUdBTkEgTEVUVEVSIEk7TG87MDtMOzs7OztOOzs7OzsKMzA0NTtISVJBR0FOQSBMRVRURVIgU01BTEwgVTtMbzswO0w7Ozs7O047Ozs7OwozMDQ2O0hJUkFHQU5BIExFVFRFUiBVO0xvOzA7TDs7Ozs7Tjs7Ozs7CgozMDQ3O0hJUkFHQU5BIExFVFRFUiBTTUFMTCBFO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwNDg7SElSQUdBTkEgTEVUVEVSIEU7TG87MDtMOzs7OztOOzs7OzsKMzA0OTtISVJBR0FOQSBMRVRURVIgU01BTEwgTztMbzswO0w7Ozs7O047Ozs7OwozMDRBO0hJUkFHQU5BIExFVFRFUiBPO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwNjM7SElSQUdBTkEgTEVUVEVSIFNNQUxMIFRVO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwNjQ7SElSQUdBTkEgTEVUVEVSIFRVO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwODM7SElSQUdBTkEgTEVUVEVSIFNNQUxMIFlBO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwODQ7SElSQUdBTkEgTEVUVEVSIFlBO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwODU7SElSQUdBTkEgTEVUVEVSIFNNQUxMIFlVO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwODY7SElSQUdBTkEgTEVUVEVSIFlVO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwODc7SElSQUdBTkEgTEVUVEVSIFNNQUxMIFlPO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwODg7SElSQUdBTkEgTEVUVEVSIFlPO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwOEU7SElSQUdBTkEgTEVUVEVSIFNNQUxMIFdBO0xvOzA7TDs7Ozs7Tjs7Ozs7CjMwOEY7SElSQUdBTkEgTEVUVEVSIFdBO0xvOzA7TDs7Ozs7Tjs7Ozs7CgoKICAgICAgICAKICAgIAogICAgc3RhdGljIGZpbmFsIGludCBzZWNvbmRhcnlEb3VibGVTdGFydCA9IDB4RDA7CiAgICAKICAgIHN0YXRpYyBpbnQgZml4U2Vjb25kYXJ5KGludCB4KSB7CiAgICAgICAgeCA9IGNvbXBhY3RTZWNvbmRhcnlbeF07CiAgICAgICAgcmV0dXJuIGZpeFNlY29uZGFyeTIoeCwgY29tcGFjdFNlY29uZGFyeVsweDE1M10sIGNvbXBhY3RTZWNvbmRhcnlbMHgxNTddKTsKICAgIH0KICAgICAgICAKICAgIHN0YXRpYyBpbnQgZml4U2Vjb25kYXJ5MihpbnQgeCwgaW50IGdhcDEsIGludCBnYXAyKSB7CiAgICAgICAgaW50IHRvcCA9IHg7CiAgICAgICAgaW50IGJvdHRvbSA9IDA7CiAgICAgICAgaWYgKHRvcCA9PSAwKSB7CiAgICAgICAgICAgIC8vIG9rLCB6ZXJvCiAgICAgICAgfSBlbHNlIGlmICh0b3AgPT0gMSkgewogICAgICAgICAgICB0b3AgPSBDT01NT047CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdG9wICo9IDI7IC8vIGNyZWF0ZSBnYXAgYmV0d2VlbiBlbGVtZW50cy4gdG9wIGlzIG5vdyA0IG9yIG1vcmUKICAgICAgICAgICAgdG9wICs9IDB4ODAgKyBDT01NT04gLSAyOyAvLyBpbnNlcnQgZ2FwIHRvIG1ha2UgdG9wIGF0IGxlYXN0IDg3CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBsb3dlc3QgdmFsdWVzIGFyZSBzaW5nbGV0b25zLiBPdGhlcnMgYXJlIDIgYnl0ZXMKICAgICAgICAgICAgaWYgKHRvcCA+IHNlY29uZGFyeURvdWJsZVN0YXJ0KSB7CiAgICAgICAgICAgICAgICB0b3AgLT0gc2Vjb25kYXJ5RG91YmxlU3RhcnQ7CiAgICAgICAgICAgICAgICB0b3AgKj0gNDsgLy8gbGVhdmUgYmlnZ2VyIGdhcCBqdXN0IGluIGNhc2UKICAgICAgICAgICAgICAgIGlmICh4ID4gZ2FwMSkgewogICAgICAgICAgICAgICAgICAgIHRvcCArPSAyNTY7IC8vIGxlYXZlIGdhcCBhZnRlciBDT01CSU5JTkcgRU5DTE9TSU5HIEtFWUNBUCAoc2VlIGJlbG93KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHggPiBnYXAyKSB7CiAgICAgICAgICAgICAgICAgICAgdG9wICs9IDY0OyAvLyBsZWF2ZSBnYXAgYWZ0ZXIgUlVOSUMgTEVUVEVSIFNIT1JULVRXSUctQVIgQSAoc2VlIGJlbG93KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBib3R0b20gPSAodG9wICUgTEFTVF9DT1VOVCkgKiAyICsgQ09NTU9OOwogICAgICAgICAgICAgICAgdG9wID0gKHRvcCAvIExBU1RfQ09VTlQpICsgc2Vjb25kYXJ5RG91YmxlU3RhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICh0b3AgPDwgOCkgfCBib3R0b207CiAgICB9CiAgICAKCiMgMDE1MzogKEVFM0QpIDIwRTMgWzAwMDAuMDE1My4wMDAyXSBDT01CSU5JTkcgRU5DTE9TSU5HIEtFWUNBUAojIDAxNTQ6IChFRTQxKSAwMTUzIFswOTk3LjAxNTQuMDAwNF1bMDhCMS4wMDIwLjAwMDRdIExBVElOIFNNQUxMIExJR0FUVVJFIE9FCiMgMDE1NTogKEVFNDUpIDAxN0YgWzA5RjMuMDE1NS4wMDA0XSBMQVRJTiBTTUFMTCBMRVRURVIgTE9ORyBTCiMgMDE1NzogKEVFNDkpIDE2QzYgWzE2NTYuMDE1Ny4wMDA0XSBSVU5JQyBMRVRURVIgU0hPUlQtVFdJRy1BUiBBCiMgMDE1ODogKEVFNEQpIDI3NzYgWzA4NTguMDE1OC4wMDA2XSBESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgT05FCgogICAgCiAgICBzdGF0aWMgaW50IGZpeFRlcnRpYXJ5KGludCB4KSB7CiAgICAgICAgaWYgKHggPT0gMCkgcmV0dXJuIHg7CiAgICAgICAgaWYgKHggPT0gMSkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGVydGlhcnkgaWxsZWdhbDogIiArIHgpOwogICAgICAgIC8vIDIgPT4gQ09NTU9OLCAxIGlzIHVudXNlZAogICAgICAgIGludCByZXN1bHQgPSAyICogKHggLSAyKSArIENPTU1PTjsKICAgICAgICBpZiAocmVzdWx0ID49IDB4M0UpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRlcnRpYXJ5IHRvbyBsYXJnZTogIiArIFV0aWxpdHkuaGV4KHgpICsgIiA9PiAiICsgVXRpbGl0eS5oZXgocmVzdWx0KSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIAogICAgc3RhdGljIHZvaWQgY2hlY2tGaXhlcygpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNoZWNraW5nIFNlY29uZGFyeS9UZXJ0aWFyeSBGaXhlcyIpOwogICAgICAgIGludCBsYXN0VmFsID0gLTE7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gMHgxNkU7ICsraSkgewogICAgICAgICAgICBpZiAoaSA9PSAweDE1MykgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkZWJ1ZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGludCB2YWwgPSBmaXhTZWNvbmRhcnkyKGksIDk5OSwgOTk5KTsgLy8gSEFDSyBmb3IgVUNBCiAgICAgICAgICAgIGlmICh2YWwgPD0gbGFzdFZhbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJVbm9yZGVyZWQ6ICIgKyBVdGlsaXR5LmhleCh2YWwpICsgIiA9PiAiICsgVXRpbGl0eS5oZXgobGFzdFZhbCkpOwogICAgICAgICAgICBpbnQgdG9wID0gdmFsID4+PiA4OwogICAgICAgICAgICBpbnQgYm90dG9tID0gdmFsICYgMHhGRjsKICAgICAgICAgICAgaWYgKHRvcCAhPSAwICYmICh0b3AgPCBDT01NT04gfHwgdG9wID4gMHhFRikKICAgICAgICAgICAgICAgIHx8ICh0b3AgPiBDT01NT04gJiYgdG9wIDwgMHg4NykKICAgICAgICAgICAgICAgIHx8IChib3R0b20gIT0gMCAmJiAoaXNFdmVuKGJvdHRvbSkgfHwgYm90dG9tIDwgQ09NTU9OIHx8IGJvdHRvbSA+IDB4RkQpKQogICAgICAgICAgICAgICAgfHwgKGJvdHRvbSA9PSAwICYmIHRvcCAhPSAwICYmIGlzRXZlbih0b3ApKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2Vjb25kYXJ5IG91dCBvZiByYW5nZTogIiArIFV0aWxpdHkuaGV4KGkpICsgIiA9PiAiIAogICAgICAgICAgICAgICAgICAgICsgVXRpbGl0eS5oZXgodG9wKSArICIsICIgKyBVdGlsaXR5LmhleChib3R0b20pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsYXN0VmFsID0gLTE7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gMHgxRTsgKytpKSB7CiAgICAgICAgICAgIGlmIChpID09IDEpIGNvbnRpbnVlOyAvLyBuZXZlciBvY2N1cnMKICAgICAgICAgICAgaW50IHZhbCA9IGZpeFRlcnRpYXJ5KGkpOwogICAgICAgICAgICBpZiAodmFsIDw9IGxhc3RWYWwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAiVW5vcmRlcmVkOiAiICsgVXRpbGl0eS5oZXgodmFsKSArICIgPT4gIiArIFV0aWxpdHkuaGV4KGxhc3RWYWwpKTsKICAgICAgICAgICAgaWYgKHZhbCAhPSAwICYmIChpc0V2ZW4odmFsKSB8fCB2YWwgPCBDT01NT04gfHwgdmFsID4gMHgzRCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRlcnRpYXJ5IG91dCBvZiByYW5nZTogIiArIFV0aWxpdHkuaGV4KGkpICsgIiA9PiAiIAogICAgICAgICAgICAgICAgICAgICsgVXRpbGl0eS5oZXgodmFsKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFTkQgQ2hlY2tpbmcgU2Vjb25kYXJ5L1RlcnRpYXJ5IEZpeGVzIik7CiAgICB9CiAgICAKICAgIHN0YXRpYyBib29sZWFuIGlzRXZlbihpbnQgeCkgewogICAgICAgIHJldHVybiAoeCAmIDEpID09IDA7CiAgICB9CiAgICAKICAgIHN0YXRpYyBTdHJpbmcgY2VUb1N0cmluZyhpbnQgcHJpbWFyeSwgaW50IHNlY29uZGFyeSwgaW50IHRlcnRpYXJ5KSB7CiAgICAgICAgcmV0dXJuICJbIiArIGhleEJ5dGVzKHByaW1hcnkpICsgIiwgIgogICAgICAgICAgICArIGhleEJ5dGVzKHNlY29uZGFyeSkgKyAiLCAiCiAgICAgICAgICAgICsgaGV4Qnl0ZXModGVydGlhcnkpICsgIl0iOwogICAgfQogICAgCiAgICAKICAgIHN0YXRpYyBTdHJpbmcgaGV4Qnl0ZXMobG9uZyB4KSB7CiAgICAgICAgU3RyaW5nQnVmZmVyIHRlbXAgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgaGV4Qnl0ZXMoeCwgdGVtcCk7CiAgICAgICAgcmV0dXJuIHRlbXAudG9TdHJpbmcoKTsKICAgIH0KICAgIAogICAgc3RhdGljIHZvaWQgaGV4Qnl0ZXMobG9uZyB4LCBTdHJpbmdCdWZmZXIgcmVzdWx0KSB7CiAgICAgICAgYnl0ZSBsYXN0YiA9IDE7CiAgICAgICAgZm9yIChpbnQgc2hpZnQgPSAyNDsgc2hpZnQgPj0gMDsgc2hpZnQgLT0gOCkgewogICAgICAgICAgICBieXRlIGIgPSAoYnl0ZSkoeCA+Pj4gc2hpZnQpOwogICAgICAgICAgICBpZiAoYiAhPSAwKSB7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpICE9IDApIHJlc3VsdC5hcHBlbmQoIiAiKTsKICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoVXRpbGl0eS5oZXgoYikpOwogICAgICAgICAgICAgICAgLy9pZiAobGFzdGIgPT0gMCkgU3lzdGVtLmVyci5wcmludGxuKCIgYmFkIHplcm8gYnl0ZTogIiArIHJlc3VsdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFzdGIgPSBiOwogICAgICAgIH0KICAgIH0KICAgIAogICAgc3RhdGljIGludCBmaXhIYW4oY2hhciBjaCkgeyAvLyBCVU1QIEhBTkdVTCwgSEFOCiAgICAgICAgaWYgKGNoIDwgMHgzNDAwIHx8IGNoID4gMHhEN0EzKSByZXR1cm4gLTE7CiAgICAgICAgCiAgICAgICAgY2hhciBjaDIgPSBjaDsKICAgICAgICBpZiAoY2ggPj0gMHhBQzAwKSBjaDIgLT0gKDB4QUMwMCAtIDB4OUZBNSAtIDEpOwogICAgICAgIGlmIChjaCA+PSAweDRFMDApIGNoMiAtPSAoMHg0RTAwIC0gMHg0REI1IC0gMSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIDB4NjAwMCArIChjaDItMHgzNDAwKTsgLy8gcm9vbSB0byBpbnRlcmxlYXZlCiAgICB9CiAgICAKICAgIHN0YXRpYyBCaXRTZXQgYnVtcHMgPSBuZXcgQml0U2V0KCk7CiAgICBzdGF0aWMgQml0U2V0IHNpbmdsZXMgPSBuZXcgQml0U2V0KCk7CiAgICAKICAgIHN0YXRpYyB2b2lkIGZpbmRCdW1wcyhjaGFyW10gcmVwcmVzZW50YXRpdmVzKSB7CiAgICAgICAgaW50W10gY2VzID0gbmV3IGludFsxMDBdOwogICAgICAgIGludFtdIHNjcmlwdHMgPSBuZXcgaW50WzEwMF07CiAgICAgICAgY2hhcltdIHNjcmlwdENoYXIgPSBuZXcgY2hhclsxMDBdOwogICAgICAgIAogICAgICAgIC8vIGZpbmQgcmVwcmVzZW50YXRpdmVzCiAgICAgICAgCiAgICAgICAgZm9yIChjaGFyIGNoID0gMDsgY2ggPCAweEZGRkY7ICsrY2gpIHsKICAgICAgICAgICAgYnl0ZSB0eXBlID0gY29sbGF0b3IuZ2V0Q0VUeXBlKGNoKTsKICAgICAgICAgICAgaWYgKHR5cGUgPCBVQ0EuRklYRURfQ0UpIHsKICAgICAgICAgICAgICAgIGludCBsZW4gPSBjb2xsYXRvci5nZXRDRXMoU3RyaW5nLnZhbHVlT2YoY2gpLCB0cnVlLCBjZXMpOwogICAgICAgICAgICAgICAgaW50IHByaW1hcnkgPSBVQ0EuZ2V0UHJpbWFyeShjZXNbMF0pOwogICAgICAgICAgICAgICAgaWYgKHByaW1hcnkgPCB2YXJpYWJsZUhpZ2gpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgaWYgKGNoID09IDB4MTE2MCB8fCBjaCA9PSAweDExQTgpIHsgLy8gc2V0IGJ1bXBzIHdpdGhpbiBIYW5ndWwgTCwgViwgVAogICAgICAgICAgICAgICAgICAgIGJ1bXBzLnNldChwcmltYXJ5KTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJ5dGUgc2NyaXB0ID0gdWNkLmdldFNjcmlwdChjaCk7CiAgICAgICAgICAgICAgICAvLyBIQUNLCiAgICAgICAgICAgICAgICBpZiAoY2ggPT0gMHgwRjdFIHx8IGNoID09IDB4MEY3Rikgc2NyaXB0ID0gVElCRVRBTl9TQ1JJUFQ7CiAgICAgICAgICAgICAgICAvL2lmIChzY3JpcHQgPT0gdWNkLkdSRUVLX1NDUklQVCkgU3lzdGVtLm91dC5wcmludGxuKHVjZC5nZXROYW1lKGNoKSk7CiAgICAgICAgICAgICAgICAvLyBnZXQgbGVhc3QgcHJpbWFyeSBmb3Igc2NyaXB0CiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0c1tzY3JpcHRdID09IDAgfHwgc2NyaXB0c1tzY3JpcHRdID4gcHJpbWFyeSkgewogICAgICAgICAgICAgICAgICAgIGJ5dGUgY2F0ID0gdWNkLmdldENhdGVnb3J5KGNoKTsKICAgICAgICAgICAgICAgICAgICAvLyBIQUNLCiAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IDB4MEY3RSB8fCBjaCA9PSAweDBGN0YpIGNhdCA9IHVjZC5PVEhFUl9MRVRURVI7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhdCA8PSB1Y2QuT1RIRVJfTEVUVEVSICYmIGNhdCAhPSB1Y2QuTG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0c1tzY3JpcHRdID0gcHJpbWFyeTsKICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0Q2hhcltzY3JpcHRdID0gY2g7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY3JpcHQgPT0gdWNkLkdSRUVLX1NDUklQVCkgU3lzdGVtLm91dC5wcmludGxuKCIqIiArIFV0aWxpdHkuaGV4KHByaW1hcnkpICsgdWNkLmdldE5hbWUoY2gpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBnZXQgcmVwcmVzZW50YXRpdmUgY2hhciBmb3IgcHJpbWFyeQogICAgICAgICAgICAgICAgaWYgKHJlcHJlc2VudGF0aXZlc1twcmltYXJ5XSA9PSAwIHx8IHJlcHJlc2VudGF0aXZlc1twcmltYXJ5XSA+IGNoKSB7CiAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpdmVzW3ByaW1hcnldID0gY2g7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAKICAgICAgICAvLyBzZXQgYnVtcHMKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgaWYgKHNjcmlwdHNbaV0gPiAwKSB7CiAgICAgICAgICAgICAgICBidW1wcy5zZXQoc2NyaXB0c1tpXSk7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oVXRpbGl0eS5oZXgoc2NyaXB0c1tpXSkgKyAiICIgKyBVQ0QuZ2V0U2NyaXB0SURfZnJvbUluZGV4KChieXRlKWkpCiAgICAgICAgICAgICAgICAgKyAiICIgKyBVdGlsaXR5LmhleChzY3JpcHRDaGFyW2ldKSArICIgIiArIHVjZC5nZXROYW1lKHNjcmlwdENoYXJbaV0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KIAogICAgICAgIGNoYXJbXVtdIHNpbmdsZVBhaXJzID0ge3snYScsJ3onfSwgeycgJywgJyAnfX07IC8vICwgeydcdTMwNDEnLCAnXHUzMEYzJ30KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpbmdsZVBhaXJzLmxlbmd0aDsgKytqKSB7CiAgICAgICAgICAgIGZvciAoY2hhciBrID0gc2luZ2xlUGFpcnNbal1bMF07IGsgPD0gc2luZ2xlUGFpcnNbal1bMV07ICsraykgewogICAgICAgICAgICAgICAgc2V0U2luZ2xlKGssIGNlcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2V0U2luZ2xlKCdcdTAzMDAnLCBjZXMpOwogICAgICAgIHNldFNpbmdsZSgnXHUwMzAxJywgY2VzKTsKICAgICAgICBzZXRTaW5nbGUoJ1x1MDMwMicsIGNlcyk7CiAgICAgICAgc2V0U2luZ2xlKCdcdTAzMDMnLCBjZXMpOwogICAgICAgIHNldFNpbmdsZSgnXHUwMzA4JywgY2VzKTsKICAgICAgICBzZXRTaW5nbGUoJ1x1MDMwQycsIGNlcyk7CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgYnVtcHMuc2V0KDB4MDg5QSk7IC8vIGxvd2VzdCBub24tdmFyaWFibGUKICAgICAgICBidW1wcy5zZXQoMHg0RTAwKTsgLy8gbG93ZXN0IEthbmd4aQogICAgICAgIAogICAgfQogICAgCiAgICBzdGF0aWMgdm9pZCBzZXRTaW5nbGUoY2hhciBjaCwgaW50W10gY2VzKSB7CiAgICAgICAgY29sbGF0b3IuZ2V0Q0VzKFN0cmluZy52YWx1ZU9mKGNoKSwgdHJ1ZSwgY2VzKTsKICAgICAgICBzaW5nbGVzLnNldChVQ0EuZ2V0UHJpbWFyeShjZXNbMF0pKTsKICAgICAgICBpZiAoY2ggPT0gJ2EnKSBnYXBGb3JBID0gVUNBLmdldFByaW1hcnkoY2VzWzBdKTsKICAgIH0KICAgIAogICAgCiAgICBzdGF0aWMgdm9pZCBjb3B5RmlsZShQcmludFdyaXRlciBsb2csIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBCdWZmZXJlZFJlYWRlciBpbnB1dCA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlTmFtZSkpOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBpbnB1dC5yZWFkTGluZSgpOwogICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIGJyZWFrOwogICAgICAgICAgIGxvZy5wcmludGxuKGxpbmUpOwogICAgICAgIH0KICAgICAgICBpbnB1dC5jbG9zZSgpOwogICAgfQogICAgCiAgICBzdGF0aWMgdm9pZCB3cml0ZUNvbGxhdGlvblZhbGlkaXR5TG9nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBsb2cgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oIkNoZWNrQ29sbGF0aW9uVmFsaWRpdHkuaHRtbCIpKTsKICAgICAgICBsb2cucHJpbnRsbigiPGh0bWw+PGJvZHk+Iik7CgogICAgICAgIAogICAgICAgIC8vY29sbGF0b3IgPSBuZXcgVUNBKG51bGwpOwogICAgICAgIGlmIChmYWxzZSl7CiAgICAgICAgICAgIFN0cmluZyBrZXkgPSBjb2xsYXRvci5nZXRTb3J0S2V5KCJcdTAzMDhcdTAzMDEiLCBVQ0EuU0hJRlRFRCwgZmFsc2UpOwogICAgICAgICAgICBTdHJpbmcgbG9vayA9IHByaW50YWJsZUtleShrZXkpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obG9vayk7CiAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNvcnRpbmciKTsKICAgICAgICAKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSAweEZGRkY7ICsraSkgewogICAgICAgICAgICBjaGFyIGMgPSAoY2hhcilpOwogICAgICAgICAgICBpZiAoRVhDTFVERV9VTlNVUFBPUlRFRCAmJiAhY29sbGF0b3IuZm91bmQuY29udGFpbnMoYykpIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoMHhEODAwIDw9IGkgJiYgaSA8PSAweEY4RkYpIGNvbnRpbnVlOyAvLyBza2lwIHN1cnJvZ2F0ZXMgYW5kIHByaXZhdGUgdXNlCiAgICAgICAgICAgIC8vaWYgKDB4QTAwMCA8PSBjICYmIGMgPD0gMHhBNDhGKSBjb250aW51ZTsgLy8gc2tpcCBZSQogICAgICAgICAgICBhZGRTdHJpbmcoU3RyaW5nLnZhbHVlT2YoYyksIG9wdGlvbik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIEhhc2h0YWJsZSBtdWx0aVRhYmxlID0gY29sbGF0b3IuZ2V0Q29udHJhY3RpbmcoKTsKICAgICAgICBFbnVtZXJhdGlvbiBlbnVtID0gbXVsdGlUYWJsZS5rZXlzKCk7CiAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKICAgICAgICAgICAgYWRkU3RyaW5nKChTdHJpbmcpZW51bS5uZXh0RWxlbWVudCgpLCBvcHRpb24pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhcy5sZW5ndGg7ICsraSkgeyAvLyBwdXQgaW4gc2FtcGxlIG5vbi1jaGFyYWN0ZXJzCiAgICAgICAgICAgIGFkZFN0cmluZyhleHRyYXNbaV0sIG9wdGlvbik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0cmFSYW5nZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgY2hhciBzdGFydCA9IGV4dHJhUmFuZ2VzW2ldWzBdOwogICAgICAgICAgICBjaGFyIGVuZCA9IGV4dHJhUmFuZ2VzW2ldWzFdOwogICAgICAgICAgICBpbnQgaW5jcmVtZW50ID0gKChlbmQgLSBzdGFydCArIDEpIC8gMzAzKSArIDE7CiAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSYW5nZTogIiArIHN0YXJ0ICsgIiwgIiArIGVuZCArICIsICIgKyBpbmNyZW1lbnQpOwogICAgICAgICAgICBhZGRTdHJpbmcoc3RhcnQsIG9wdGlvbik7CiAgICAgICAgICAgIGZvciAoY2hhciBqID0gKGNoYXIpKHN0YXJ0KzEpOyBqIDwgZW5kLTE7IGogKz0gaW5jcmVtZW50KSB7CiAgICAgICAgICAgICAgICBhZGRTdHJpbmcoaiwgb3B0aW9uKTsKICAgICAgICAgICAgICAgIGFkZFN0cmluZyhqKzEsIG9wdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWRkU3RyaW5nKGVuZC0xLCBvcHRpb24pOwogICAgICAgICAgICBhZGRTdHJpbmcoZW5kLCBvcHRpb24pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsOiAiICsgc29ydGVkRC5zaXplKCkpOwogICAgICAgIEl0ZXJhdG9yIGl0OwogICAgICAgIAogICAgICAgIC8vdWNkLmluaXQoKTsKICAgICAgICAKICAgICAgICBpZiAoZmFsc2UpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMaXN0aW5nIE1pc21hdGNoZXMiKTsKICAgICAgICAgICAgaXQgPSBkdXBsaWNhdGVzLmtleVNldCgpLml0ZXJhdG9yKCk7CiAgICAgICAgICAgIC8vU3RyaW5nIGxhc3RTb3J0S2V5ID0gIiI7CiAgICAgICAgICAgIC8vU3RyaW5nIGxhc3RTb3VyY2UgPSAiIjsKICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewogICAgICAgICAgICAgICAgU3RyaW5nIHNvdXJjZSA9IChTdHJpbmcpaXQubmV4dCgpOwogICAgICAgICAgICAgICAgU3RyaW5nIHNvcnRLZXkgPSAoU3RyaW5nKWR1cGxpY2F0ZXMuZ2V0KHNvdXJjZSk7CiAgICAgICAgICAgICAgICBjaGFyIGVuZE1hcmsgPSBzb3VyY2UuY2hhckF0KHNvdXJjZS5sZW5ndGgoKS0xKTsKICAgICAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZS5zdWJzdHJpbmcoMCxzb3VyY2UubGVuZ3RoKCktMSk7CiAgICAgICAgICAgICAgICBpZiAoZW5kTWFyayA9PSBNQVJLMSkgewogICAgICAgICAgICAgICAgICAgIGxvZy5wcmludGxuKCI8YnI+Iik7CiAgICAgICAgICAgICAgICAgICAgbG9nLnByaW50bG4oIk1pc21hdGNoOiAiICsgVXRpbGl0eS5oZXgoc291cmNlLCAiICIpCiAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgIiArIHVjZC5nZXROYW1lKHNvdXJjZSkgKyAiPGJyPiIpOwogICAgICAgICAgICAgICAgICAgIGxvZy5wcmludCgiICBORkQ6Iik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxvZy5wcmludCgiICBORkM6Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsb2cucHJpbnRsbihVQ0EudG9TdHJpbmcoc29ydEtleSkgKyAiPGJyPiIpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmVxdWFscyhsYXN0U291cmNlKSkgewogICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIC0tZHVwbGljYXRlQ291bnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL2xhc3RTb3J0S2V5ID0gc29ydEtleTsKICAgICAgICAgICAgICAgIGxhc3RTb3VyY2UgPSBsYXN0U291cmNlOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbDogIiArIHNvcnRlZEQuc2l6ZSgpKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcml0aW5nIik7CiAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBjb2xsYXRvci5nZXREYXRhVmVyc2lvbigpOwogICAgICAgIAogICAgICAgIGlmIChHRU5FUkFURURfTkZDX01JU01BVENIRVMpIHNob3dNaXNtYXRjaGVzKCk7CiAgICAgICAgcmVtb3ZlQWRqYWNlbnREdXBsaWNhdGVzMigpOwogICAgICAgIGNoZWNrQmFkRGVjb21wcygxLCBmYWxzZSk7IC8vIGlmIGRlY29tcG9zaXRpb24gaXMgb2ZmLCBhbGwgcHJpbWFyaWVzIHNob3VsZCBiZSBpZGVudGljYWwKICAgICAgICBjaGVja0JhZERlY29tcHMoMiwgdHJ1ZSk7IC8vIGlmIGRlY29tcG9zaXRpb24gaXMgT04sIGFsbCBwcmltYXJpZXMgYW5kIHNlY29uZGFyaWVzIHNob3VsZCBiZSBpZGVudGljYWwKICAgICAgICAKICAgICAgICAKICAgICAgICBpZiAoRE9fQ0hBUlRTKSBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikgeyAvLyB3aXRoIGFuZCB3aXRob3V0IGtleQogICAgICAgIAogICAgICAgICAgICBTdHJpbmcgbmFtZSA9ICJDb2xsYXRpb24iOwogICAgICAgICAgICBTdHJpbmcgb3RoZXIgPSAiQ29sbGF0aW9uS2V5IjsKICAgICAgICAgICAgYm9vbGVhbiBTSE9XX0NFID0gZmFsc2U7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoaiA9PSAxKSB7CiAgICAgICAgICAgICAgICBTSE9XX0NFID0gdHJ1ZTsKICAgICAgICAgICAgICAgIG5hbWUgPSAiQ29sbGF0aW9uS2V5IjsKICAgICAgICAgICAgICAgIG90aGVyID0gIkNvbGxhdGlvbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ID0gc29ydGVkRC5rZXlTZXQoKS5pdGVyYXRvcigpOwogICAgICAgICAgICAKICAgICAgICAgICAgaW50IGVuZCA9IHNvcnRlZEQuc2l6ZSgpID4+IDc7CiAgICAgICAgICAgIAogICAgICAgICAgICBQcmludFdyaXRlciBvdXQgPSB3cml0ZUhlYWQoMCwgZW5kLCBuYW1lLCBvdGhlciwgdmVyc2lvbiwgU0hPV19DRSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBTdHJpbmcgbGFzdENvbCA9ICIiOwogICAgICAgICAgICBTdHJpbmcgbGFzdENoYXIgPSAiIjsKICAgICAgICAgICAgYm9vbGVhbiBmaXJzdFJvdyA9IHRydWU7CiAgICAgICAgICAgIGludCBwYWdlID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgY291bnQgPSAwOyBpdC5oYXNOZXh0KCk7IGNvdW50KyspIHsKICAgICAgICAgICAgICAgIHBhZ2UgPSBjb3VudCA+PiA3OwogICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCAmJiAoY291bnQgJiAweGYpID09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKGNvdW50ICYgMHg3RikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVRhaWwob3V0LCBwYWdlLTEsIG5hbWUsIG90aGVyLCBTSE9XX0NFKTsKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gd3JpdGVIZWFkKHBhZ2UsIGVuZCwgbmFtZSwgb3RoZXIsIHZlcnNpb24sIFNIT1dfQ0UpOwogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJsb2NrOiAiICsgcGFnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Um93ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPC90cj48dHI+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Um93ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgU3RyaW5nIGNvbDIgPSAoU3RyaW5nKWl0Lm5leHQoKTsKICAgICAgICAgICAgICAgIFN0cmluZyBjaDIgPSAoU3RyaW5nKXNvcnRlZEQuZ2V0KGNvbDIpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbWFyawogICAgICAgICAgICAgICAgY29sMiA9IGNvbDIuc3Vic3RyaW5nKDAsY29sMi5sZW5ndGgoKS0xKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpbnQgc3RyZW5ndGggPSBnZXRTdHJlbmd0aERpZmZlcmVuY2UobGFzdENvbCwgY29sMik7CiAgICAgICAgICAgICAgICBsYXN0Q29sID0gY29sMjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgb3V0LnByaW50KCI8dGQiKTsKICAgICAgICAgICAgICAgIGludCBjb2xvciA9IDB4RkZGRkZGOwogICAgICAgICAgICAgICAgc3dpdGNoIChzdHJlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgNDogY29sb3IgPSAweEZGRkZGRjsgYnJlYWs7IC8vIHdoaXRlCiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiBjb2xvciA9IDB4Q0NDQ0ZGOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IGNvbG9yID0gMHg5OTk5RkY7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTogY29sb3IgPSAweDY2NjZGRjsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBjb2xvciA9IDB4MzMzM0ZGOyBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtYXJrID09IE1BUksyKSB7CiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvciAmIDB4RkYwMEZGOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNvbG9yICE9IDB4RkZGRkZGKSBvdXQucHJpbnQoIiBiZ2NvbG9yPScjIiArIEludGVnZXIudG9TdHJpbmcoY29sb3IsMTYpICsgIiciKTsKICAgICAgICAgICAgICAgIC8vaWYgKGZpcnN0Um93KSBvdXQucHJpbnQoIiB3aWR0aD0nNiUnIik7CiAgICAgICAgICAgICAgICBvdXQucHJpbnQoIj4iKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9sb2cucHJpbnRsbihVdGlsaXR5LmhleChjaDIuY2hhckF0KDApKSk7CiAgICAgICAgICAgICAgICBib29sZWFuIGlnbm9yYWJsZSA9IGNvbDIuY2hhckF0KDApID09IDA7CiAgICAgICAgICAgICAgICBvdXQucHJpbnQoSFRNTFN0cmluZyhjaDIpICsgIjxicj48dHQ+IgogICAgICAgICAgICAgICAgICAgICsgKGlnbm9yYWJsZSA/ICI8dT4iIDogIiIpCiAgICAgICAgICAgICAgICAgICAgKyBVdGlsaXR5LmhleChjaDIsICIgIikKICAgICAgICAgICAgICAgICAgICArIChpZ25vcmFibGUgPyAiPC91PiIgOiAiIikKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKFNIT1dfQ0UpIG91dC5wcmludCgiPC90dD48YnI+PHR0PjxiPiIgKyBVQ0EudG9TdHJpbmcoY29sMikgKyAiPC9iPiIpOwogICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvdHQ+PC90ZD4iKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIKICAgICAgICAgICAgICAgIGxhc3RDb2wgPSBjb2wyOwogICAgICAgICAgICAgICAgbGFzdENoYXIgPSBjaDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd3JpdGVUYWlsKG91dCwgcGFnZS0xLCBuYW1lLCBvdGhlciwgU0hPV19DRSk7CiAgICAgICAgfQogICAgICAgIGxvZy5wcmludGxuKCI8L2JvZHk+PC9odG1sPiIpOwogICAgICAgIGxvZy5jbG9zZSgpOwogICAgICAgIHNvcnRlZEQuY2xlYXIoKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUiKTsKICAgIH0KICAgIAogICAgICAgICAgICAKMzQwMDs8Q0pLIElkZW9ncmFwaCBFeHRlbnNpb24gQSwgRmlyc3Q+O0xvOzA7TDs7Ozs7Tjs7Ozs7CjREQjU7PENKSyBJZGVvZ3JhcGggRXh0ZW5zaW9uIEEsIExhc3Q+O0xvOzA7TDs7Ozs7Tjs7Ozs7CjRFMDA7PENKSyBJZGVvZ3JhcGgsIEZpcnN0PjtMbzswO0w7Ozs7O047Ozs7Owo5RkE1OzxDSksgSWRlb2dyYXBoLCBMYXN0PjtMbzswO0w7Ozs7O047Ozs7OwpBQzAwOzxIYW5ndWwgU3lsbGFibGUsIEZpcnN0PjtMbzswO0w7Ozs7O047Ozs7OwpEN0EzOzxIYW5ndWwgU3lsbGFibGUsIExhc3Q+O0xvOzA7TDs7Ozs7Tjs7Ozs7CkEwMDA7WUkgU1lMTEFCTEUgSVQ7TG87MDtMOzs7OztOOzs7OzsKQTAwMTtZSSBTWUxMQUJMRSBJWDtMbzswO0w7Ozs7O047Ozs7OwpBNEM0O1lJIFJBRElDQUwgWlpJRVQ7U287MDtPTjs7Ozs7Tjs7Ozs7CkE0QzY7WUkgUkFESUNBTCBLRTtTbzswO09OOzs7OztOOzs7OzsKCgogICAgc3RhdGljIGZpbmFsIGNoYXJbXVtdIGV4dHJhUmFuZ2VzID0ge3sweDM0MDAsIDB4NERCNX0sIHsweDRFMDAsIDB4OUZBNX0sIHsweEFDMDAsIDB4RDdBM30sIHsweEEwMDAsIDB4QTQ4Q319OwogICAgICAgICAgICAKICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBleHRyYXMgPSB7CiAgICAgICAgICAgICJcdUQ4MDBcdURDMDAiLCAiXHVEQkZGXHVERkZEIiwKICAgICAgICAgICAgIlx1MDIyMCIsICJcdUZGRjAiLCAKICAgICAgICAgICAgIlx1RDgwMCIsICJcdURGRkYiLAogICAgICAgICAgICAiXHVGRkZFIiwgIlx1RkZGRiIsICJcdURCRkZcdURGRkUiLCAiXHVEQkZGXHVERkZGIiwgCiAgICAgICAgfTsKICAgICAgICAKICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFSSyA9IDE7CiAgICBzdGF0aWMgZmluYWwgY2hhciBNQVJLMSA9ICdcdTAwMDEnOwogICAgc3RhdGljIGZpbmFsIGNoYXIgTUFSSzIgPSAnXHUwMDAyJzsKICAgIC8vTm9ybWFsaXplciBub3JtYWxpemVyID0gbmV3IE5vcm1hbGl6ZXIoTm9ybWFsaXplci5ORkMsIHRydWUpOwogICAgCiAgICAvL3N0YXRpYyBOb3JtYWxpemVyIHRvQyA9IG5ldyBOb3JtYWxpemVyKE5vcm1hbGl6ZXIuTkZDKTsKICAgIC8vc3RhdGljIE5vcm1hbGl6ZXIgdG9EID0gbmV3IE5vcm1hbGl6ZXIoTm9ybWFsaXplci5ORkQpOwogICAgc3RhdGljIFRyZWVNYXAgTWlzbWF0Y2hlZEMgPSBuZXcgVHJlZU1hcCgpOwogICAgc3RhdGljIFRyZWVNYXAgTWlzbWF0Y2hlZE4gPSBuZXcgVHJlZU1hcCgpOwogICAgc3RhdGljIFRyZWVNYXAgTWlzbWF0Y2hlZEQgPSBuZXcgVHJlZU1hcCgpOwogICAgCiAgICBzdGF0aWMgZmluYWwgYnl0ZSBvcHRpb24gPSBVQ0EuTk9OX0lHTk9SQUJMRTsgLy8gU0hJRlRFRAogICAgCiAgICBzdGF0aWMgdm9pZCBhZGRTdHJpbmcoaW50IGNoLCBieXRlIG9wdGlvbikgewogICAgICAgIGFkZFN0cmluZyhTdHJpbmcudmFsdWVPZigoY2hhciljaCksIG9wdGlvbik7CiAgICB9CiAgICAgICAgCiAgICBzdGF0aWMgdm9pZCBhZGRTdHJpbmcoU3RyaW5nIGNoLCBieXRlIG9wdGlvbikgewogICAgICAgIFN0cmluZyBjb2xEYmFzZSA9IGNvbGxhdG9yLmdldFNvcnRLZXkoY2gsIG9wdGlvbiwgdHJ1ZSk7CiAgICAgICAgU3RyaW5nIGNvbE5iYXNlID0gY29sbGF0b3IuZ2V0U29ydEtleShjaCwgb3B0aW9uLCBmYWxzZSk7CiAgICAgICAgU3RyaW5nIGNvbENiYXNlID0gY29sbGF0b3IuZ2V0U29ydEtleShuZmMubm9ybWFsaXplKGNoKSwgb3B0aW9uLCBmYWxzZSk7CiAgICAgICAgaWYgKCFjb2xOYmFzZS5lcXVhbHMoY29sQ2Jhc2UpKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihVdGlsaXR5LmhleChjaCkpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocHJpbnRhYmxlS2V5KGNvbE5iYXNlKSk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwcmludGFibGVLZXkoY29sTmJhc2UpKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHByaW50YWJsZUtleShjb2xOYmFzZSkpOwogICAgICAgICAgICBNaXNtYXRjaGVkTi5wdXQoY2gsY29sTmJhc2UpOwogICAgICAgICAgICBNaXNtYXRjaGVkQy5wdXQoY2gsY29sQ2Jhc2UpOwogICAgICAgICAgICBNaXNtYXRjaGVkRC5wdXQoY2gsY29sRGJhc2UpOwogICAgICAgIH0KICAgICAgICBTdHJpbmcgY29sRCA9IGNvbERiYXNlICsgIlx1MDAwMCIgKyBjaDsgLy8gVUNBLk5PTl9JR05PUkFCTEUKICAgICAgICBTdHJpbmcgY29sTiA9IGNvbE5iYXNlICsgIlx1MDAwMCIgKyBjaDsKICAgICAgICBTdHJpbmcgY29sQyA9IGNvbENiYXNlICsgIlx1MDAwMCIgKyBjaDsKICAgICAgICBzb3J0ZWRELnB1dChjb2xELCBjaCk7CiAgICAgICAgYmFja0QucHV0KGNoLCBjb2xEKTsKICAgICAgICBzb3J0ZWROLnB1dChjb2xOLCBjaCk7CiAgICAgICAgYmFja04ucHV0KGNoLCBjb2xOKTsKICAgICAgICAKICAgICAgICBpZiAoc3RyZW5ndGggPiA0KSB7CiAgICAgICAgICAgIGR1cGxpY2F0ZUNvdW50Kys7CiAgICAgICAgICAgIGR1cGxpY2F0ZXMucHV0KGNoK01BUksxLCBjb2wpOwogICAgICAgICAgICBkdXBsaWNhdGVzLnB1dChjaCtNQVJLMiwgY29sMik7CiAgICAgICAgfSBlbHNlIGlmIChzdHJlbmd0aCAhPSAwKSB7CiAgICAgICAgICAgIHNvcnRlZC5wdXQoY29sMiArIE1BUksyLCBjaCk7CiAgICAgICAgfQogICAgICAgIHVuaXF1ZSArPSAyOwogICAgICAgIAogICAgfQogICAgCiAgIHN0YXRpYyB2b2lkIHJlbW92ZUFkamFjZW50RHVwbGljYXRlcygpIHsKICAgICAgICBTdHJpbmcgbGFzdENoYXIgPSAiIjsKICAgICAgICBpbnQgY291bnRSZW0gPSAwOwogICAgICAgIGludCBjb3VudER1cHMgPSAwOwogICAgICAgIEl0ZXJhdG9yIGl0MSA9IHNvcnRlZEQua2V5U2V0KCkuaXRlcmF0b3IoKTsKICAgICAgICBJdGVyYXRvciBpdDIgPSBzb3J0ZWROLmtleVNldCgpLml0ZXJhdG9yKCk7CiAgICAgICAgRGlmZmVyIGRpZmZlciA9IG5ldyBEaWZmZXIoMjUwLDMpOwogICAgICAgIGxvZy5wcmludGxuKCI8aDE+Mi4gRGlmZmVyZW5jZXMgaW4gT3JkZXJpbmc8L2gxPiIpOwogICAgICAgIGxvZy5wcmludGxuKCI8cD5Db2RlcyBhbmQgbmFtZXMgYXJlIGluIHRoZSB3aGl0ZSByb3dzOiBib2xkIG1lYW5zIHRoYXQgdGhlIE5PLU5GRCBzb3J0IGtleSBkaWZmZXJzIGZyb20gVUNBIGtleS48L3A+Iik7CiAgICAgICAgbG9nLnByaW50bG4oIjxwPktleXMgYXJlIGluIHRoZSBsaWdodCBibHVlIHJvd3M6IGdyZWVuIGlzIHRoZSBiYWQga2V5LCBibHVlIGlzIFVDQSwgYmxhY2sgaXMgd2hlcmUgdGhleSBlcXVhbC48L3A+Iik7CiAgICAgICAgbG9nLnByaW50bG4oIjx0YWJsZSBib3JkZXI9JzEnPiIpOwogICAgICAgIGxvZy5wcmludGxuKCI8dHI+PHRoPkZpbGUgT3JkZXI8L3RoPjx0aD5Db2RlIGFuZCBEZWNvbXA8L3RoPjx0aD5LZXkgYW5kIERlY29tcC1LZXk8L3RoPjwvdHI+Iik7CiAgICAgICAgCiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgYm9vbGVhbiBnb3RPbmUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKGl0MS5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgICAgIFN0cmluZyBjb2wxID0gKFN0cmluZylpdDEubmV4dCgpOwogICAgICAgICAgICAgICAgU3RyaW5nIGNoMSA9IChTdHJpbmcpc29ydGVkRC5nZXQoY29sMSk7CiAgICAgICAgICAgICAgICBkaWZmZXIuYWRkQShjaDEpOwogICAgICAgICAgICAgICAgZ290T25lID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGl0Mi5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgICAgIFN0cmluZyBjb2wyID0gKFN0cmluZylpdDIubmV4dCgpOwogICAgICAgICAgICAgICAgU3RyaW5nIGNoMiA9IChTdHJpbmcpc29ydGVkTi5nZXQoY29sMik7CiAgICAgICAgICAgICAgICBkaWZmZXIuYWRkQihjaDIpOwogICAgICAgICAgICAgICAgZ290T25lID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZGlmZmVyLmNoZWNrTWF0Y2goIWdvdE9uZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoZGlmZmVyLmdldEFDb3VudCgpICE9IDAgfHwgZGlmZmVyLmdldEJDb3VudCgpICE9IDApIHsKICAgICAgICAgICAgICAgIGZvciAoaW50IHEgPSAwOyBxIDwgMjsgKytxKSB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNlbGwgPSAiPHRkIHZhbGlnbj0ndG9wJyIgKyAocSE9MCA/ICJiZ2NvbG9yPScjQzBDMEMwJyIgOiAiIikgKyAiPiIgKyAocSE9MCA/ICI8dHQ+IiA6ICIiKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBsb2cucHJpbnQoIjx0cj4iICsgY2VsbCk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IC0xOyBpIDwgZGlmZmVyLmdldEFDb3VudCgpKzE7ICsraSkgewogICAgICAgICAgICAgICAgICAgICAgICBzaG93RGlmZihxPT0wLCB0cnVlLCBkaWZmZXIuZ2V0QUxpbmUoaSksIGRpZmZlci5nZXRBKGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnByaW50bG4oIjxicj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgKytjb3VudER1cHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvdW50RHVwcyAtPSAyOyAvLyB0byBtYWtlIHVwIGZvciBleHRyYSBsaW5lIGFib3ZlIGFuZCBiZWxvdwogICAgICAgICAgICAgICAgICAgIGlmIChmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2cucHJpbnQoIjwvdGQ+IiArIGNlbGwpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IC0xOyBpIDwgZGlmZmVyLmdldEJDb3VudCgpKzE7ICsraSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0RpZmYocT09MCwgZmFsc2UsIGRpZmZlci5nZXRCTGluZShpKSwgZGlmZmVyLmdldEIoaSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnByaW50bG4oIjxicj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsb2cucHJpbnRsbigiPC90ZD48L3RyPiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vZGlmZmVyLmZsdXNoKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIWdvdE9uZSkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZy5wcmludGxuKCI8L3RhYmxlPiIpOwogICAgICAgIAogICAgICAgIC8vbG9nLnByaW50bG4oIlJlbW92ZWQgIiArIGNvdW50UmVtICsgIiBhZGphY2VudCBkdXBsaWNhdGVzLjxicj4iKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxlZnQgIiArIGNvdW50RHVwcyArICIgY29uZmxpY3RzLjxicj4iKTsKICAgICAgICBsb2cucHJpbnRsbigiTGVmdCAiICsgY291bnREdXBzICsgIiBjb25mbGljdHMuPGJyPiIpOwogICB9CgogICBzdGF0aWMgdm9pZCByZW1vdmVBZGphY2VudER1cGxpY2F0ZXMyKCkgewogICAgICAgIFN0cmluZyBsYXN0Q2hhciA9ICIiOwogICAgICAgIGludCBjb3VudFJlbSA9IDA7CiAgICAgICAgaW50IGNvdW50RHVwcyA9IDA7CiAgICAgICAgSXRlcmF0b3IgaXQgPSBzb3J0ZWRELmtleVNldCgpLml0ZXJhdG9yKCk7CiAgICAgICAgbG9nLnByaW50bG4oIjxoMT4yLiBEaWZmZXJlbmNlcyBpbiBPcmRlcmluZzwvaDE+Iik7CiAgICAgICAgbG9nLnByaW50bG4oIjxwPkNvZGVzIGFuZCBuYW1lcyBhcmUgaW4gdGhlIHdoaXRlIHJvd3M6IGJvbGQgbWVhbnMgdGhhdCB0aGUgTk8tTkZEIHNvcnQga2V5IGRpZmZlcnMgZnJvbSBVQ0Ega2V5LjwvcD4iKTsKICAgICAgICBsb2cucHJpbnRsbigiPHA+S2V5cyBhcmUgaW4gdGhlIGxpZ2h0IGJsdWUgcm93czogZ3JlZW4gaXMgdGhlIGJhZCBrZXksIGJsdWUgaXMgVUNBLCBibGFjayBpcyB3aGVyZSB0aGV5IGVxdWFsLjwvcD4iKTsKICAgICAgICBsb2cucHJpbnRsbigiPHRhYmxlIGJvcmRlcj0nMSc+Iik7CiAgICAgICAgbG9nLnByaW50bG4oIjx0cj48dGg+RmlsZSBPcmRlcjwvdGg+PHRoPkNvZGUgYW5kIERlY29tcDwvdGg+PHRoPktleSBhbmQgRGVjb21wLUtleTwvdGg+PC90cj4iKTsKICAgICAgICAKICAgICAgICBTdHJpbmcgbGFzdENvbCA9ICJhIjsKICAgICAgICBTdHJpbmcgbGFzdENvbE4gPSAiYSI7CiAgICAgICAgU3RyaW5nIGxhc3RDaCA9ICIiOwogICAgICAgIGJvb2xlYW4gc2hvd2VkTGFzdCA9IHRydWU7CiAgICAgICAgaW50IGNvdW50ID0gMDsKICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgIFN0cmluZyBjb2wgPSAoU3RyaW5nKWl0Lm5leHQoKTsKICAgICAgICAgICAgU3RyaW5nIGNoID0gKFN0cmluZylzb3J0ZWRELmdldChjb2wpOwogICAgICAgICAgICBTdHJpbmcgY29sTiA9IChTdHJpbmcpYmFja04uZ2V0KGNoKTsKICAgICAgICAgICAgaWYgKGNvbE4gPT0gbnVsbCB8fCBjb2xOLmxlbmd0aCgpIDwgMSkgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNaXNzaW5nIGNvbE4gdmFsdWUgZm9yICIgKyBVdGlsaXR5LmhleChjaCwgIiAiKSArICI6ICIgKyBwcmludGFibGVLZXkoY29sTikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb2wgPT0gbnVsbCB8fCBjb2wubGVuZ3RoKCkgPCAxKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1pc3NpbmcgY29sIHZhbHVlIGZvciAiICsgVXRpbGl0eS5oZXgoY2gsICIgIikgKyAiOiAiICsgcHJpbnRhYmxlS2V5KGNvbCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoY29tcGFyZU1pbnVzTGFzdChjb2wsIGxhc3RDb2wpID09IGNvbXBhcmVNaW51c0xhc3QoY29sTiwgbGFzdENvbE4pKSB7CiAgICAgICAgICAgICAgICBzaG93ZWRMYXN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAodHJ1ZSAmJiBjb3VudCA8IDIwMCkgewogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihVdGlsaXR5LmhleChjaCwgIiAiKSArICIsICIgKyBVdGlsaXR5LmhleChsYXN0Q2gsICIgIikpOwogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgY29sOiAiICsgVXRpbGl0eS5oZXgoY29sLCAiICIpKTsKICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY29tcGFyZU1pbnVzTGFzdChjb2wsIGxhc3RDb2wpKTsKICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgbGFzdENvbDogIiArIFV0aWxpdHkuaGV4KGxhc3RDb2wsICIgIikpOwogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICBjb2xOOiAiICsgVXRpbGl0eS5oZXgoY29sTiwgIiAiKSk7CiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNvbXBhcmVNaW51c0xhc3QoY29sTiwgbGFzdENvbE4pKTsKICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiBsYXN0Q29sTjogIiArIFV0aWxpdHkuaGV4KGxhc3RDb2xOLCAiICIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc2hvd2VkTGFzdCkgewogICAgICAgICAgICAgICAgICAgIGxvZy5wcmludGxuKCI8dHI+PHRkIGNvbHNwYW49JzMnPjwvdGQ+PHRyPiIpOwogICAgICAgICAgICAgICAgICAgIHNob3dMaW5lKGNvdW50LTEsIGxhc3RDaCwgbGFzdENvbCwgbGFzdENvbE4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2hvd2VkTGFzdCA9IHRydWU7CiAgICAgICAgICAgICAgICBzaG93TGluZShjb3VudCxjaCwgY29sLCBjb2xOKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0Q29sID0gY29sOwogICAgICAgICAgICBsYXN0Q29sTiA9IGNvbE47CiAgICAgICAgICAgIGxhc3RDaCA9IGNoOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2cucHJpbnRsbigiPC90YWJsZT4iKTsKICAgfQogICAKICAgIHN0YXRpYyBpbnQgY29tcGFyZU1pbnVzTGFzdChTdHJpbmcgYSwgU3RyaW5nIGIpIHsKICAgICAgICBTdHJpbmcgYW0gPSBhLnN1YnN0cmluZygwLGEubGVuZ3RoKCktMSk7CiAgICAgICAgU3RyaW5nIGJtID0gYi5zdWJzdHJpbmcoMCxiLmxlbmd0aCgpLTEpOwogICAgICAgIGludCByZXN1bHQgPSBhbS5jb21wYXJlVG8oYik7CiAgICAgICAgcmV0dXJuIChyZXN1bHQgPCAwID8gLTEgOiByZXN1bHQgPiAwID8gMSA6IDApOwogICAgfQogICAgCiAgICBzdGF0aWMgdm9pZCBzaG93TGluZShpbnQgY291bnQsIFN0cmluZyBjaCwgU3RyaW5nIGtleUQsIFN0cmluZyBrZXlOKSB7CiAgICAgICAgU3RyaW5nIGRlY29tcCA9IG5mZC5ub3JtYWxpemUoY2gpOwogICAgICAgIGlmIChkZWNvbXAuZXF1YWxzKGNoKSkgZGVjb21wID0gIiI7IGVsc2UgZGVjb21wID0gIjxicj48IiArIFV0aWxpdHkuaGV4KGRlY29tcCwgIiAiKSArICI+ICI7CiAgICAgICAgbG9nLnByaW50bG4oIjx0cj48dGQ+IiArIGNvdW50ICsgIjwvdGQ+PHRkPiIgCiAgICAgICAgICAgICsgVXRpbGl0eS5oZXgoY2gsICIgIikKICAgICAgICAgICAgKyAiICIgKyB1Y2QuZ2V0TmFtZShjaCkKICAgICAgICAgICAgKyBkZWNvbXAKICAgICAgICAgICAgKyAiPC90ZD48dGQ+Iik7CiAgICAgICAgICAgICAgICAKICAgICAgICBpZiAoa2V5RC5lcXVhbHMoa2V5TikpIHsKICAgICAgICAgICAgbG9nLnByaW50bG4ocHJpbnRhYmxlS2V5KGtleU4pKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb2cucHJpbnRsbigiPGZvbnQgY29sb3I9JyMwMDk5MDAnPiIgKyBwcmludGFibGVLZXkoa2V5TikKICAgICAgICAgICAgICAgICsgIjwvZm9udD48YnI+PGZvbnQgY29sb3I9JyMwMDAwOTknPiIgKyBwcmludGFibGVLZXkoa2V5RCkgKyAiPC9mb250PiIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbG9nLnByaW50bG4oIjwvdGQ+PC90cj4iKTsKICAgIH0KICAgIAogICAgVHJlZVNldCBmb287CiAgICAKICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBhbHRlcm5hdGVOYW1lID0geyJTSElGVEVEIiwgIlpFUk9FRCIsICJOT05fSUdOT1JBQkxFIiwgIlNISUZURURfVFJJTU1FRCJ9OwogICAKICAgIHN0YXRpYyB2b2lkIHNob3dNaXNtYXRjaGVzKCkgewogICAgICAgIE1MU3RyZWFtV3JpdGVyIG91dCA9IG5ldyBNTFN0cmVhbVdyaXRlcihsb2cpOwogICAgICAgIG91dC5lbCgiaDEiKS50eCgiMS4gTWlzbWF0Y2hlcyB3aGVuIE5GRCBpcyBPRkYiKS5jbCgpOwogICAgICAgIG91dC5lbCgiaDIiKS50eCgiRGF0ZToiICsgbmV3IERhdGUoKSkuY2woKTsKICAgICAgICBvdXQuZWwoImgyIikudHgoIkZpbGUgVmVyc2lvbjoiICsgVUNBLlZFUlNJT04pLmNsKCk7CiAgICAgICAgb3V0LmVsKCJwIikudHgoIkFsdGVybmF0ZSBIYW5kbGluZyA9ICIgKyBhbHRlcm5hdGVOYW1lW29wdGlvbl0pLmNsKCk7CiAgICAgICAgb3V0LmVsKCJ0YWJsZSIpLmF0KCJib3JkZXIiLDEpOwogICAgICAgICAgICBvdXQuZWwoImNhcHRpb24iKS50eCgiTWlzbWF0Y2hlcyBpbiBVQ0EtTk9EOiBQbGFpbiB2cyBORkM6ICIpLnR4KE1pc21hdGNoZWRDLnNpemUoKSkuY2woImNhcHRpb24iKTsKICAgICAgICAgICAgb3V0LmVsKCJ0ciIpOwogICAgICAgICAgICAgICAgb3V0LmVsKCJ0aCIpLnR4KCJDb2RlIikuY2woKTsKICAgICAgICAgICAgICAgIG91dC5lbCgidGgiKS50eCgiVHlwZSIpLmNsKCk7CiAgICAgICAgICAgICAgICBvdXQuZWwoInRoIikudHgoIkNDPyIpLmNsKCk7CiAgICAgICAgICAgICAgICBvdXQuZWwoInRoIikudHgoIktleSIpLmNsKCk7CiAgICAgICAgICAgIG91dC5jbCgidHIiKTsKICAgICAgICBJdGVyYXRvciBpdCA9IE1pc21hdGNoZWRDLmtleVNldCgpLml0ZXJhdG9yKCk7CiAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewogICAgICAgICAgICBTdHJpbmcgY2ggPSAoU3RyaW5nKWl0Lm5leHQoKTsKICAgICAgICAgICAgU3RyaW5nIE1OID0gKFN0cmluZylNaXNtYXRjaGVkTi5nZXQoY2gpOwogICAgICAgICAgICBTdHJpbmcgTUMgPSAoU3RyaW5nKU1pc21hdGNoZWRDLmdldChjaCk7CiAgICAgICAgICAgIFN0cmluZyBjaEluQyA9IG5mYy5ub3JtYWxpemUoY2gpOwogICAgICAgICAgICBvdXQuZWwoInRyIik7CiAgICAgICAgICAgICAgb3V0LmVsKCJ0aCIpLmF0KCJyb3dTcGFuIiwyKS5hdCgiYWxpZ24iLCJyaWdodCIpLnR4MTYoY2gpLnR4KCcgJykudHgodWNkLmdldE5hbWUoY2gpKTsKICAgICAgICAgICAgICAgIG91dC5lbCgiYnIiKS5jbCgpLnR4KCJORkM9IikudHgxNihjaEluQykuY2woKTsKICAgICAgICAgICAgICBvdXQuZWwoInRoIikudHgoIlBsYWluIikuY2woKTsKICAgICAgICAgICAgICBvdXQuZWwoInRoIikudHgoY29udGFpbnNDb21iaW5pbmcoY2gpID8gInkiIDogIm4iKS5jbCgpOwogICAgICAgICAgICAgIG91dC5lbCgidGQiKS50eChwcmludGFibGVLZXkoTU4pKS5jbCgpOwogICAgICAgICAgICBvdXQuY2woInRyIik7CiAgICAgICAgICAgIG91dC5lbCgidHIiKTsKICAgICAgICAgICAgICBvdXQuZWwoInRoIikudHgoIk5GQyIpLmNsKCk7CiAgICAgICAgICAgICAgb3V0LmVsKCJ0aCIpLnR4KGNvbnRhaW5zQ29tYmluaW5nKGNoSW5DKSA/ICJZIiA6ICJFUlJPUiIpLmNsKCk7CiAgICAgICAgICAgICAgb3V0LmVsKCJ0ZCIpLnR4KHByaW50YWJsZUtleShNQykpLmNsKCk7CiAgICAgICAgICAgIG91dC5jbCgidHIiKTsKICAgICAgICB9CiAgICAgICAgb3V0LmNsb3NlQWxsRWxlbWVudHMoKTsKICAgICAgICBsb2cucHJpbnRsbigiPGJyPiIpOwogICAgfQogICAgCiAgICBzdGF0aWMgYm9vbGVhbiBjb250YWluc0NvbWJpbmluZyhTdHJpbmcgcykgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgKytpKSB7CiAgICAgICAgICAgIGlmICgodWNkLmdldENhdGVnb3J5TWFzayhzLmNoYXJBdChpKSkgJiB1Y2QuTUFSS19NQVNLKSAhPSAwKSByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAKICAgCiAgICBzdGF0aWMgdm9pZCBzaG93RGlmZihib29sZWFuIHNob3dOYW1lLCBib29sZWFuIGZpcnN0Q29sdW1uLCBpbnQgbGluZSwgT2JqZWN0IGNob2JqKSB7CiAgICAgICAgU3RyaW5nIGNoID0gY2hvYmoudG9TdHJpbmcoKTsKICAgICAgICBTdHJpbmcgZGVjb21wID0gbmZkLm5vcm1hbGl6ZShjaCk7CiAgICAgICAgaWYgKHNob3dOYW1lKSB7CiAgICAgICAgICAgIGlmIChjaC5lcXVhbHMoZGVjb21wKSkgewogICAgICAgICAgICAgICAgbG9nLnByaW50bG4oLy90aXRsZSArIGNvdW50ZXIgKyAiICIKICAgICAgICAgICAgICAgICAgICBVdGlsaXR5LmhleChjaCwgIiAiKSAKICAgICAgICAgICAgICAgICAgICArICIgIiArIHVjZC5nZXROYW1lKGNoKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxvZy5wcmludGxuKC8vdGl0bGUgKyBjb3VudGVyICsgIiAiCiAgICAgICAgICAgICAgICAgICAgIjxiPiIgKyBVdGlsaXR5LmhleChjaCwgIiAiKSAKICAgICAgICAgICAgICAgICAgICArICIgIiArIHVjZC5nZXROYW1lKGNoKSArICI8L2I+IgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFN0cmluZyBrZXlEID0gcHJpbnRhYmxlS2V5KGJhY2tELmdldChjaG9iaikpOwogICAgICAgICAgICBTdHJpbmcga2V5TiA9IHByaW50YWJsZUtleShiYWNrTi5nZXQoY2hvYmopKTsKICAgICAgICAgICAgaWYgKGtleUQuZXF1YWxzKGtleU4pKSB7CiAgICAgICAgICAgICAgICBsb2cucHJpbnRsbigvL3RpdGxlICsgY291bnRlciArICIgIgogICAgICAgICAgICAgICAgICAgIFV0aWxpdHkuaGV4KGNoLCAiICIpICsgIiAiICsga2V5Tik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsb2cucHJpbnRsbigvL3RpdGxlICsgY291bnRlciArICIgIgogICAgICAgICAgICAgICAgICAgICI8Zm9udCBjb2xvcj0nIzAwOTkwMCc+IiArIFV0aWxpdHkuaGV4KGNoLCAiICIpICsgIiAiICsga2V5TgogICAgICAgICAgICAgICAgICAgICsgIjwvZm9udD48YnI+PGZvbnQgY29sb3I9JyMwMDAwOTknPiIgKyBVdGlsaXR5LmhleChkZWNvbXAsICIgIikgKyAiICIgKyBrZXlEICsgIjwvZm9udD4iCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICBzdGF0aWMgU3RyaW5nIHByaW50YWJsZUtleShPYmplY3Qga2V5b2JqKSB7CiAgICAgICAgU3RyaW5nIHNvcnRLZXk7CiAgICAgICAgaWYgKGtleW9iaiA9PSBudWxsKSB7CiAgICAgICAgICAgIHNvcnRLZXkgPSAiTlVMTCEhIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzb3J0S2V5ID0ga2V5b2JqLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHNvcnRLZXkgPSBzb3J0S2V5LnN1YnN0cmluZygwLHNvcnRLZXkubGVuZ3RoKCktMSk7CiAgICAgICAgICAgIHNvcnRLZXkgPSBVQ0EudG9TdHJpbmcoc29ydEtleSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzb3J0S2V5OwogICAgfQogICAgCiAgICAKICAgICAgTElOS1M8L3RkPjwvdHI+PHRyPjx0ZD48YmxvY2txdW90ZT4KICAgICBDT05URU5UUyAgICAgCiAgICAKICAgIAogICAKICAgIHN0YXRpYyB2b2lkIHdyaXRlVGFpbChQcmludFdyaXRlciBvdXQsIGludCBjb3VudGVyLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBvdGhlciwgYm9vbGVhbiBzaG93KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIGNvcHlGaWxlKG91dCwgIkhUTUwtUGFydDIudHh0Iik7CiAgICAgICAgCiAgICAgICAgb3V0LnByaW50bG4oIjwvdHI+PC90YWJsZT48L2NlbnRlcj48L2Rpdj4iKTsKICAgICAgICBvdXQucHJpbnRsbigiPC9ib2R5PjwvaHRtbD4iKTsKICAgICAgICAKICAgICAgICBvdXQuY2xvc2UoKTsKICAgIH0KICAgIAogICAgc3RhdGljIFN0cmluZyBwYWQgKGludCBudW1iZXIpIHsKICAgICAgICBTdHJpbmcgbnVtID0gSW50ZWdlci50b1N0cmluZyhudW1iZXIpOwogICAgICAgIGlmIChudW0ubGVuZ3RoKCkgPCAyKSBudW0gPSAiMCIgKyBudW1iZXI7CiAgICAgICAgcmV0dXJuIG51bTsKICAgIH0KCiAgICBzdGF0aWMgUHJpbnRXcml0ZXIgd3JpdGVIZWFkKGludCBjb3VudGVyLCBpbnQgZW5kLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBvdGhlciwgU3RyaW5nIHZlcnNpb24sIGJvb2xlYW4gc2hvdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKCiAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKAogICAgICAgICAgICBuZXcgQnVmZmVyZWRXcml0ZXIoCiAgICAgICAgICAgIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCiAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShVQ0EuQkFTRV9ESVIrIlxcZ2VuZXJhdGVkXFxjb2xsYXRpb25cXCIgKyB0aXRsZSArIHBhZChjb3VudGVyKSArICIuaHRtbCIpLAogICAgICAgICAgICAgICAgIlVURjgiKSwKICAgICAgICAgICAgNCoxMDI0KSk7CiAgICAgICAgY29weUZpbGUob3V0LCAiSFRNTC1QYXJ0MS50eHQiKTsKICAgICAgICAKICAgICAgICBvdXQucHJpbnRsbigiPGh0bWw+PGhlYWQ+Iik7CiAgICAgICAgb3V0LnByaW50bG4oIjxtZXRhIGh0dHAtZXF1aXY9J0NvbnRlbnQtVHlwZScgY29udGVudD0ndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Jz4iKTsKICAgICAgICBvdXQucHJpbnRsbigiPHRpdGxlPiIgKyBIVE1MU3RyaW5nKHRpdGxlKSArICI8L3RpdGxlPiIpOwogICAgICAgIG91dC5wcmludGxuKCI8c3R5bGU+Iik7CiAgICAgICAgb3V0LnByaW50bG4oIjwhLS0iKTsKICAgICAgICAvL291dC5wcmludGxuKCJ0ZCAgICAgICAgICAgeyBmb250LXNpemU6IDE4cHQ7IGZvbnQtZmFtaWx5OiBCaXRzdHJlYW0gQ3liZXJiaXQsIEFyaWFsIFVuaWNvZGUgTVM7IHRleHQtYWxpZ246IENlbnRlcn0iKTsKICAgICAgICBvdXQucHJpbnRsbigidGQgICAgICAgICAgIHsgZm9udC1zaXplOiAxOHB0OyB0ZXh0LWFsaWduOiBDZW50ZXJ9Iik7CiAgICAgICAgb3V0LnByaW50bG4oInRkLnJpZ2h0ICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTJwdDsgdGV4dC1hbGlnbjogUmlnaHR9Iik7CiAgICAgICAgb3V0LnByaW50bG4oInRkLnRpdGxlICAgICAgICAgICB7IGZvbnQtc2l6ZTogMThwdDsgdGV4dC1hbGlnbjogQ2VudGVyfSIpOwogICAgICAgIG91dC5wcmludGxuKCJ0ZC5sZWZ0ICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTJwdDsgdGV4dC1hbGlnbjogTGVmdH0iKTsKICAgICAgICAvL291dC5wcmludGxuKCJ0aCAgICAgICAgIHsgYmFja2dyb3VuZC1jb2xvcjogI0MwQzBDMDsgZm9udC1zaXplOiAxOHB0OyBmb250LWZhbWlseTogQXJpYWwgVW5pY29kZSBNUywgQml0c3RyZWFtIEN5YmVyYml0OyB0ZXh0LWFsaWduOiBDZW50ZXIgfSIpOwogICAgICAgIG91dC5wcmludGxuKCJ0dCAgICAgICAgIHsgZm9udC1zaXplOiA4cHQ7IH0iKTsKICAgICAgICAvL291dC5wcmludGxuKCJjb2RlICAgICAgICAgICB7IGZvbnQtc2l6ZTogOHB0OyB9Iik7CiAgICAgICAgb3V0LnByaW50bG4oIi0tPiIpOwogICAgICAgIG91dC5wcmludGxuKCI8L3N0eWxlPjwvaGVhZD48Ym9keSBiZ2NvbG9yPScjRkZGRkZGJz4iKTsKICAgICAgICAKICAgICAgICAvLyBoZWFkZXIKICAgICAgICBvdXQucHJpbnQoIjx0YWJsZSB3aWR0aD0nMTAwJSc+PHRyPiIpOwogICAgICAgIG91dC5wcmludGxuKCI8dGQ+PHAgYWxpZ249J2xlZnQnPjxmb250IHNpemU9JzMnPjxhIGhyZWY9J2luZGV4Lmh0bWwnPkluc3RydWN0aW9uczwvYT48L2ZvbnQ+PC90ZD4iKTsKICAgICAgICBvdXQucHJpbnRsbigiPHRkPiIgKyBIVE1MU3RyaW5nKHRpdGxlKSArICIgVmVyc2lvbiIgKyB2ZXJzaW9uICsgIjwvdGQ+Iik7CiAgICAgICAgb3V0LnByaW50bG4oIjx0ZD48cCBhbGlnbj0ncmlnaHQnPjxmb250IHNpemU9JzMnPjxhIGhyZWY9JyIgKyBvdGhlciArIHBhZChjb3VudGVyKSArICIuaHRtbCc+IgogICAgICAgICAgICArIChzaG93ID8gIkhpZGUiIDogIlNob3ciKSArICIgS2V5PC9hPjwvdGQ+Iik7CiAgICAgICAgb3V0LnByaW50bG4oIjwvdHI+PC90YWJsZT4iKTsKICAgICAgICAvKgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkLmxlZnQ+PGEgaHJlZj0iQ29sbGF0aW9uLmh0bWwiPgogICAgICA8Zm9udCBzaXplPSIzIj5JbnN0cnVjdGlvbnM8L2ZvbnQ+PC9hPgogICAgPHRkPgogICAgICA8dGQudGl0bGU+Q29sbGF0aW9uIFZlcnNpb24tMi4xLjlkNwogICAgPHRkPgogICAgICA8cCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9IkNvbGxhdGlvbktleTI0Lmh0bWwiPjxmb250IHNpemU9IjMiPlNob3cgS2V5PC9mb250PjwvYT4KICA8L3RyPgoKCiAgICAgICAgCiAgICAgICAgLy8gaW5kZXgKICAgICAgICBvdXQucHJpbnQoIjx0YWJsZSB3aWR0aD0nMTAwJSc+PHRyPiIpOwogICAgICAgIG91dC5wcmludGxuKCI8dGQ+PHAgYWxpZ249J2xlZnQnPjxmb250IHNpemU9JzMnPjxhIGhyZWY9J2luZGV4Lmh0bWwnPkluc3RydWN0aW9uczwvYT48L2ZvbnQ+PC90ZD4iKTsKICAgICAgICBvdXQucHJpbnRsbigiPHRkPiIgKyBIVE1MU3RyaW5nKHRpdGxlKSArICIgVmVyc2lvbiIgKyB2ZXJzaW9uICsgIjwvdGQ+Iik7CiAgICAgICAgb3V0LnByaW50bG4oIjx0ZD48cCBhbGlnbj0ncmlnaHQnPjxmb250IHNpemU9JzMnPjxhIGhyZWY9JyIgKyBvdGhlciArIHBhZChjb3VudGVyKSArICIuaHRtbCc+IgogICAgICAgICAgICArIChzaG93ID8gIkhpZGUiIDogIlNob3ciKSArICIgS2V5PC9hPjwvdGQ+Iik7CiAgICAgICAgb3V0LnByaW50bG4oIjwvdHI+PC90YWJsZT4iKTsKICAgICAgICAKICAgICAgICBvdXQucHJpbnQoIjx0YWJsZSB3aWR0aD0nMTAwJSc+PHRyPiIpOwogICAgICAgIG91dC5wcmludCgiPHRkIHdpZHRoPScxJSc+PHAgYWxpZ249J2xlZnQnPiIpOwogICAgICAgIGlmIChjb3VudGVyID4gMCkgewogICAgICAgICAgICBvdXQucHJpbnQoIjxhIGhyZWY9JyIgKyB0aXRsZSArIHBhZChjb3VudGVyLTEpICsgIi5odG1sJz4mbHQ7Jmx0OzwvYT4iKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvdXQucHJpbnQoIjxmb250IGNvbG9yPScjOTk5OTk5Jz4mbHQ7Jmx0OzwvZm9udD4iKTsKICAgICAgICB9CiAgICAgICAgb3V0LnByaW50bG4oIjwvdGQ+Iik7CiAgICAgICAgb3V0LnByaW50bG4oIjx0ZD48cCBhbGlnbj0nY2VudGVyJz4iKTsKICAgICAgICBib29sZWFuIGxhc3RGYXIgPSBmYWxzZTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBlbmQ7ICsraSkgewogICAgICAgICAgICBib29sZWFuIGZhciA9IChpIDwgY291bnRlci0yIHx8IGkgPiBjb3VudGVyKzIpOwogICAgICAgICAgICBpZiAoZmFyICYmICgoaSAlIDUpICE9IDApICYmIChpICE9IGVuZCkpIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoaSAhPSAwICYmIGxhc3RGYXIgIT0gZmFyKSBvdXQucHJpbnQoIiAtICIpOwogICAgICAgICAgICBsYXN0RmFyID0gZmFyOwogICAgICAgICAgICBpZiAoaSAhPSBjb3VudGVyKSB7CiAgICAgICAgICAgICAgICBvdXQucHJpbnQoIjxhIGhyZWY9JyIgKyB0aXRsZSArIHBhZChpKSArICIuaHRtbCc+IiArIGkgKyAiPC9hPiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb3V0LnByaW50KCI8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+IiArIGkgKyAiPC9mb250PiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG91dC5wcmludGxuKCk7CiAgICAgICAgfQogICAgICAgIG91dC5wcmludGxuKCI8L3RkPiIpOwogICAgICAgIG91dC5wcmludGxuKCI8dGQgd2lkdGg9JzElJz48cCBhbGlnbj0ncmlnaHQnPiIpOwogICAgICAgIGlmIChjb3VudGVyIDwgZW5kKSB7CiAgICAgICAgICAgIG91dC5wcmludCgiPGEgaHJlZj0nIiArIHRpdGxlICsgcGFkKGNvdW50ZXIrMSkgKyAiLmh0bWwnPiZndDsmZ3Q7PC9hPiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG91dC5wcmludCgiPGZvbnQgY29sb3I9JyM5OTk5OTknPiZndDsmZ3Q7PC9mb250PiIpOwogICAgICAgIH0KICAgICAgICBvdXQucHJpbnRsbigiPC90ZD48L3RyPjwvdGFibGU+Iik7CiAgICAgICAgLy8gc3RhbmRhcmQgdGVtcGxhdGUhISEKICAgICAgICBvdXQucHJpbnRsbigiPC90ZD48L3RyPjx0cj48dGQ+PGJsb2NrcXVvdGU+Iik7CiAgICAgICAgLy9vdXQucHJpbnRsbigiPHA+PGRpdiBhbGlnbj0nY2VudGVyJz48Y2VudGVyPjx0YWJsZSBib3JkZXI9JzEnPjx0cj4iKTsKICAgICAgICByZXR1cm4gb3V0OwogICAgfQogICAgCiAgICBzdGF0aWMgaW50IGdldFN0cmVuZ3RoRGlmZmVyZW5jZShTdHJpbmcgb2xkLCBTdHJpbmcgbmV3U3RyKSB7CiAgICAgICAgaW50IHJlc3VsdCA9IDU7CiAgICAgICAgaW50IG1pbiA9IG9sZC5sZW5ndGgoKTsKICAgICAgICBpZiAobmV3U3RyLmxlbmd0aCgpIDwgbWluKSBtaW4gPSBuZXdTdHIubGVuZ3RoKCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW47ICsraSkgewogICAgICAgICAgICBjaGFyIGNoMSA9IG9sZC5jaGFyQXQoaSk7CiAgICAgICAgICAgIGNoYXIgY2gyID0gbmV3U3RyLmNoYXJBdChpKTsKICAgICAgICAgICAgaWYgKGNoMSAhPSBjaDIpIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBnZXQgZGlmZmVyZW5jZSBiZWZvcmUgd2UgZ2V0IDAwMDAuCiAgICAgICAgICAgIGlmIChjaDEgPT0gMCkgLS1yZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGlmIChuZXdTdHIubGVuZ3RoKCkgIT0gb2xkLmxlbmd0aCgpKSByZXR1cm4gMTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgICAgICAKICAgICAKICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIG5lZWRzWE1MUXVvdGUoU3RyaW5nIHNvdXJjZSwgYm9vbGVhbiBxdW90ZUFwb3MpIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGgoKTsgKytpKSB7CiAgICAgICAgICAgIGNoYXIgY2ggPSBzb3VyY2UuY2hhckF0KGkpOwogICAgICAgICAgICBpZiAoY2ggPCAnICcgfHwgY2ggPT0gJzwnIHx8IGNoID09ICcmJyB8fCBjaCA9PSAnPicpIHJldHVybiB0cnVlOwogICAgICAgICAgICBpZiAocXVvdGVBcG9zICYgY2ggPT0gJ1wnJykgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIGlmIChjaCA9PSAnXCInKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgaWYgKGNoID49ICdcdUQ4MDAnICYmIGNoIDw9ICdcdURGRkYnKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgaWYgKGNoID49ICdcdUZGRkUnKSByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTdHJpbmcoaW50W10gY3BzKSB7CiAgICAgICAgcmV0dXJuIFhNTEJhc2VTdHJpbmcoY3BzLCBjcHMubGVuZ3RoLCB0cnVlKTsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MU3RyaW5nKGludFtdIGNwcywgaW50IGxlbikgewogICAgICAgIHJldHVybiBYTUxCYXNlU3RyaW5nKGNwcywgbGVuLCB0cnVlKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTdHJpbmcoU3RyaW5nIHNvdXJjZSkgewogICAgICAgIHJldHVybiBYTUxCYXNlU3RyaW5nKHNvdXJjZSwgdHJ1ZSk7CiAgICB9ICAgICAgIAogICAgCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MU3RyaW5nKGludFtdIGNwcykgewogICAgICAgIHJldHVybiBYTUxCYXNlU3RyaW5nKGNwcywgY3BzLmxlbmd0aCwgZmFsc2UpOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MU3RyaW5nKGludFtdIGNwcywgaW50IGxlbikgewogICAgICAgIHJldHVybiBYTUxCYXNlU3RyaW5nKGNwcywgbGVuLCBmYWxzZSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTFN0cmluZyhTdHJpbmcgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIFhNTEJhc2VTdHJpbmcoc291cmNlLCBmYWxzZSk7CiAgICB9ICAgICAgIAogICAgCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxCYXNlU3RyaW5nKGludFtdIGNwcywgaW50IGxlbiwgYm9vbGVhbiBxdW90ZUFwb3MpIHsKICAgICAgICBTdHJpbmdCdWZmZXIgdGVtcCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgICAgIHRlbXAuYXBwZW5kKChjaGFyKWNwc1tpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBYTUxCYXNlU3RyaW5nKHRlbXAudG9TdHJpbmcoKSwgcXVvdGVBcG9zKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxCYXNlU3RyaW5nKFN0cmluZyBzb3VyY2UsIGJvb2xlYW4gcXVvdGVBcG9zKSB7CiAgICAgICAgaWYgKCFuZWVkc1hNTFF1b3RlKHNvdXJjZSwgcXVvdGVBcG9zKSkgcmV0dXJuIHNvdXJjZTsKICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aCgpOyArK2kpIHsKICAgICAgICAgICAgY2hhciBjaCA9IHNvdXJjZS5jaGFyQXQoaSk7CiAgICAgICAgICAgIGlmIChjaCA8ICcgJwogICAgICAgICAgICAgIHx8IGNoID49ICdcdTAwN0YnICYmIGNoIDw9ICdcdTAwOUYnCiAgICAgICAgICAgICAgfHwgY2ggPj0gJ1x1RDgwMCcgJiYgY2ggPD0gJ1x1REZGRicKICAgICAgICAgICAgICB8fCBjaCA+PSAnXHVGRkZFJykgewogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnXHVGRkZEJyk7CiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIjeCIpOwogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjcE5hbWUoY2gpKTsKICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIjsiKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlQXBvcyAmJiBjaCA9PSAnXCcnKSB7CiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImYXBvczsiKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXCInKSB7CiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImcXVvdDsiKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnPCcpIHsKICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiZsdDsiKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnJicpIHsKICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiZhbXA7Iik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7CiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImZ3Q7Iik7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjaCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogICAgfQogICAgCiAgICBzdGF0aWMgaW50IG1hcFRvU3RhcnRPZlJhbmdlKGludCBjaCkgewogICAgICAgIGlmIChjaCA8PSAweDM0MDApIHJldHVybiBjaDsgICAgICAgICAvLyBDSksgSWRlb2dyYXBoIEV4dGVuc2lvbiBBCiAgICAgICAgaWYgKGNoIDw9IDB4NERCNSkgcmV0dXJuIDB4MzQwMDsKICAgICAgICBpZiAoY2ggPD0gMHg0RTAwKSByZXR1cm4gY2g7ICAgICAgICAgLy8gQ0pLIElkZW9ncmFwaAogICAgICAgIGlmIChjaCA8PSAweDlGQTUpIHJldHVybiAweDRFMDA7CiAgICAgICAgaWYgKGNoIDw9IDB4QUMwMCkgcmV0dXJuIGNoOyAgICAgICAgIC8vIEhhbmd1bCBTeWxsYWJsZQogICAgICAgIGlmIChjaCA8PSAweEQ3QTMpIHJldHVybiAweEFDMDA7CiAgICAgICAgaWYgKGNoIDw9IDB4RDgwMCkgcmV0dXJuIGNoOyAgICAgICAgIC8vIE5vbiBQcml2YXRlIFVzZSBIaWdoIFN1cnJvZ2F0ZQogICAgICAgIGlmIChjaCA8PSAweERCN0YpIHJldHVybiAweEQ4MDA7CiAgICAgICAgaWYgKGNoIDw9IDB4REI4MCkgcmV0dXJuIGNoOyAgICAgICAgIC8vIFByaXZhdGUgVXNlIEhpZ2ggU3Vycm9nYXRlCiAgICAgICAgaWYgKGNoIDw9IDB4REJGRikgcmV0dXJuIDB4REI4MDsKICAgICAgICBpZiAoY2ggPD0gMHhEQzAwKSByZXR1cm4gY2g7ICAgICAgICAgLy8gTG93IFN1cnJvZ2F0ZQogICAgICAgIGlmIChjaCA8PSAweERGRkYpIHJldHVybiAweERDMDA7CiAgICAgICAgaWYgKGNoIDw9IDB4RTAwMCkgcmV0dXJuIGNoOyAgICAgICAgIC8vIFByaXZhdGUgVXNlCiAgICAgICAgaWYgKGNoIDw9IDB4RjhGRikgcmV0dXJuIDB4RTAwMDsKICAgICAgICBpZiAoY2ggPD0gMHhGMDAwMCkgcmV0dXJuIGNoOyAgICAgICAvLyBQbGFuZSAxNSBQcml2YXRlIFVzZQogICAgICAgIGlmIChjaCA8PSAweEZGRkZEKSByZXR1cm4gMHhGMDAwMDsKICAgICAgICBpZiAoY2ggPD0gMHgxMDAwMDApIHJldHVybiBjaDsgICAgICAgLy8gUGxhbmUgMTYgUHJpdmF0ZSBVc2UKICAgICAgICByZXR1cm4gMHgxMDAwMDA7CiAgICB9CiAgICAKKi8KfQ==