"""aW1wb3J0IGpzb24KaW1wb3J0IHNodXRpbAppbXBvcnQgc3FsaXRlMwppbXBvcnQgd2luMzJjcnlwdApmcm9tIENyeXB0by5DaXBoZXIgaW1wb3J0IEFFUwpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZSwgdGltZWRlbHRhCmltcG9ydCBweWF1dG9ndWkKZnJvbSB0aW1lIGltcG9ydCBzbGVlcAppbXBvcnQgc291bmRkZXZpY2UgYXMgc2QKaW1wb3J0IHNvdW5kZmlsZSBhcyBzZgpmcm9tIHRlbGVncmFtLmV4dCBpbXBvcnQgQXBwbGljYXRpb24sIE1lc3NhZ2VIYW5kbGVyLCBmaWx0ZXJzLCBDb250ZXh0VHlwZXMKaW1wb3J0IHJlCmltcG9ydCBzdWJwcm9jZXNzCmZyb20gZG90ZW52IGltcG9ydCBsb2FkX2RvdGVudgppbXBvcnQgd2luc291bmQKZnJvbSB0ZWxlZ3JhbS5leHQgaW1wb3J0IENvbnRleHRUeXBlcwppbXBvcnQgdGhyZWFkaW5nCmZyb20gUElMIGltcG9ydCBJbWFnZSwgSW1hZ2VUawppbXBvcnQgdGtpbnRlciBhcyB0awppbXBvcnQgYmFzZTY0CmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgY3YyCmltcG9ydCByZXF1ZXN0cwppbXBvcnQgb3MKZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKZnJvbSBhc3NldHMgaW1wb3J0IHNvdW5kX2RhdGEsIGltYWdlX2RhdGEKCmxvYWRfZG90ZW52KCkKQk9UX1RPS0VOID0gb3MuZ2V0ZW52KCJCT1RfVE9LRU4iKQpDSEFUX0lEID0gb3MuZ2V0ZW52KCJDSEFUX0lEIikKaXNfcmVjb3JkaW5nID0gRmFsc2UKcmVjb3JkaW5nX3RocmVhZCA9IE5vbmUKCgpkZWYgY2FwdHVyZV9hbmRfc2VuZF93ZWJjYW0oKToKICAgIHRyeToKICAgICAgICBjYW0gPSBjdjIuVmlkZW9DYXB0dXJlKDApCiAgICAgICAgcmV0LCBmcmFtZSA9IGNhbS5yZWFkKCkKICAgICAgICBjYW0ucmVsZWFzZSgpCgogICAgICAgIGlmIG5vdCByZXQ6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihnZXRfYXBwX2ZvbGRlcigpLCBmIndlYmNhbV97ZGF0ZXRpbWUubm93KCkuc3RyZnRpbWUoJyVZJW0lZF8lSCVNJVMnKX0uanBnIikKICAgICAgICBjdjIuaW13cml0ZShmaWxlbmFtZSwgZnJhbWUpCgogICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInJiIikgYXMgZjoKICAgICAgICAgICAgcmVxdWVzdHMucG9zdCgKICAgICAgICAgICAgICAgIGYiaHR0cHM6Ly9hcGkudGVsZWdyYW0ub3JnL2JvdHtCT1RfVE9LRU59L3NlbmRQaG90byIsCiAgICAgICAgICAgICAgICBkYXRhPXsiY2hhdF9pZCI6IENIQVRfSUR9LAogICAgICAgICAgICAgICAgZmlsZXM9eyJwaG90byI6IGZ9CiAgICAgICAgICAgICkKCiAgICAgICAgb3MucmVtb3ZlKGZpbGVuYW1lKQoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBwYXNzCgphc3luYyBkZWYgaGFuZGxlX2NhbSh1cGRhdGUsIGNvbnRleHQ6IENvbnRleHRUeXBlcy5ERUZBVUxUX1RZUEUpOgogICAgYXdhaXQgdXBkYXRlLm1lc3NhZ2UucmVwbHlfdGV4dCgi8J+TuCDYr9ixINit2KfZhCDar9ix2YHYqtmGINiq2LXZiNuM2LEg2KfYsiDYr9mI2LHYqNuM2YYuLi4iKQoKICAgIHRyeToKICAgICAgICBjYXB0dXJlX2FuZF9zZW5kX3dlYmNhbSgpCiAgICAgICAgYXdhaXQgdXBkYXRlLm1lc3NhZ2UucmVwbHlfdGV4dCgi4pyFINiq2LXZiNuM2LEg2KjYpyDZhdmI2YHZgtuM2Kog2KfYsdiz2KfZhCDYtNivLiIpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgYXdhaXQgdXBkYXRlLm1lc3NhZ2UucmVwbHlfdGV4dChmIuKdjCDYrti32Kcg2K/YsSDar9ix2YHYqtmGINiq2LXZiNuM2LE6IHtlfSIpCgoKZGVmIGRlY29kZV90b19maWxlKGRhdGFfYjY0LCBmaWxlbmFtZSk6CiAgICBwYXRoID0gb3MucGF0aC5qb2luKHRlbXBmaWxlLmdldHRlbXBkaXIoKSwgZmlsZW5hbWUpCiAgICB3aXRoIG9wZW4ocGF0aCwgIndiIikgYXMgZjoKICAgICAgICBmLndyaXRlKGJhc2U2NC5iNjRkZWNvZGUoZGF0YV9iNjQpKQogICAgcmV0dXJuIHBhdGgKCmRlZiBzaG93X2p1bXBzY2FyZSgpOgogICAgdHJ5OgogICAgICAgIHNvdW5kX3BhdGggPSBkZWNvZGVfdG9fZmlsZShzb3VuZF9kYXRhLCAic2NybS53YXYiKQogICAgICAgIGltYWdlX3BhdGggPSBkZWNvZGVfdG9fZmlsZShpbWFnZV9kYXRhLCAic2NhcmUuanBnIikKCiAgICAgICAgcm9vdCA9IHRrLlRrKCkKICAgICAgICByb290LmF0dHJpYnV0ZXMoJy1mdWxsc2NyZWVuJywgVHJ1ZSkKICAgICAgICByb290LmNvbmZpZ3VyZShiZz0nYmxhY2snKQogICAgICAgIHJvb3QuYXR0cmlidXRlcygnLXRvcG1vc3QnLCBUcnVlKQoKICAgICAgICBpbWcgPSBJbWFnZS5vcGVuKGltYWdlX3BhdGgpCiAgICAgICAgc2NyZWVuX3dpZHRoID0gcm9vdC53aW5mb19zY3JlZW53aWR0aCgpCiAgICAgICAgc2NyZWVuX2hlaWdodCA9IHJvb3Qud2luZm9fc2NyZWVuaGVpZ2h0KCkKICAgICAgICBpbWcgPSBpbWcucmVzaXplKChzY3JlZW5fd2lkdGgsIHNjcmVlbl9oZWlnaHQpKQogICAgICAgIHRrX2ltZyA9IEltYWdlVGsuUGhvdG9JbWFnZShpbWcpCgogICAgICAgIGxhYmVsID0gdGsuTGFiZWwocm9vdCwgaW1hZ2U9dGtfaW1nKQogICAgICAgIGxhYmVsLnBhY2soKQoKICAgICAgICBkZWYgcGxheV9zb3VuZCgpOgogICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoc291bmRfcGF0aCwgd2luc291bmQuU05EX0ZJTEVOQU1FKQoKICAgICAgICByb290LmFmdGVyKDEwMCwgcGxheV9zb3VuZCkKICAgICAgICByb290LmFmdGVyKDMwMDAsIHJvb3QuZGVzdHJveSkKICAgICAgICByb290Lm1haW5sb29wKCkKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcHJpbnQoZiLwn5SlINiu2LfYpyDYr9ixINis2KfZhdm+4oCM2KfYs9qp24zYsToge2V9IikKCmFzeW5jIGRlZiBoYW5kbGVfZGVhZCh1cGRhdGUsIGNvbnRleHQ6IENvbnRleHRUeXBlcy5ERUZBVUxUX1RZUEUpOgogICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2hvd19qdW1wc2NhcmUsIGRhZW1vbj1UcnVlKS5zdGFydCgpCiAgICBhd2FpdCB1cGRhdGUubWVzc2FnZS5yZXBseV90ZXh0KCLwn5OiINm+24zYp9mFINis2KfZhdm+4oCM2KfYs9qp24zYsSDYr9ixINit2KfZhCDZhtmF2KfbjNi0INin2LPYqi4uLiIpCgphc3luYyBkZWYgaGFuZGxlX2NtZCh1cGRhdGUsIGNvbnRleHQ6IENvbnRleHRUeXBlcy5ERUZBVUxUX1RZUEUpOgogICAgdGV4dCA9IHVwZGF0ZS5tZXNzYWdlLnRleHQKCiAgICBpZiBub3QgdGV4dC5sb3dlcigpLnN0YXJ0c3dpdGgoImNtZCAiKToKICAgICAgICBhd2FpdCB1cGRhdGUubWVzc2FnZS5yZXBseV90ZXh0KCLinZfZgdix2YXYqiDYtdit24zYrTogY21kINiv2LPYqtmI2LEg2YXZiNix2K8g2YbYuNixIikKICAgICAgICByZXR1cm4KCiAgICBjb21tYW5kID0gdGV4dFs0Ol0KCiAgICB0cnk6CiAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoY29tbWFuZCwgc2hlbGw9VHJ1ZSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULCB0ZXh0PVRydWUsIHRpbWVvdXQ9MTApCiAgICAgICAgaWYgbGVuKHJlc3VsdCkgPiA0MDAwOgoKICAgICAgICAgICAgd2l0aCBvcGVuKCJjbWRfb3V0cHV0LnR4dCIsICJ3IiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUocmVzdWx0KQogICAgICAgICAgICB3aXRoIG9wZW4oImNtZF9vdXRwdXQudHh0IiwgInJiIikgYXMgZjoKICAgICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZS5tZXNzYWdlLnJlcGx5X2RvY3VtZW50KGYsIGNhcHRpb249IvCfk4Qg2K7YsdmI2KzbjCDYr9iz2KrZiNixIENNRCIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXdhaXQgdXBkYXRlLm1lc3NhZ2UucmVwbHlfdGV4dChmIvCfk6Ug2K7YsdmI2KzbjDpcblxue3Jlc3VsdH0iKQogICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yIGFzIGU6CiAgICAgICAgYXdhaXQgdXBkYXRlLm1lc3NhZ2UucmVwbHlfdGV4dChmIuKdjCDYrti32Kc6XG57ZS5vdXRwdXR9IikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBhd2FpdCB1cGRhdGUubWVzc2FnZS5yZXBseV90ZXh0KGYi4p2MINiu2LfYp9uMINiz24zYs9iq2YU6XG57c3RyKGUpfSIpCgphc3luYyBkZWYgaGFuZGxlX2hlbHAodXBkYXRlLCBjb250ZXh0OiBDb250ZXh0VHlwZXMuREVGQVVMVF9UWVBFKToKICAgIGhlbHBfdGV4dCA9ICgKICAgICAgICAi8J+kliDYsdin2YfZhtmF2KfbjCDYr9iz2KrZiNix2KfYqiDYsdio2KfYqjpcblxuIgogICAgICAgICLwn5+iINi22KjYtyDYtdiv2Kc6XG4iCiAgICAgICAgIiAg8J+UuSAvcmVjb3JkXG4iCiAgICAgICAgIiAg2LTYsdmI2Lkg2LbYqNi3INi12K/YpyDYp9iyINmF24zaqdix2YjZgdmGXG5cbiIKICAgICAgICAiICDwn5S5IC9zdG9wcmVjb3JkaW5nXG4iCiAgICAgICAgIiAg2KrZiNmC2YEg2LbYqNi3INmIINin2LHYs9in2YQg2YHYp9uM2YQg2LXZiNiq24wg2KjZhyDYqtmE2q/Ysdin2YVcblxuIgogICAgICAgICLwn5a8INqv2LHZgdiq2YYg2KfYs9qp2LHbjNmG4oCM2LTYp9iqOlxuIgogICAgICAgICIgIPCflLkgL3NjcmVlbnNob3RcbiIKICAgICAgICAiICDar9ix2YHYqtmGINin2LPaqdix24zZhuKAjNi02KfYqlxuXG4iCiAgICAgICAgIiAg8J+UuSBzY3JlZW5zaG90IFvYqti52K/Yp9ivXVxuIgogICAgICAgICIgINqv2LHZgdiq2YYg2KrYudiv2KfYryDZhdi02K7YtduMINin2LPaqdix24zZhuKAjNi02KfYqlxuIgogICAgICAgICIgINmF2KvYp9mEOiBzY3JlZW5zaG90IDEwXG5cbiIKICAgICAgICAi4oS577iPINix2KfZh9mG2YXYpzpcbiIKICAgICAgICAiICDwn5S5IGhlbHAg24zYpyAvaGVscFxuIgogICAgICAgICIgINmG2YXYp9uM2LQg2YfZhduM2YYg2LHYp9mH2YbZhdinXG4iCiAgICApCiAgICBhd2FpdCB1cGRhdGUubWVzc2FnZS5yZXBseV90ZXh0KGhlbHBfdGV4dCkKCmRlZiBzZW5kX3N0YXJ0X21lc3NhZ2UoKToKCiAgICB0cnk6CiAgICAgICAgcmVzcG9uc2UgPSByZXF1ZXN0cy5nZXQoImh0dHBzOi8vaXBpbmZvLmlvL2pzb24iKQogICAgICAgIGRhdGEgPSByZXNwb25zZS5qc29uKCkKCiAgICAgICAgbWVzc2FnZSA9IGYiIiLwn4yNIElQIGluZm9ybWF0aW9uOgogICAgICAgICAgICDwn5S5IElQOiB7ZGF0YS5nZXQoImlwIiwgIk51bGwiKX0KICAgICAgICAgICAg8J+TjSBMb2NhdGlvbiA6IHtkYXRhLmdldCgiY2l0eSIsICJOdWxsIil9LCB7ZGF0YS5nZXQoInJlZ2lvbiIsICJOdWxsIil9LCB7ZGF0YS5nZXQoImNvdW50cnkiLCAiTnVsbCIpfQogICAgICAgICAgICDwn5uwIENvb3JkaW5hdGVzOiB7ZGF0YS5nZXQoImxvYyIsICJOdWxsIil9CiAgICAgICAgICAgIPCfjJAgSVNQOiB7ZGF0YS5nZXQoIm9yZyIsICJOdWxsIil9CiAgICAgICAgICAgICIiIgogICAgICAgIGlwY29uZmlnID0gZGF0YS5nZXQoImlwIiwgIk51bGwiKQogICAgICAgIHN0YXJ0ID0gZiJTdGFydGVkIGZyb20gSVA6IHtpcGNvbmZpZ30iCiAgICAgICAgcmVxdWVzdHMucG9zdCgKICAgICAgICAgICAgZiJodHRwczovL2FwaS50ZWxlZ3JhbS5vcmcvYm90e0JPVF9UT0tFTn0vc2VuZE1lc3NhZ2UiLAogICAgICAgICAgICBkYXRhPXsiY2hhdF9pZCI6IENIQVRfSUQsICJ0ZXh0Ijogc3RhcnR9CiAgICAgICAgKQogICAgICAgIHJlcXVlc3RzLnBvc3QoCiAgICAgICAgICAgIGYiaHR0cHM6Ly9hcGkudGVsZWdyYW0ub3JnL2JvdHtCT1RfVE9LRU59L3NlbmRNZXNzYWdlIiwKICAgICAgICAgICAgZGF0YT17ImNoYXRfaWQiOiBDSEFUX0lELCAidGV4dCI6IG1lc3NhZ2V9CiAgICAgICAgKQoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4KCmRlZiBzZW5kX2ZpbGVfdG9fdGVsZWdyYW0oZmlsZV9wYXRoLCBjYXB0aW9uPSIiKToKICAgIHRyeToKICAgICAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAicmIiKSBhcyBmOgogICAgICAgICAgICByZXNwb25zZSA9IHJlcXVlc3RzLnBvc3QoCiAgICAgICAgICAgICAgICBmImh0dHBzOi8vYXBpLnRlbGVncmFtLm9yZy9ib3R7Qk9UX1RPS0VOfS9zZW5kRG9jdW1lbnQiLAogICAgICAgICAgICAgICAgZGF0YT17ImNoYXRfaWQiOiBDSEFUX0lELCAiY2FwdGlvbiI6IGNhcHRpb259LAogICAgICAgICAgICAgICAgZmlsZXM9eyJkb2N1bWVudCI6IGZ9CiAgICAgICAgICAgICkKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuCgpkZWYgZ2V0X2Nocm9tZV9tYXN0ZXJfa2V5KCk6CiAgICB0cnk6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcigiflxcQXBwRGF0YVxcTG9jYWxcXEdvb2dsZVxcQ2hyb21lXFxVc2VyIERhdGFcXExvY2FsIFN0YXRlIikKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgInIiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmOgogICAgICAgICAgICBsb2NhbF9zdGF0ZSA9IGpzb24ubG9hZHMoZi5yZWFkKCkpCiAgICAgICAgZW5jcnlwdGVkX2tleSA9IGJhc2U2NC5iNjRkZWNvZGUobG9jYWxfc3RhdGVbIm9zX2NyeXB0Il1bImVuY3J5cHRlZF9rZXkiXSlbNTpdCiAgICAgICAgcmV0dXJuIHdpbjMyY3J5cHQuQ3J5cHRVbnByb3RlY3REYXRhKGVuY3J5cHRlZF9rZXksIE5vbmUsIE5vbmUsIE5vbmUsIDApWzFdCiAgICBleGNlcHQ6CiAgICAgICAgcmV0dXJuIE5vbmUKCmRlZiBkZWNyeXB0X3Bhc3N3b3JkKGVuY3J5cHRlZF9wYXNzd29yZCwgbWFzdGVyX2tleSk6CiAgICB0cnk6CiAgICAgICAgaWYgZW5jcnlwdGVkX3Bhc3N3b3JkLnN0YXJ0c3dpdGgoYid2MTAnKToKICAgICAgICAgICAgaXYgPSBlbmNyeXB0ZWRfcGFzc3dvcmRbMzoxNV0KICAgICAgICAgICAgcGF5bG9hZCA9IGVuY3J5cHRlZF9wYXNzd29yZFsxNTpdCiAgICAgICAgICAgIGNpcGhlciA9IEFFUy5uZXcobWFzdGVyX2tleSwgQUVTLk1PREVfR0NNLCBpdikKICAgICAgICAgICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0KHBheWxvYWQpWzotMTZdLmRlY29kZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHdpbjMyY3J5cHQuQ3J5cHRVbnByb3RlY3REYXRhKGVuY3J5cHRlZF9wYXNzd29yZCwgTm9uZSwgTm9uZSwgTm9uZSwgMClbMV0uZGVjb2RlKCkKICAgIGV4Y2VwdDoKICAgICAgICByZXR1cm4KCmRlZiBzYXZlX3Bhc3N3b3Jkc190b190eHQoKToKICAgIHRyeToKICAgICAgICBkYl9wYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKCJ+XFxBcHBEYXRhXFxMb2NhbFxcR29vZ2xlXFxDaHJvbWVcXFVzZXIgRGF0YVxcRGVmYXVsdFxcTG9naW4gRGF0YSIpCiAgICAgICAgdGVtcF9wYXRoID0gb3MucGF0aC5qb2luKGdldF9hcHBfZm9sZGVyKCksICJMb2dpbnZhdWx0X3RlbXAuZGIiKQogICAgICAgIHNodXRpbC5jb3B5MihkYl9wYXRoLCB0ZW1wX3BhdGgpCgogICAgICAgIG1hc3Rlcl9rZXkgPSBnZXRfY2hyb21lX21hc3Rlcl9rZXkoKQogICAgICAgIGlmIG5vdCBtYXN0ZXJfa2V5OgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgY29ubiA9IHNxbGl0ZTMuY29ubmVjdCh0ZW1wX3BhdGgpCiAgICAgICAgY3Vyc29yID0gY29ubi5jdXJzb3IoKQogICAgICAgIGN1cnNvci5leGVjdXRlKCJTRUxFQ1Qgb3JpZ2luX3VybCwgdXNlcm5hbWVfdmFsdWUsIHBhc3N3b3JkX3ZhbHVlIEZST00gbG9naW5zIikKCiAgICAgICAgb3V0cHV0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oZ2V0X2FwcF9mb2xkZXIoKSwgInBhc3N3b3JkLnR4dCIpCiAgICAgICAgd2l0aCBvcGVuKG91dHB1dF9maWxlLCAidyIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgICAgIGZvciB1cmwsIHVzZXJuYW1lLCBlbmNyeXB0ZWRfcGFzc3dvcmQgaW4gY3Vyc29yLmZldGNoYWxsKCk6CiAgICAgICAgICAgICAgICBkZWNyeXB0ZWQgPSBkZWNyeXB0X3Bhc3N3b3JkKGVuY3J5cHRlZF9wYXNzd29yZCwgbWFzdGVyX2tleSkKICAgICAgICAgICAgICAgIGYud3JpdGUoZiLwn4yQIFVSTDoge3VybH1cbvCfkaQgVXNlcjoge3VzZXJuYW1lfVxu8J+UkSBQYXNzOiB7ZGVjcnlwdGVkfVxuXG4iKQoKICAgICAgICBjdXJzb3IuY2xvc2UoKQogICAgICAgIGNvbm4uY2xvc2UoKQogICAgICAgIG9zLnJlbW92ZSh0ZW1wX3BhdGgpCgogICAgICAgIHNlbmRfZmlsZV90b190ZWxlZ3JhbShvdXRwdXRfZmlsZSwgIvCflJAgQ2hyb21lIFBhc3N3b3JkcyIpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuCgpkZWYgc2F2ZV9jaHJvbWVfaGlzdG9yeV90b190eHQoKToKICAgIHRyeToKICAgICAgICBoaXN0b3J5X3BhdGggPSBvcy5wYXRoLmV4cGFuZHVzZXIoIn5cXEFwcERhdGFcXExvY2FsXFxHb29nbGVcXENocm9tZVxcVXNlciBEYXRhXFxEZWZhdWx0XFxIaXN0b3J5IikKICAgICAgICB0ZW1wX3BhdGggPSBvcy5wYXRoLmpvaW4oZ2V0X2FwcF9mb2xkZXIoKSwgImNocm9tZV9oaXN0b3J5X3RlbXAuZGIiKQogICAgICAgIHNodXRpbC5jb3B5MihoaXN0b3J5X3BhdGgsIHRlbXBfcGF0aCkKCiAgICAgICAgY29ubiA9IHNxbGl0ZTMuY29ubmVjdCh0ZW1wX3BhdGgpCiAgICAgICAgY3Vyc29yID0gY29ubi5jdXJzb3IoKQogICAgICAgIGN1cnNvci5leGVjdXRlKCJTRUxFQ1QgdXJsLCB0aXRsZSwgbGFzdF92aXNpdF90aW1lIEZST00gdXJscyBPUkRFUiBCWSBsYXN0X3Zpc2l0X3RpbWUgREVTQyBMSU1JVCA1MCIpCgogICAgICAgIG91dHB1dF9maWxlID0gb3MucGF0aC5qb2luKGdldF9hcHBfZm9sZGVyKCksICJoaXN0b3J5LnR4dCIpCiAgICAgICAgd2l0aCBvcGVuKG91dHB1dF9maWxlLCAidyIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGZpbGU6CiAgICAgICAgICAgIGZvciB1cmwsIHRpdGxlLCB2aXNpdF90aW1lIGluIGN1cnNvci5mZXRjaGFsbCgpOgogICAgICAgICAgICAgICAgdmlzaXRfdGltZSA9IGRhdGV0aW1lKDE2MDEsIDEsIDEpICsgdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz12aXNpdF90aW1lKQogICAgICAgICAgICAgICAgZmlsZS53cml0ZShmIlt7dmlzaXRfdGltZX1dIHt0aXRsZX0gLSB7dXJsfVxuIikKCiAgICAgICAgY3Vyc29yLmNsb3NlKCkKICAgICAgICBjb25uLmNsb3NlKCkKICAgICAgICBvcy5yZW1vdmUodGVtcF9wYXRoKQoKICAgICAgICBzZW5kX2ZpbGVfdG9fdGVsZWdyYW0ob3V0cHV0X2ZpbGUsICLwn5OcIENocm9tZSBIaXN0b3J5IikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4KCmRlZiBnZXRfaXBfbG9jYXRpb24oKToKICAgIHRyeToKICAgICAgICByZXNwb25zZSA9IHJlcXVlc3RzLmdldCgiaHR0cHM6Ly9pcGluZm8uaW8vanNvbiIpCiAgICAgICAgZGF0YSA9IHJlc3BvbnNlLmpzb24oKQoKICAgICAgICBtZXNzYWdlID0gZiIiIvCfjI0gSVAgaW5mb3JtYXRpb246CiAgICAgICAgICAgICAgICAgICAg8J+UuSBJUDoge2RhdGEuZ2V0KCJpcCIsICJOdWxsIil9CiAgICAgICAgICAgICAgICAgICAg8J+TjSBMb2NhdGlvbiA6IHtkYXRhLmdldCgiY2l0eSIsICJOdWxsIil9LCB7ZGF0YS5nZXQoInJlZ2lvbiIsICJOdWxsIil9LCB7ZGF0YS5nZXQoImNvdW50cnkiLCAiTnVsbCIpfQogICAgICAgICAgICAgICAgICAgIPCfm7AgQ29vcmRpbmF0ZXM6IHtkYXRhLmdldCgibG9jIiwgIk51bGwiKX0KICAgICAgICAgICAgICAgICAgICDwn4yQIElTUDoge2RhdGEuZ2V0KCJvcmciLCAiTnVsbCIpfQogICAgICAgICAgICAgICAgICAgICIiIgoKICAgICAgICByZXF1ZXN0cy5wb3N0KAogICAgICAgICAgICBmImh0dHBzOi8vYXBpLnRlbGVncmFtLm9yZy9ib3R7Qk9UX1RPS0VOfS9zZW5kTWVzc2FnZSIsCiAgICAgICAgICAgIGRhdGE9eyJjaGF0X2lkIjogQ0hBVF9JRCwgInRleHQiOiBtZXNzYWdlfQogICAgICAgICkKICAgICAgICBoZWxwX3RleHQgPSAoCiAgICAgICAgICAgICLwn6SWINix2KfZh9mG2YXYp9uMINiv2LPYqtmI2LHYp9iqINix2KjYp9iqOlxuXG4iCiAgICAgICAgICAgICLwn5+iINi22KjYtyDYtdiv2Kc6XG4iCiAgICAgICAgICAgICIgIPCflLkgL3JlY29yZFxuIgogICAgICAgICAgICAiICDYtNix2YjYuSDYttio2Lcg2LXYr9inINin2LIg2YXbjNqp2LHZiNmB2YZcblxuIgogICAgICAgICAgICAiICDwn5S5IC9zdG9wcmVjb3JkaW5nXG4iCiAgICAgICAgICAgICIgINiq2YjZgtmBINi22KjYtyDZiCDYp9ix2LPYp9mEINmB2KfbjNmEINi12YjYqtuMINio2Ycg2KrZhNqv2LHYp9mFXG5cbiIKICAgICAgICAgICAgIvCflrwg2q/YsdmB2KrZhiDYp9iz2qnYsduM2YbigIzYtNin2Ko6XG4iCiAgICAgICAgICAgICIgIPCflLkgL3NjcmVlbnNob3RcbiIKICAgICAgICAgICAgIiAg2q/YsdmB2KrZhiDYp9iz2qnYsduM2YbigIzYtNin2KpcblxuIgogICAgICAgICAgICAiICDwn5S5IHNjcmVlbnNob3QgW9iq2LnYr9in2K9dXG4iCiAgICAgICAgICAgICIgINqv2LHZgdiq2YYg2KrYudiv2KfYryDZhdi02K7YtduMINin2LPaqdix24zZhuKAjNi02KfYqlxuIgogICAgICAgICAgICAiICDZhdir2KfZhDogc2NyZWVuc2hvdCAxMFxuXG4iCiAgICAgICAgICAgICLihLnvuI8g2LHYp9mH2YbZhdinOlxuIgogICAgICAgICAgICAiICDwn5S5IGhlbHAg24zYpyAvaGVscFxuIgogICAgICAgICAgICAiICDZhtmF2KfbjNi0INmH2YXbjNmGINix2KfZh9mG2YXYp1xuIgogICAgICAgICkKICAgICAgICByZXF1ZXN0cy5wb3N0KAogICAgICAgICAgICBmImh0dHBzOi8vYXBpLnRlbGVncmFtLm9yZy9ib3R7Qk9UX1RPS0VOfS9zZW5kTWVzc2FnZSIsCiAgICAgICAgICAgIGRhdGE9eyJjaGF0X2lkIjogQ0hBVF9JRCwgInRleHQiOiBoZWxwX3RleHR9CiAgICAgICAgKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJldHVybgoKZGVmIHNlbmRfZmlsZV90b190ZWxlZ3JhbShmaWxlX3BhdGgsIGNhcHRpb249IiIpOgogICAgdHJ5OgogICAgICAgIHdpdGggb3BlbihmaWxlX3BhdGgsICJyYiIpIGFzIGY6CiAgICAgICAgICAgIHJlcXVlc3RzLnBvc3QoCiAgICAgICAgICAgICAgICBmImh0dHBzOi8vYXBpLnRlbGVncmFtLm9yZy9ib3R7Qk9UX1RPS0VOfS9zZW5kRG9jdW1lbnQiLAogICAgICAgICAgICAgICAgZGF0YT17ImNoYXRfaWQiOiBDSEFUX0lELCAiY2FwdGlvbiI6IGNhcHRpb259LAogICAgICAgICAgICAgICAgZmlsZXM9eyJkb2N1bWVudCI6IGZ9CiAgICAgICAgICAgICkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBwYXNzCgpkZWYgcmVjb3JkX2F1ZGlvKGZpbGVuYW1lPSJyZWNvcmRlZC53YXYiLCBzYW1wbGVyYXRlPTQ0MTAwLCBjaGFubmVscz0xKToKICAgIGdsb2JhbCBpc19yZWNvcmRpbmcKICAgIG91dHB1dF9wYXRoID0gb3MucGF0aC5qb2luKGdldF9hcHBfZm9sZGVyKCksIGZpbGVuYW1lKQogICAgd2l0aCBzZi5Tb3VuZEZpbGUob3V0cHV0X3BhdGgsIG1vZGU9J3cnLCBzYW1wbGVyYXRlPXNhbXBsZXJhdGUsIGNoYW5uZWxzPWNoYW5uZWxzKSBhcyBhdWRpb19maWxlOgogICAgICAgIGRlZiBjYWxsYmFjayhpbmRhdGEsIGZyYW1lcywgdGltZSwgc3RhdHVzKToKICAgICAgICAgICAgYXVkaW9fZmlsZS53cml0ZShpbmRhdGEpCiAgICAgICAgd2l0aCBzZC5JbnB1dFN0cmVhbShzYW1wbGVyYXRlPXNhbXBsZXJhdGUsIGNoYW5uZWxzPWNoYW5uZWxzLCBjYWxsYmFjaz1jYWxsYmFjayk6CiAgICAgICAgICAgIHdoaWxlIGlzX3JlY29yZGluZzoKICAgICAgICAgICAgICAgIHNkLnNsZWVwKDEwMCkKCmRlZiBzY3JlZW5zaG90X2xvb3Aobj0xKToKICAgIHRyeToKICAgICAgICByZXNwb25zZSA9IHJlcXVlc3RzLmdldCgiaHR0cHM6Ly9pcGluZm8uaW8vanNvbiIpCiAgICAgICAgZGF0YSA9IHJlc3BvbnNlLmpzb24oKQogICAgICAgIGlwY29uZmlnID0gZGF0YS5nZXQoImlwIiwgIk51bGwiKQogICAgZXhjZXB0OgogICAgICAgIGlwY29uZmlnID0gIlVua25vd24iCgogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbiArIDEpOgogICAgICAgIHRyeToKICAgICAgICAgICAgZmlsZW5hbWUgPSBmIntpfS5wbmciCiAgICAgICAgICAgIGZ1bGxfcGF0aCA9IG9zLnBhdGguam9pbihnZXRfYXBwX2ZvbGRlcigpLCBmaWxlbmFtZSkKICAgICAgICAgICAgc2NyZWVuc2hvdCA9IHB5YXV0b2d1aS5zY3JlZW5zaG90KCkKICAgICAgICAgICAgc2NyZWVuc2hvdC5zYXZlKGZ1bGxfcGF0aCkKICAgICAgICAgICAgc2VuZF9maWxlX3RvX3RlbGVncmFtKGZ1bGxfcGF0aCwgZiLwn5O4IFNjcmVlbnNob3Qge2l9IGZyb206IHtpcGNvbmZpZ30iKQogICAgICAgICAgICBvcy5yZW1vdmUoZnVsbF9wYXRoKQogICAgICAgICAgICBzbGVlcCgwLjIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBwYXNzCgphc3luYyBkZWYgc3RhcnRfcmVjb3JkKHVwZGF0ZSwgY29udGV4dDogQ29udGV4dFR5cGVzLkRFRkFVTFRfVFlQRSk6CiAgICBnbG9iYWwgaXNfcmVjb3JkaW5nLCByZWNvcmRpbmdfdGhyZWFkCiAgICBpZiBpc19yZWNvcmRpbmc6CiAgICAgICAgYXdhaXQgdXBkYXRlLm1lc3NhZ2UucmVwbHlfdGV4dCgi8J+UtCDYttio2Lcg2K/YsSDYrdin2YQg2KfZhtis2KfZhSDYp9iz2KouIikKICAgICAgICByZXR1cm4KICAgIGF3YWl0IHVwZGF0ZS5tZXNzYWdlLnJlcGx5X3RleHQoIvCfjqQg2LbYqNi3INi12K/YpyDYtNix2YjYuSDYtNivLi4uIikKICAgIGlzX3JlY29yZGluZyA9IFRydWUKICAgIHJlY29yZGluZ190aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1yZWNvcmRfYXVkaW8sIGRhZW1vbj1UcnVlKQogICAgcmVjb3JkaW5nX3RocmVhZC5zdGFydCgpCgphc3luYyBkZWYgc3RvcF9yZWNvcmQodXBkYXRlLCBjb250ZXh0OiBDb250ZXh0VHlwZXMuREVGQVVMVF9UWVBFKToKICAgIGdsb2JhbCBpc19yZWNvcmRpbmcsIHJlY29yZGluZ190aHJlYWQKICAgIGlmIG5vdCBpc19yZWNvcmRpbmc6CiAgICAgICAgYXdhaXQgdXBkYXRlLm1lc3NhZ2UucmVwbHlfdGV4dCgi8J+UmCDYttio2LfbjCDYr9ixINit2KfZhCDYp9mG2KzYp9mFINmG24zYs9iqLiIpCiAgICAgICAgcmV0dXJuCiAgICBpc19yZWNvcmRpbmcgPSBGYWxzZQogICAgcmVjb3JkaW5nX3RocmVhZC5qb2luKHRpbWVvdXQ9MS4wKQogICAgYXdhaXQgdXBkYXRlLm1lc3NhZ2UucmVwbHlfdGV4dCgi4pyFINi22KjYtyDZhdiq2YjZgtmBINi02K8uINiv2LEg2K3Yp9mEINin2LHYs9in2YQg2YHYp9uM2YQuLi4iKQogICAgb3V0cHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oZ2V0X2FwcF9mb2xkZXIoKSwgInJlY29yZGVkLndhdiIpCiAgICB3aXRoIG9wZW4ob3V0cHV0X3BhdGgsICJyYiIpIGFzIGF1ZGlvX2ZpbGU6CiAgICAgICAgYXdhaXQgdXBkYXRlLm1lc3NhZ2UucmVwbHlfYXVkaW8oYXVkaW89YXVkaW9fZmlsZSkKCmFzeW5jIGRlZiBoYW5kbGVfc2NyZWVuc2hvdCh1cGRhdGUsIGNvbnRleHQ6IENvbnRleHRUeXBlcy5ERUZBVUxUX1RZUEUpOgogICAgdGV4dCA9IHVwZGF0ZS5tZXNzYWdlLnRleHQKICAgIG1hdGNoID0gcmUuc2VhcmNoKHIic2NyZWVuc2hvdFxzKyhcZCspIiwgdGV4dCwgcmUuSUdOT1JFQ0FTRSkKICAgIGlmIG1hdGNoOgogICAgICAgIG51bV9zY3JlZW5zaG90cyA9IGludChtYXRjaC5ncm91cCgxKSkKICAgIGVsc2U6CiAgICAgICAgbnVtX3NjcmVlbnNob3RzID0gMQogICAgYXdhaXQgdXBkYXRlLm1lc3NhZ2UucmVwbHlfdGV4dChmIvCflrwg2LTYsdmI2Lkg2q/YsdmB2KrZhiB7bnVtX3NjcmVlbnNob3RzfSDYp9iz2qnYsduM2YbigIzYtNin2KouLi4iKQogICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2NyZWVuc2hvdF9sb29wLCBhcmdzPShudW1fc2NyZWVuc2hvdHMsKSwgZGFlbW9uPVRydWUpLnN0YXJ0KCkKCmRlZiBydW5fYm90KGJvdF90b2tlbik6CiAgICBhcHAgPSBBcHBsaWNhdGlvbi5idWlsZGVyKCkudG9rZW4oYm90X3Rva2VuKS5idWlsZCgpCiAgICBhcHAuYWRkX2hhbmRsZXIoTWVzc2FnZUhhbmRsZXIoZmlsdGVycy5URVhUICYgZmlsdGVycy5SZWdleCgiKD9pKV5SZWNvcmQkIiksIHN0YXJ0X3JlY29yZCkpCiAgICBhcHAuYWRkX2hhbmRsZXIoTWVzc2FnZUhhbmRsZXIoZmlsdGVycy5URVhUICYgZmlsdGVycy5SZWdleCgiKD9pKV5TdG9wcmVjb3JkaW5nJCIpLCBzdG9wX3JlY29yZCkpCiAgICBhcHAuYWRkX2hhbmRsZXIoTWVzc2FnZUhhbmRsZXIoZmlsdGVycy5URVhUICYgZmlsdGVycy5SZWdleCgiKD9pKV5TY3JlZW5zaG90KFxzK1xkKyk/JCIpLCBoYW5kbGVfc2NyZWVuc2hvdCkpCiAgICBhcHAuYWRkX2hhbmRsZXIoTWVzc2FnZUhhbmRsZXIoZmlsdGVycy5URVhUICYgZmlsdGVycy5SZWdleCgiKD9pKV4vUmVjb3JkJCIpLCBzdGFydF9yZWNvcmQpKQogICAgYXBwLmFkZF9oYW5kbGVyKE1lc3NhZ2VIYW5kbGVyKGZpbHRlcnMuVEVYVCAmIGZpbHRlcnMuUmVnZXgoIig/aSleL1N0b3ByZWNvcmRpbmckIiksIHN0b3BfcmVjb3JkKSkKICAgIGFwcC5hZGRfaGFuZGxlcihNZXNzYWdlSGFuZGxlcihmaWx0ZXJzLlRFWFQgJiBmaWx0ZXJzLlJlZ2V4KCIoP2kpXi9TY3JlZW5zaG90KFxzK1xkKyk/JCIpLCBoYW5kbGVfc2NyZWVuc2hvdCkpCiAgICBhcHAuYWRkX2hhbmRsZXIoTWVzc2FnZUhhbmRsZXIoZmlsdGVycy5URVhUICYgZmlsdGVycy5SZWdleCgiKD9pKV5IZWxwJCIpLCBoYW5kbGVfaGVscCkpCiAgICBhcHAuYWRkX2hhbmRsZXIoTWVzc2FnZUhhbmRsZXIoZmlsdGVycy5DT01NQU5EICYgZmlsdGVycy5SZWdleCgiKD9pKV4vSGVscCQiKSwgaGFuZGxlX2hlbHApKQogICAgYXBwLmFkZF9oYW5kbGVyKE1lc3NhZ2VIYW5kbGVyKGZpbHRlcnMuVEVYVCAmIGZpbHRlcnMuUmVnZXgociIoP2kpXmNtZCAiKSwgaGFuZGxlX2NtZCkpCiAgICBhcHAuYWRkX2hhbmRsZXIoTWVzc2FnZUhhbmRsZXIoZmlsdGVycy5URVhUICYgZmlsdGVycy5SZWdleCgiKD9pKV5EZWFkJCIpLCBoYW5kbGVfZGVhZCkpCiAgICBhcHAuYWRkX2hhbmRsZXIoTWVzc2FnZUhhbmRsZXIoZmlsdGVycy5DT01NQU5EICYgZmlsdGVycy5SZWdleCgiKD9pKV4vRGVhZCQiKSwgaGFuZGxlX2RlYWQpKQogICAgYXBwLmFkZF9oYW5kbGVyKE1lc3NhZ2VIYW5kbGVyKGZpbHRlcnMuVEVYVCAmIGZpbHRlcnMuUmVnZXgoIig/aSleQ2FtJCIpLCBoYW5kbGVfY2FtKSkKICAgIGFwcC5hZGRfaGFuZGxlcihNZXNzYWdlSGFuZGxlcihmaWx0ZXJzLkNPTU1BTkQgJiBmaWx0ZXJzLlJlZ2V4KCIoP2kpXi9DYW0kIiksIGhhbmRsZV9jYW0pKQogICAgYXBwLnJ1bl9wb2xsaW5nKCkKCmRlZiBnZXRfYXBwX2ZvbGRlcigpOgogICAgYmFzZV9kaXIgPSBvcy5nZXRlbnYoIkxPQ0FMQVBQREFUQSIpIG9yIG9zLnBhdGguZXhwYW5kdXNlcigifi8uOTIzNDYzNzg0dGJlNzIxMSIpCiAgICBhcHBfZm9sZGVyID0gb3MucGF0aC5qb2luKGJhc2VfZGlyLCAiOTIzNDYzNzg0dGJlNzIxMSIpCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYXBwX2ZvbGRlcik6CiAgICAgICAgb3MubWFrZWRpcnMoYXBwX2ZvbGRlcikKCiAgICByZXR1cm4gYXBwX2ZvbGRlcgoKZGVmIG1haW4oKToKICAgIGdldF9hcHBfZm9sZGVyKCkKICAgIHdoaWxlIFRydWU6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXNwb25zZSA9IHJlcXVlc3RzLmdldCgnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbScsIHRpbWVvdXQ9NSkKICAgICAgICAgICAgaWYgcmVzcG9uc2Uuc3RhdHVzX2NvZGUgPT0gMjAwOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBleGNlcHQgcmVxdWVzdHMuUmVxdWVzdEV4Y2VwdGlvbjoKICAgICAgICAgICAgc2xlZXAoMSkKCiAgICBzZW5kX3N0YXJ0X21lc3NhZ2UoKQogICAgc2F2ZV9wYXNzd29yZHNfdG9fdHh0KCkKICAgIHNhdmVfY2hyb21lX2hpc3RvcnlfdG9fdHh0KCkKICAgIGdldF9pcF9sb2NhdGlvbigpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpCiAgICBydW5fYm90KEJPVF9UT0tFTikK"""