PGh0bWw+CjxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MSI+Cjxib2R5PgpUaGlzIHRlc3QgdmVyaWZpZXMgaGFuZGxpbmcgb2YgdGV4dCBlbmNvZGluZyBpbiB3b3JrZXJzLiBUaGUgYmVoYXZpb3IgbWF0Y2hlcyBGRjMuMWIyIHdpdGggYSBzaW5nbGUgZXhjbHVzaW9uIChzZWUgYmVsb3cpLjxicj4KVGhpcyBpcyB3aGF0J3MgdGVzdGVkOjxicj4KLSBJZiBodHRwIGhlYWRlciAnQ29udGVudC1UeXBlJyB3aXRoICdjaGFyc2V0JyBzcGVjaWZpZWQgaXMgb24gcmVzcG9uc2Ugd2l0aCB3b3JrZXIgc2NyaXB0IG9yIFhIUiBwYXlsb2FkLCB0aGF0IGVuY29kaW5nIGlzIHVzZWQuPGJyPgotIEluIGFic2VuY2Ugb2YgaHR0cCBoZWFkZXIsIHRoZSBzY3JpcHQgb2YgdGhlIHdvcmtlciBpcyBkZWNvZGVkIHVzaW5nIFVURi04Ljxicj4KLSBJbiBhYnNlbmNlIG9mIGh0dHAgaGVhZGVyLCB0aGUgY29udGVudCBvZiB0aGUgWEhSIHJlcXVlc3QgaXMgZGVjb2RlZCB1c2luZyBVVEYtOC48YnI+Ci0gVGhlIFVSTHMgdXNlZCBpbiB3b3JrZXJzIChmb3Igc3Vid29ya2VycyBvciBYSFIpIGFyZSBhbHdheXMgZW5jb2RlZCB1c2luZyBVVEYtOCAoaW4gcmVndWxhciBodG1sIGRvY3VtZW50cyBwYXJ0cyBvZiB0aGUgcXVlcnkgYW4gaGFzaCBtYXkgYmUgZW5jb2RlZCB3aXRoIG90aGVyIGVuY29kaW5ncykuPGJyPgotIFRoZSBiYXNlIFVSTCBmb3IgdGhlIHdvcmtlciAodXNlZCB0byByZXNvbHZlIHJlbGF0aXZlIFVSTHMgZm9yIHN1YndvcmtlcnMgYW5kIFhIUikgaXMgdGhlIFVSTCBvZiBpdHMgc2NyaXB0Ljxicj4KLSBpbXBvcnRTY3JpcHRzKCkgZGVjb2RlcyB0aGUgc2NyaXB0cyB1c2luZyBVVEYtOC48YnI+Cgo8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOmJlaWdlOyBwYWRkaW5nOjEwcHg7IiBpZD0ic3RhdHVzIj48L2Rpdj4KCjxzY3JpcHQ+CmlmICh3aW5kb3cudGVzdFJ1bm5lcikgewogICAgdGVzdFJ1bm5lci5kdW1wQXNUZXh0KCk7CiAgICB0ZXN0UnVubmVyLndhaXRVbnRpbERvbmUoKTsKfQoKLy8gV2FpdCBmb3IgdGhpcyBtYW55IHdvcmtlcnMgdG8gZmluaXNoIHRoZWlyIHRlc3RzLgovLyBXaGVuIHdvcmtlciBpcyBkb25lLCBpdCBzZW5kcyAnZXhpdCcgbWVzc2FnZS4KdmFyIHdvcmtlckNvdW50ID0gMjsKCi8vIE1lc3NhZ2VzIGZyb20gd29ya2VycyBpbiBzZXBhcmF0ZSB0aHJlYWRzIHdpbGwgY29tZSBpbiB1bnN0YWJsZSBvcmRlci4gU29ydCB0aGVtIHRvIGhhdmUgYSBzdGFibGUgdGVzdC4KdmFyIHN0YXR1c1N0cmluZ3MgPSBuZXcgQXJyYXk7CgpmdW5jdGlvbiBmaW5pc2hUZXN0KCkKewogICAgc3RhdHVzU3RyaW5ncy5zb3J0KCk7CiAgICB2YXIgc3RhdHVzX3BhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN0YXR1cyIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0dXNTdHJpbmdzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgc3RhdHVzX3BhbmVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHN0YXR1c1N0cmluZ3NbaV0pKTsKICAgICAgICBzdGF0dXNfcGFuZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7CiAgICB9CiAgICBpZiAod2luZG93LnRlc3RSdW5uZXIpCiAgICAgICAgdGVzdFJ1bm5lci5ub3RpZnlEb25lKCk7Cn0KCmZ1bmN0aW9uIGxvZyhzb3VyY2UsIG1zZykKewogICAgc3RhdHVzU3RyaW5ncy5wdXNoKHNvdXJjZSArICI6ICIgKyBtc2cpOwoKICAgIGlmIChtc2cgPT0gImV4aXQiICYmIC0td29ya2VyQ291bnQgPT0gMCkKICAgICAgICBmaW5pc2hUZXN0KCk7Cn0gCgovLyBPdXRwdXQgY3VycmVudCBjaGFyc2V0IGFuZCBhIHN0cmluZyBpbiB0aGF0IGVuY29kaW5nIHRvIG1ha2UKLy8gc3VyZSB0aGlzIGRvY3VtZW50IGlzIGRlY29kZWQgYXMgV2luZG93cy0xMjUxLgpsb2coIkRvY3VtZW50IGVuY29kaW5nIiwgZG9jdW1lbnQuaW5wdXRFbmNvZGluZyk7CmxvZygiRG9jdW1lbnQiLCAiz/Du4uXw6uAiKTsKCmxvZygiRG9jdW1lbnQsIFdvcmtlcnMiLCAiQWxsIFhIUiByZXNwb25zZXMgc2hvdWxkIG1hdGNoIHRoaXM6ICIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4NDFGLCAweDQ0MCwgMHg0MzgsIDB4NDMyLCAweDQzNSwgMHg0NDIpKTsKCi8vIFJ1biBhIHdvcmtlciB3L28gaHR0cCBoZWFkZXIuIEl0IHNob3VsZCBpbmhlcml0IHRoZSBlbmNvZGluZyBvZiB0aGUgZG9jdW1lbnQuCnZhciB3b3JrZXIxID0gbmV3IFdvcmtlcigicmVzb3VyY2VzL3dvcmtlci1lbmNvZGVkLnBocCIpOwp3b3JrZXIxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2dCkgeyBsb2coIndvcmtlciAxIiwgZXZ0LmRhdGEpOyB9OwoKLy8gUnVuIGEgd29ya2VyIHdpdGggaHR0cCBoZWFkZXIgc3BlY2lmeWluZyBjaGFyc2V0LiBUaGlzIG5ldyBjaGFyc2V0IHNob3VsZCBiZSBpbiBlZmZlY3QuCnZhciB3b3JrZXIyID0gbmV3IFdvcmtlcigicmVzb3VyY2VzL3dvcmtlci1lbmNvZGVkLnBocD9jaGFyc2V0PWtvaTgtciIpOwp3b3JrZXIyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2dCkgeyBsb2coIndvcmtlciAyIiwgZXZ0LmRhdGEpOyB9OwoKLy8gUmVxdWVzdCBzb21lIGNvbnRlbnQuIEl0IHNob3VsZCBiZSBkZWNvZGVkIHVzaW5nIFVURi04IGV2ZW4gdGhvdWdoIGN1cnJlbnQgZG9jdW1lbnQgaXMgV2luZG93cy0xMjUxLgp2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7eGhyLm9wZW4oIkdFVCIsICJyZXNvdXJjZXMveGhyLXJlc3BvbnNlLnBocCIsIGZhbHNlKTsKeGhyLnNlbmQoKTtsb2coIkRvY3VtZW50OiAiLCB4aHIucmVzcG9uc2VUZXh0KTsKCjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4KCiAgICAK