Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENvcHlyaWdodCAoQykgTWljcm9zb2Z0LiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuIFNlZSBMSUNFTlNFLnR4dCBmaWxlIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbi4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpXU2NyaXB0LkxvYWRTY3JpcHRGaWxlKCIuLlxcVW5pdFRlc3RGcmFtZXdvcmtcXFVuaXRUZXN0RnJhbWV3b3JrLmpzIik7CnZhciB4ID0gV1NjcmlwdC5Mb2FkU2NyaXB0RmlsZSgiY3Jvc3NDb250ZXh0X3JlbW90ZUNvbnRleHQuanMiLCAic2FtZXRocmVhZCIpOwoKdmFyIHRlc3RzID0gewogIHRlc3QwMTogewogICAgbmFtZTogIk1ha2Ugc3VyZSB3aGVuIGNhbGxlZCB3aXRoIC1ub25hdGl2ZSwgbWFyc2hhbGluZyBvZiByZXN1bHRzIGlzIGNvcnJlY3QgKFdpbjggNjI4ODA4KSIsCiAgICBib2R5OiBmdW5jdGlvbigpIHsKICAgICAgLy8g0WFsbCB0aGlzIHdpdGggLW5vbmF0aXZlCiAgICAgIC8vIFdpbjggNjI4ODA4OiB0aGUgZm9sbG93aW5nIGNhc2VzIHVzZWQgdG8gY2F1c2UgYW4gYXNzZXJ0aW9uLgogICAgICB2YXIgc3RyID0gInRoaXMgaXMgYSBzdGluZyI7CgogICAgICB2YXIgcmVzdWx0ID0gc3RyLm1hdGNoKHgucmUpOwogICAgICB2YXIgcmVzdWx0ID0gc3RyLnJlcGxhY2UoeC5yZSwgbnVsbCk7CiAgICAgIHZhciByZXN1bHQgPSBzdHIuc3BsaXQoeC5yZSwgMSk7CiAgICAgIHZhciByZXN1bHQgPSBzdHIuc2VhcmNoKHgucmUpOwoKICAgICAgdmFyIHJlc3VsdCA9IHguc3RyLm1hdGNoKHgucmUpOwogICAgICB2YXIgcmVzdWx0ID0geC5zdHIucmVwbGFjZSh4LnJlLCBudWxsKTsKICAgICAgdmFyIHJlc3VsdCA9IHguc3RyLnNwbGl0KHgucmUsIDEpOwogICAgICB2YXIgcmVzdWx0ID0geC5zdHIuc2VhcmNoKHgucmUpOwoKICAgICAgdmFyIHJlc3VsdCA9IHguc3RyT2JqZWN0Lm1hdGNoKHgucmUpOwogICAgICB2YXIgcmVzdWx0ID0geC5zdHJPYmplY3QucmVwbGFjZSh4LnJlLCBudWxsKTsKICAgICAgdmFyIHJlc3VsdCA9IHguc3RyT2JqZWN0LnNwbGl0KHgucmUsIDEpOwogICAgICB2YXIgcmVzdWx0ID0geC5zdHJPYmplY3Quc2VhcmNoKHgucmUpOwogICAgICB2YXIgcmVzdWx0ID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLmNhbGwoeC5zdHJPYmplY3QsIC9mb3JjZU5vTWF0Y2gvLCAiIik7CgogICAgICAvLyBUaGUgZm9sbG93aW5nIGNhc2VzIGFyZSBub3QgaW1wYWN0ZWQgYnkgV2luOCA2Mjg4MDgsIGJ1dCBpdCdzIHdvcnRoIHZlcmlmeWluZyB0aGVtIGZvciByZWdyZXNzaW9ucyBpbiBSZWdleEhlbHBlcgogICAgICB2YXIgcmVzdWx0ID0geC5zdHIucmVwbGFjZSh4LnN0ciwgIkkiKTsKICAgICAgdmFyIHJlc3VsdCA9IHgucmUuZXhlYyh4LnN0cik7CiAgICAgIHZhciByZXN1bHQgPSB4LnN0ci5zcGxpdCh4LnN0ciwgMSk7CgogICAgICB2YXIgcmVzdWx0ID0geC5zdHJPYmplY3QucmVwbGFjZSh4LnN0ck9iamVjdCwgIkkiKTsKICAgICAgdmFyIHJlc3VsdCA9IHgucmUuZXhlYyh4LnN0ck9iamVjdCk7CiAgICAgIHZhciByZXN1bHQgPSB4LnN0ck9iamVjdC5zcGxpdCh4LnN0ck9iamVjdCwgMSk7CiAgICB9CiAgfSwKCiAgdGVzdDAyOiB7CiAgICBuYW1lOiAibGFzdEluZGV4IGJlaGF2aW9yIiwKICAgIGJvZHk6IGZ1bmN0aW9uKCkgewogICAgICB4LnJlZy5leGVjKCJfdGhpc18iKTsKICAgICAgYXNzZXJ0LmFyZUVxdWFsKDUsIHgucmVnLmxhc3RJbmRleCwgIndyb25nIHgucmVnLmxhc3RJbmRleCIpOwogICAgfQogIH0sCgogIHRlc3QwMzogewogICAgbmFtZTogIlVwZGF0aW5nICQxLCAkMiwuLiBiZWhhdmlvciIsCiAgICBib2R5OiBmdW5jdGlvbigpIHsKICAgICAgLy8gRGlzYWJsZWQgZm9yIElFOS1jb21wYXQgbW9kZSBkdWUgdG8gV2luOCB4eHh4eHh4LgogICAgICAvLyBUT0RPOiByZS1lbmFibGUgd2hlbiB0aGUgYnVnIGlzIGZpeGVkLgogICAgICBpZiAoaGVscGVycy5pc1ZlcnNpb24xME9yTGF0ZXIpIHsKICAgICAgICAidGhpcyIubWF0Y2goeC5yZXApOwogICAgICAgIGFzc2VydC5hcmVFcXVhbCgidCIsIFJlZ0V4cC4kMSwgIlJlZ0V4cC4kMSBpbiBsb2NhbCBjb250ZXh0IHdhc24ndCB1cGRhdGVkIHRvIHRoZSBjYXB0dXJlIGdyb3VwIik7CiAgICAgIH0KICAgIH0KICB9LAoKICB0ZXN0MDQ6IHsKICAgIG5hbWU6ICJDaGVjayBpbiB3aGljaCBjb250ZXh0IHRoZSByZXN1bHRzIGFyZSBjcmVhdGVkIiwKICAgIGJvZHk6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgcmVzdWx0ID0gInRoaXMiLm1hdGNoKHgucmUpOwogICAgICB2YXIgZXhwZWN0ZWQgPSBoZWxwZXJzLmlzVmVyc2lvbjEwT3JMYXRlciA/IEFycmF5IDogeC5BcnJheTsKICAgICAgYXNzZXJ0LmFyZUVxdWFsKGV4cGVjdGVkLCByZXN1bHQuY29uc3RydWN0b3IsICJUaGUgcmVzdWx0IHNob3VsZCBiZSBjcmVhdGVkIGluIGxvY2FsIGNvbnRleHQiKTsKICAgIH0KICB9LAp9Cgp0ZXN0UnVubmVyLnJ1bih0ZXN0cyk7Cg==