CjxodG1sPgo8aGVhZD4KPG1ldGEgY2hhcnNldD0iSVNPLTg4NTktOCI+CjxzdHlsZT4KKltkaXJdIHsgdW5pY29kZS1iaWRpOiBlbWJlZCB9Cjwvc3R5bGU+Cjxib2R5Pgo8cD5UZXN0IHJlbmRlcmluZyBvZiBJU08tODg1OS04Lgo8cD4KPGRpdiBjbGFzcz0idGVzdCI++fDhPC9kaXY+CjxkaXYgY2xhc3M9InRlc3QiPvnw4SDi9+sgPC9kaXY+CjxkaXYgY2xhc3M9InRlc3QiPvnw4SBhYmMg4vfrPC9kaXY+CjxkaXYgY2xhc3M9InRlc3QiPmFiYyD58OEgZGVmPC9kaXY+CjxkaXYgY2xhc3M9InRlc3QiPvnw4SA8c3BhbiBkaXI9bHRyPuL36zwvc3Bhbj48L2Rpdj4KPGRpdiBjbGFzcz0idGVzdCI++fDhIDxzcGFuIGRpcj1ydGw+4vfrPC9zcGFuPjwvZGl2Pgo8dWwgaWQ9ImNvbnNvbGUiIGRpcj1sdHI+PC91bD4KCjxzY3JpcHQgc3JjPSIuLi8uLi8uLi9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0Pgo8c2NyaXB0PiAKICAgIHZhciBzdWNjZWVkID0gdHJ1ZTsKCiAgICBmdW5jdGlvbiBjaGVja0NsaWVudFJlY3QodGVzdCwgaW5kZXgsIG9mZnNldCwgZGlyLCBjaGFyKQogICAgewogICAgICAgIGlmICh0ZXN0Lm5vZGVUeXBlID09IDMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXN0LnRleHRDb250ZW50Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydCh0ZXN0LCBpKTsKICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZCh0ZXN0LCBpKzEpOyAKICAgICAgICAgICAgICAgIHJlY3RzID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTsKICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gImx0ciIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVjdHNbMF0ubGVmdCA8IG9mZnNldCkgewogICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RmFpbGVkKCJUZXN0ICIgKyBpbmRleCArICIgTFRSOiBjaGFyYWN0ZXIgIiArIHJhbmdlLnRvU3RyaW5nKCkgKyAiIHNob3VsZCBiZSByZW5kZXJlZCByaWdodCBvZiAiICsgY2hhcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2NlZWQgPSBmYWxzZTsKICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3RzWzBdLmxlZnQgPiBvZmZzZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZhaWxlZCgiVGVzdCAiICsgaW5kZXggKyAiIFJUTDogY2hhcmFjdGVyICIgKyByYW5nZS50b1N0cmluZygpICsgIiBzaG91bGQgYmUgcmVuZGVyZWQgbGVmdCBvZiAiICsgY2hhcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2NlZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvZmZzZXQgPSByZWN0c1swXS5sZWZ0OwogICAgICAgICAgICAgICAgY2hhciA9IHJhbmdlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSBlbHNlIGlmICh0ZXN0Lm5vZGVUeXBlID09IDEpIHsKICAgICAgICAgICAgZm9yICh2YXIgbm9kZSA9IHRlc3QuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpIHsKICAgICAgICAgICAgICAgIGNoZWNrQ2xpZW50UmVjdChub2RlLCBpbmRleCwgb2Zmc2V0LCBkaXIsIGNoYXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgICAgICAgICAKICAgIGlmICh3aW5kb3cudGVzdFJ1bm5lcikKICAgICAgICB0ZXN0UnVubmVyLmR1bXBBc1RleHQoKTsKICAgICAgICAKICAgIHZhciB0ZXN0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3Rlc3QnKTsKICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3RzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgY2hlY2tDbGllbnRSZWN0KHRlc3RzW2ldLCBpLCAtMSwgImx0ciIsICIgIik7CgogICAgICAgIHRlc3RzW2ldLnN0eWxlLmRpcmVjdGlvbiA9ICJydGwiOwogICAgICAgIGNoZWNrQ2xpZW50UmVjdCh0ZXN0c1tpXSwgaSwgMTAwMDAsICJydGwiLCAiICIpOwogICAgCiAgICAgICAgdGVzdHNbaV0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIH0KICAgIGlmIChzdWNjZWVkID09IHRydWUpIAogICAgICAgIHRlc3RQYXNzZWQoIlRlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIpOwo8L3NjcmlwdD4gCjwvYm9keT4KPC9odG1sPgo=