PG1ldGEgY2hhcnNldD0ia29pOC1yIj4KPGJvZHk+CjxwPlRlc3QgdGhhdCBpc28tODg1OS0xIGFsaWFzZXMgdGhhdCBhcmVuJ3Qga25vd24gdG8gRmlyZWZveCBhbmQgSUUgYXJlbid0IHN1cHBvcnRlZAood2Ugc2hvdWxkIGZhbGwgYmFjayB0byBwYXJlbnQgZnJhbWUgY2hhcnNldCkuPC9wPgo8cCBpZD1yZXN1bHQ+VGVzdGluZy4uLjwvcD4KPHNjcmlwdD4KaWYgKHdpbmRvdy50ZXN0UnVubmVyKSB7CiAgICB0ZXN0UnVubmVyLndhaXRVbnRpbERvbmUoKTsKICAgIHRlc3RSdW5uZXIuZHVtcEFzVGV4dCgpOwp9Cgp2YXIgYWxpYXNlcyA9IFsKICAgICJmb29iYXIiLCAvLyBEZWZpbml0ZWx5IHVua25vd24sIHZlcmlmeSB0aGF0IGNoYXJzZXQgaW5oZXJpdGFuY2Ugd29ya3MuCiAgICAiODg1OV8xIiwgLy8gPHJkYXI6Ly9wcm9ibGVtLzc4NTkwNjg+CiAgICAiSVNPODg1OV8xIiwgLy8gPHJkYXI6Ly9wcm9ibGVtLzc4NjMzOTk+CiAgICAiODg1OS0xIiwgLy8gV2ViS2l0IHVzZWQgdG8gc3BlY2lmaWNhbGx5IGFkZCB0aGlzIGFsaWFzIG5hbWUsIGJ1dCBvdGhlciBicm93c2VycyBkb24ndCBzdXBwb3J0IGl0LgogICAgIklTT18yMDIyLGxvY2FsZT1qYSx2ZXJzaW9uPTAiLCAvLyBXZSBuZXZlciB3YW50IHZlcnNpb25lZCBhbGlhcyBuYW1lcywgb3RoZXIgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCB0aGVzZS4KICAgICJ1dGYgOCIsIC8vIE90aGVyIHdlaXJkIHZhcmlhdGlvbnMKICAgICJ1dGZfOCIsCiAgICAiODg1OSAxIiwKICAgICI4ODU5KjEiLAogICAgIjg4NTk6MSIsCiAgICAiODg1OTEiLAogICAgIklTT184ODU5MSIsCiAgICAiSVNPLTg4NTkxIiwKICAgICJJU08tODgtNTktMSIsCiAgICAibGF0aW4tMSIgLy8gWWVzLCBpdCdzICJsYXRpbjEiIHdpdGhvdXQgYSBkYXNoIC0gbmVpdGhlciBJRSBub3IgRmlyZWZveCBzdXBwb3J0ICJsYXRpbi0xIi4KXTsKICAgIApmb3IgKGkgPSAwOyBpIDwgYWxpYXNlcy5sZW5ndGg7ICsraSkgewogICAgdmFyIGlmciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwogICAgaWZyLnNldEF0dHJpYnV0ZSgic3JjIiwgInJlc291cmNlcy9iYWQtY2hhcnNldC1hbGlhcy5weT9jaGFyc2V0PSIgKyBhbGlhc2VzW2ldKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZyKTsKfQoKdmFyIGZyYW1lc0xlZnQgPSBhbGlhc2VzLmxlbmd0aDsKZnVuY3Rpb24gZnJhbWVMb2FkZWQoKQp7CiAgICBpZiAoIS0tZnJhbWVzTGVmdCkgewogICAgICAgIHZhciBmYWlsdXJlcyA9ICIiOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhbGlhc2VzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgIHZhciBpZnIgPSBmcmFtZXNbaV07CiAgICAgICAgICAgIGlmIChpZnIuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3QiKS5pbm5lckhUTUwgIT0gIlNV8/PlU1MiKQogICAgICAgICAgICAgICAgZmFpbHVyZXMgKz0gaWZyLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaGFyc2V0IikuaW5uZXJIVE1MICsgIiAiOwogICAgICAgIH0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVzdWx0IikuaW5uZXJIVE1MID0gIWZhaWx1cmVzLmxlbmd0aCA/ICJTVUNDRVNTIiA6IAogICAgICAgICAgICAoIkZBSUw6ICIgKyBmYWlsdXJlcyk7CiAgICAgICAgaWYgKHdpbmRvdy50ZXN0UnVubmVyKQogICAgICAgICAgICB0ZXN0UnVubmVyLm5vdGlmeURvbmUoKTsKICAgIH0KfQo8L3NjcmlwdD4KPC9ib2R5Pgo=