PGh0bWw+CjxoZWFkPgo8dGl0bGU+VGVzdCBmb3IgUmFuZ2UuY29tcGFyZVBvaW50KCk8L3RpdGxlPgo8c2NyaXB0PgpmdW5jdGlvbiB0ZXN0KCkgCnsKICAgIC8vIGNvbXBhcmVQb2ludCggcmVmTm9kZSwgb2Zmc2V0ICkgLSBUaGlzIG1ldGhvZCByZXR1cm5zINAxLCAwIG9yIDEgZGVwZW5kaW5nIG9uIAogICAgLy8gaWYgdGhlIHBvaW50IGRlc2NyaWJlZCBieSB0aGUgcmVmTm9kZSBub2RlIGFuZCBhbiBvZmZzZXQgd2l0aGluIHRoZSBub2RlIGlzIAogICAgLy8gYmVmb3JlLCBzYW1lIGFzLCBvciBhZnRlciB0aGUgcmFuZ2UgcmVzcGVjdGl2ZWx5LgogICAgCiAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOyAgIAoKICAgIC8vIHRlc3QgMSAtIHBvaW50IGJlZm9yZSByYW5nZSwgZGlmZmVyZW50IG5vZGUKICAgIHZhciBleHBlY3RlZFJlc3VsdCA9IC0xOwogICAgcmFuZ2Uuc2VsZWN0Tm9kZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYTIiKSk7CiAgICB2YXIgcmVzdWx0ID0gcmFuZ2UuY29tcGFyZVBvaW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJiMSIpLCAxKTsKICAgIGlmIChyZXN1bHQgPT0gZXhwZWN0ZWRSZXN1bHQpIAogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0MSIpLmlubmVySFRNTCA9ICJ0ZXN0IDEgcGFzc2VkIjsKICAgICAgICAKICAgIC8vIHRlc3QgMiAtIHBvaW50IGJlZm9yZSByYW5nZSwgc2FtZSBub2RlCiAgICByYW5nZS5zZXRTdGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYjIiKSwgMSk7CiAgICByZXN1bHQgPSByYW5nZS5jb21wYXJlUG9pbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImIyIiksIDApOwogICAgaWYgKHJlc3VsdCA9PSBleHBlY3RlZFJlc3VsdCkKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVzdDIiKS5pbm5lckhUTUwgPSAidGVzdCAyIHBhc3NlZCI7ICAgIAogICAgICAgIAogICAgLy8gdGVzdCAzIC0gcG9pbnQgb24gcmFuZ2Ugc3RhcnQgYm91bmRhcnkKICAgIGV4cGVjdGVkUmVzdWx0ID0gMDsKICAgIHJhbmdlLnNlbGVjdE5vZGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImIyIikpOwogICAgcmVzdWx0ID0gcmFuZ2UuY29tcGFyZVBvaW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJiMiIpLCAwKTsKICAgIGlmIChyZXN1bHQgPT0gZXhwZWN0ZWRSZXN1bHQpIAogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0MyIpLmlubmVySFRNTCA9ICJ0ZXN0IDMgcGFzc2VkIjsKICAgICAgICAgICAgCiAgICAvLyB0ZXN0IDQgLSBwb2ludCB3aXRoaW4gcmFuZ2UsIHNhbWUgbm9kZQogICAgcmVzdWx0ID0gcmFuZ2UuY29tcGFyZVBvaW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJiMiIpLCAxKTsKICAgIGlmIChyZXN1bHQgPT0gZXhwZWN0ZWRSZXN1bHQpCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Q0IikuaW5uZXJIVE1MID0gInRlc3QgNCBwYXNzZWQiOwogICAgICAgICAgICAKICAgIC8vIHRlc3QgNSAtIHBvaW50IHdpdGhpbiByYW5nZSwgc3BhbnMgbm9kZXMKICAgIHJhbmdlLnNldFN0YXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJiMSIpLCAxKTsKICAgIHJhbmdlLnNldEVuZChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYzIiKSwgMSk7CiAgICByZXN1bHQgPSByYW5nZS5jb21wYXJlUG9pbnQoIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjMiIpLCAwKTsKICAgIGlmIChyZXN1bHQgPT0gZXhwZWN0ZWRSZXN1bHQpIAogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0NSIpLmlubmVySFRNTCA9ICJ0ZXN0IDUgcGFzc2VkIjsgICAgCgogICAgLy8gdGVzdCA2IC0gcG9pbnQgb24gcmFuZ2UgZW5kIGJvdW5kYXJ5CiAgICByZXN1bHQgPSByYW5nZS5jb21wYXJlUG9pbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMyIiksIDEpOwogICAgaWYgKHJlc3VsdCA9PSBleHBlY3RlZFJlc3VsdCkgCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Q2IikuaW5uZXJIVE1MID0gInRlc3QgNiBwYXNzZWQiOyAgICAKCiAgICAvLyB0ZXN0IDcgLSBwb2ludCBhZnRlciByYW5nZSwgc2FtZSBub2RlCiAgICByYW5nZS5zZXRFbmQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMyIiksIDApOwogICAgZXhwZWN0ZWRSZXN1bHQgPSAxOwogICAgcmVzdWx0ID0gcmFuZ2UuY29tcGFyZVBvaW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjMiIpLCAxKTsKICAgIGlmIChyZXN1bHQgPT0gZXhwZWN0ZWRSZXN1bHQpIAogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0NyIpLmlubmVySFRNTCA9ICJ0ZXN0IDcgcGFzc2VkIjsgICAgCgogICAgLy8gdGVzdCA4IC0gcG9pbnQgYWZ0ZXIgcmFuZ2UsIGRpZmZlcmVudCBub2RlCiAgICBleHBlY3RlZFJlc3VsdCA9IDE7CiAgICByZXN1bHQgPSByYW5nZS5jb21wYXJlUG9pbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImEzIiksIDEpOwogICAgaWYgKHJlc3VsdCA9PSBleHBlY3RlZFJlc3VsdCkgCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Q4IikuaW5uZXJIVE1MID0gInRlc3QgOCBwYXNzZWQiOyAKICAgICAgICAKICAgIC8vIHRlc3QgOSAtIGRldGFjaGVkIHJhbmdlLCBhdHRhY2hlZCBub2RlCiAgICAvLyBkZXRhY2goKSBpcyBhIG5vLW9wLgogICAgZXhwZWN0ZWRSZXN1bHQgPSAxOwogICAgdmFyIGRldGFjaGVkUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgZGV0YWNoZWRSYW5nZS5kZXRhY2goKTsKICAgIHJlc3VsdCA9IGRldGFjaGVkUmFuZ2UuY29tcGFyZVBvaW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhMSIpLCAwKTsKICAgIGlmIChyZXN1bHQgPT0gZXhwZWN0ZWRSZXN1bHQpCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Q5IikuaW5uZXJIVE1MID0gInRlc3QgOSBwYXNzZWQiOyAKICAgICAgICAKICAgIC8vIHRlc3QgMTAgLSBhdHRhY2hlZCByYW5nZSwgZGV0YWNoZWQgbm9kZQogICAgLy8gZmlyZWZveCB0aHJvd3MgYW4gZXhjZXB0aW9uCiAgICByYW5nZS5zZWxlY3ROb2RlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhMSIpKTsKICAgIHZhciBub2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImIxIik7CiAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICB0cnkgewogICAgICAgIHJhbmdlLmNvbXBhcmVQb2ludChub2RlLCAwKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVzdDEwIikuaW5uZXJIVE1MID0gInRlc3QgMTAgcGFzc2VkIjsgCiAgICB9CiAgICAgICAgCiAgICBpZiAod2luZG93LnRlc3RSdW5uZXIpCiAgICAgICAgdGVzdFJ1bm5lci5kdW1wQXNUZXh0KCk7Cn0KCjwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5IG9ubG9hZD0idGVzdCgpOyI+Cgo8IS0tIHZpc2libGUgYXJlYSB3aXRoIHRlc3QgcmVzdWx0cyAtLT4KPGRpdiBpZD10ZXN0MT48c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPnRlc3QgMSBmYWlsZWQ8L3NwYW4+PC9kaXY+PGJyPgo8ZGl2IGlkPXRlc3QyPjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+dGVzdCAyIGZhaWxlZDwvc3Bhbj48L2Rpdj48YnI+CjxkaXYgaWQ9dGVzdDM+PHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij50ZXN0IDMgZmFpbGVkPC9zcGFuPjwvZGl2Pjxicj4KPGRpdiBpZD10ZXN0ND48c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPnRlc3QgNCBmYWlsZWQ8L3NwYW4+PC9kaXY+PGJyPgo8ZGl2IGlkPXRlc3Q1PjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+dGVzdCA1IGZhaWxlZDwvc3Bhbj48L2Rpdj48YnI+CjxkaXYgaWQ9dGVzdDY+PHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij50ZXN0IDYgZmFpbGVkPC9zcGFuPjwvZGl2Pjxicj4KPGRpdiBpZD10ZXN0Nz48c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPnRlc3QgNyBmYWlsZWQ8L3NwYW4+PC9kaXY+PGJyPgo8ZGl2IGlkPXRlc3Q4PjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+dGVzdCA4IGZhaWxlZDwvc3Bhbj48L2Rpdj48YnI+CjxkaXYgaWQ9dGVzdDk+PHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij50ZXN0IDkgZmFpbGVkPC9zcGFuPjwvZGl2Pjxicj4KPGRpdiBpZD10ZXN0MTA+PHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij50ZXN0IDEwIGZhaWxlZDwvc3Bhbj48L2Rpdj48YnI+Cgo8IS0tIGhpZGRlbiBhcmVhIHRvIGNyZWF0ZSB0aGUgcmFuZ2VzIGJlaW5nIHRlc3RlZCAtLT4KPGRpdiBzdHlsZT0idmlzaWJpbGl0eTogaGlkZGVuIj4KICAgIDxkaXYgaWQ9YTE+YTEKICAgIDxkaXYgaWQ9YjE+YjE8L2Rpdj4gPGRpdiBpZD1jMT5jMTwvZGl2PgogICAgPC9kaXY+CiAgICAKICAgIDxkaXYgaWQ9YTI+YTIKICAgIDxkaXYgaWQ9YjI+YjI8L2Rpdj4gPGRpdiBpZD1jMj5jMjwvZGl2PgogICAgPC9kaXY+CiAgICAKICAgIDxkaXYgaWQ9YTM+YTMKICAgIDxkaXYgaWQ9YjM+YjM8L2Rpdj4gPGRpdiBpZD1jMz5jMzwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPC9ib2R5Pgo8L2h0bWw+Cg==