Iy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvcmVncmVzc2lvbi5weTogcHlzcWxpdGUgcmVncmVzc2lvbiB0ZXN0cwojCiMgQ29weXJpZ2h0IChDKSAyMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KIwojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgojCiMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KIwojIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAojIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiMKIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAojICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQojICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCgpkaWRfcm9sbGJhY2sgPSBGYWxzZQoKY2xhc3MgTXlDb25uZWN0aW9uKHNxbGl0ZS5Db25uZWN0aW9uKToKICAgIGRlZiByb2xsYmFjayhzZWxmKToKICAgICAgICBnbG9iYWwgZGlkX3JvbGxiYWNrCiAgICAgICAgZGlkX3JvbGxiYWNrID0gVHJ1ZQogICAgICAgIHNxbGl0ZS5Db25uZWN0aW9uLnJvbGxiYWNrKHNlbGYpCgpjbGFzcyBDb250ZXh0VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIGdsb2JhbCBkaWRfcm9sbGJhY2sKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGZhY3Rvcnk9TXlDb25uZWN0aW9uKQogICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGMgdW5pcXVlKSIpCiAgICAgICAgZGlkX3JvbGxiYWNrID0gRmFsc2UKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgc2VsZi5jb24uY2xvc2UoKQoKICAgIGRlZiBDaGVja0NvbnRleHRNYW5hZ2VyKHNlbGYpOgogICAgICAgICIiIkNhbiB0aGUgY29ubmVjdGlvbiBiZSB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyIGF0IGFsbD8iIiIKICAgICAgICB3aXRoIHNlbGYuY29uOgogICAgICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrQ29udGV4dE1hbmFnZXJDb21taXQoc2VsZik6CiAgICAgICAgIiIiSXMgYSBjb21taXQgY2FsbGVkIGluIHRoZSBjb250ZXh0IG1hbmFnZXI/IiIiCiAgICAgICAgd2l0aCBzZWxmLmNvbjoKICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChjKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgc2VsZi5jb24ucm9sbGJhY2soKQogICAgICAgIGNvdW50ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGNvdW50KCopIGZyb20gdGVzdCIpLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjb3VudCwgMSkKCiAgICBkZWYgQ2hlY2tDb250ZXh0TWFuYWdlclJvbGxiYWNrKHNlbGYpOgogICAgICAgICIiIklzIGEgcm9sbGJhY2sgY2FsbGVkIGluIHRoZSBjb250ZXh0IG1hbmFnZXI/IiIiCiAgICAgICAgZ2xvYmFsIGRpZF9yb2xsYmFjawogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGRpZF9yb2xsYmFjaywgRmFsc2UpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIHNlbGYuY29uOgogICAgICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChjKSB2YWx1ZXMgKDQpIikKICAgICAgICAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYykgdmFsdWVzICg0KSIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5JbnRlZ3JpdHlFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGRpZF9yb2xsYmFjaywgVHJ1ZSkKCmRlZiBzdWl0ZSgpOgogICAgY3R4X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbnRleHRUZXN0cywgIkNoZWNrIikKICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGN0eF9zdWl0ZSwpKQoKZGVmIHRlc3QoKToKICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB0ZXN0KCkK