PGh0bWw+CjxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MSI+Cjxib2R5PgpUaGlzIHRlc3QgdmVyaWZpZXMgaGFuZGxpbmcgb2YgdGV4dCBlbmNvZGluZyBpbiB3b3JrZXJzLiBUaGUgYmVoYXZpb3IgbWF0Y2hlcyBGRjMuMWIyIHdpdGggYSBzaW5nbGUgZXhjbHVzaW9uIChzZWUgYmVsb3cpLjxicj4KVGhpcyBpcyB3aGF0J3MgdGVzdGVkOjxicj4KLSBJZiBodHRwIGhlYWRlciAnQ29udGVudC1UeXBlJyB3aXRoICdjaGFyc2V0JyBzcGVjaWZpZWQgaXMgb24gcmVzcG9uc2Ugd2l0aCB3b3JrZXIgc2NyaXB0IG9yIFhIUiBwYXlsb2FkLCB0aGF0IGVuY29kaW5nIGlzIHVzZWQuPGJyPgotIEluIGFic2VuY2Ugb2YgaHR0cCBoZWFkZXIsIHRoZSBzY3JpcHQgb2YgdGhlIHdvcmtlciBpcyBkZWNvZGVkIHVzaW5nIFVURi04Ljxicj4KLSBJbiBhYnNlbmNlIG9mIGh0dHAgaGVhZGVyLCB0aGUgY29udGVudCBvZiB0aGUgWEhSIHJlcXVlc3QgaXMgZGVjb2RlZCB1c2luZyBVVEYtOC48YnI+Ci0gVGhlIFVSTHMgdXNlZCBpbiB3b3JrZXJzIChmb3Igc3Vid29ya2VycyBvciBYSFIpIGFyZSBhbHdheXMgZW5jb2RlZCB1c2luZyBVVEYtOCAoaW4gcmVndWxhciBodG1sIGRvY3VtZW50cyBwYXJ0cyBvZiB0aGUgcXVlcnkgYW4gaGFzaCBtYXkgYmUgZW5jb2RlZCB3aXRoIG90aGVyIGVuY29kaW5ncykuPGJyPgotIFRoZSBiYXNlIFVSTCBmb3IgdGhlIHdvcmtlciAodXNlZCB0byByZXNvbHZlIHJlbGF0aXZlIFVSTHMgZm9yIHN1YndvcmtlcnMgYW5kIFhIUikgaXMgdGhlIFVSTCBvZiBpdHMgc2NyaXB0Ljxicj4KLSBpbXBvcnRTY3JpcHRzKCkgZGVjb2RlcyB0aGUgc2NyaXB0cyB1c2luZyBVVEYtOC48YnI+Cgo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOmJlaWdlOyBwYWRkaW5nOjEwcHg7IiBpZD0ic3RhdHVzIj48L2Rpdj4KCjxzY3JpcHQ+CmlmICh3aW5kb3cudGVzdFJ1bm5lcikgewogICAgdGVzdFJ1bm5lci5kdW1wQXNUZXh0KCk7CiAgICB0ZXN0UnVubmVyLndhaXRVbnRpbERvbmUoKTsKfQoKLy8gV2FpdCBmb3IgdGhpcyBtYW55IHdvcmtlcnMgdG8gZmluaXNoIHRoZWlyIHRlc3RzLgovLyBXaGVuIHdvcmtlciBpcyBkb25lLCBpdCBzZW5kcyAnZXhpdCcgbWVzc2FnZS4KdmFyIHdvcmtlckNvdW50ID0gMjsKCi8vIE1lc3NhZ2VzIGZyb20gd29ya2VycyBpbiBzZXBhcmF0ZSB0aHJlYWRzIHdpbGwgY29tZSBpbiB1bnN0YWJsZSBvcmRlci4gU29ydCB0aGVtIHRvIGhhdmUgYSBzdGFibGUgdGVzdC4KdmFyIHN0YXR1c1N0cmluZ3MgPSBuZXcgQXJyYXk7CgpmdW5jdGlvbiBmaW5pc2hUZXN0KCkKewogICAgc3RhdHVzU3RyaW5ncy5zb3J0KCk7CiAgICB2YXIgc3RhdHVzX3BhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN0YXR1cyIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0dXNTdHJpbmdzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgc3RhdHVzX3BhbmVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHN0YXR1c1N0cmluZ3NbaV0pKTsKICAgICAgICBzdGF0dXNfcGFuZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7CiAgICB9CiAgICBpZiAod2luZG93LnRlc3RSdW5uZXIpCiAgICAgICAgdGVzdFJ1bm5lci5ub3RpZnlEb25lKCk7Cn0KCmZ1bmN0aW9uIGxvZyhzb3VyY2UsIG1zZykKewogICAgc3RhdHVzU3RyaW5ncy5wdXNoKHNvdXJjZSArICI6ICIgKyBtc2cpOwoKICAgIGlmIChtc2cgPT0gImV4aXQiICYmIC0td29ya2VyQ291bnQgPT0gMCkKICAgICAgICBmaW5pc2hUZXN0KCk7Cn0gCgovLyBPdXRwdXQgY3VycmVudCBjaGFyc2V0IGFuZCBhIHN0cmluZyBpbiB0aGF0IGVuY29kaW5nIHRvIG1ha2UKLy8gc3VyZSB0aGlzIGRvY3VtZW50IGlzIGRlY29kZWQgYXMgV2luZG93cy0xMjUxLgpsb2coIkRvY3VtZW50IGVuY29kaW5nIiwgZG9jdW1lbnQuaW5wdXRFbmNvZGluZyk7CmxvZygiRG9jdW1lbnQiLCAiz/Du4uXw6uAiKTsKCmxvZygiRG9jdW1lbnQsIFdvcmtlcnMiLCAiQWxsIFhIUiByZXNwb25zZXMgc2hvdWxkIG1hdGNoIHRoaXM6ICIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4NDFGLCAweDQ0MCwgMHg0MzgsIDB4NDMyLCAweDQzNSwgMHg0NDIpKTsKCi8vIFJ1biBhIHdvcmtlciB3L28gaHR0cCBoZWFkZXIuIEl0IHNob3VsZCBpbmhlcml0IHRoZSBlbmNvZGluZyBvZiB0aGUgZG9jdW1lbnQuCnZhciB3b3JrZXIxID0gbmV3IFdvcmtlcigicmVzb3VyY2VzL3dvcmtlci1lbmNvZGVkLnB5Iik7CndvcmtlcjEub25tZXNzYWdlID0gZnVuY3Rpb24oZXZ0KSB7IGxvZygid29ya2VyIDEiLCBldnQuZGF0YSk7IH07CgovLyBSdW4gYSB3b3JrZXIgd2l0aCBodHRwIGhlYWRlciBzcGVjaWZ5aW5nIGNoYXJzZXQuIFRoaXMgbmV3IGNoYXJzZXQgc2hvdWxkIGJlIGluIGVmZmVjdC4KdmFyIHdvcmtlcjIgPSBuZXcgV29ya2VyKCJyZXNvdXJjZXMvd29ya2VyLWVuY29kZWQucHk/Y2hhcnNldD1rb2k4LXIiKTsKd29ya2VyMi5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldnQpIHsgbG9nKCJ3b3JrZXIgMiIsIGV2dC5kYXRhKTsgfTsKCi8vIFJlcXVlc3Qgc29tZSBjb250ZW50LiBJdCBzaG91bGQgYmUgZGVjb2RlZCB1c2luZyBVVEYtOCBldmVuIHRob3VnaCBjdXJyZW50IGRvY3VtZW50IGlzIFdpbmRvd3MtMTI1MS4KdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO3hoci5vcGVuKCJHRVQiLCAicmVzb3VyY2VzL3hoci1yZXNwb25zZS5weSIsIGZhbHNlKTsKeGhyLnNlbmQoKTtsb2coIkRvY3VtZW50OiAiLCB4aHIucmVzcG9uc2VUZXh0KTsKCjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4KCiAgICAK