-- Install-Auphonic.lua: installs Auphonic for DaVinci Resolve. -- -- How to use: open DaVinci Resolve Studio, go to the Fusion page, and drag this file -- onto the Nodes area. DaVinci Resolve runs it and it asks before installing. -- -- What it does: -- 1. Checks that this is DaVinci Resolve Studio (the free edition can't run the -- plugin) and asks whether to install. -- 2. Writes three files into your user's DaVinci Resolve scripts folder: -- /Utility/Auphonic/Auphonic.lua the menu entry -- /Utility/Auphonic/auphonic_lib.zip the plugin (Python) -- /Utility/Auphonic/LICENSE.txt -- Nothing else is changed: no other folders, no admin rights, no network access. -- 3. Checks every file after writing it. An installed older version is only replaced -- once all new files were written correctly. -- -- The files are stored at the end of this file, base64-encoded, each with its size and -- an Adler-32 checksum. This file is generated by tools/build.py from -- launcher/Install-Auphonic.lua.in; don't edit a generated copy. local VERSION = "1.0.0" -- Keep in sync with HELP_URL in src/auphonic_resolve/links.py (a test checks this). local HELP_URL = "https://auphonic.com/help/resources/davinciresolve.html" local SUPPORT_EMAIL = "support@auphonic.com" local FOLDER = "Auphonic" -- The files to install, filled in at the end of this file: { name, size, adler32, data }. local PAYLOAD = {} local fu = rawget(_G, "fusion") or rawget(_G, "fu") or bmd.scriptapp("Fusion") local function log(msg) print("[Auphonic installer] " .. msg) end -- -- Where to install --------------------------------------------------------------- local function os_name() local name = rawget(_G, "jit") and jit.os if name then return name -- "Windows", "OSX" or "Linux" end if rawget(_G, "FuPLATFORM_WINDOWS") then return "Windows" elseif rawget(_G, "FuPLATFORM_MAC") then return "OSX" elseif package.config:sub(1, 1) == "\\" then return "Windows" end return "Linux" end -- The current user's Fusion/Scripts/Utility folder (the same for every Resolve -- version), and the path separator. Keep in sync with tools/dev_setup.py. local function utility_dir() local system = os_name() if system == "Windows" then local appdata = os.getenv("APPDATA") if not appdata or appdata == "" then return nil, "\\" end return appdata .. "\\Blackmagic Design\\DaVinci Resolve\\Support\\Fusion\\Scripts\\Utility", "\\" end local home = os.getenv("HOME") if not home or home == "" then return nil, "/" end if system == "OSX" then return home .. "/Library/Application Support/Blackmagic Design/DaVinci Resolve/Fusion/Scripts/Utility", "/" end return home .. "/.local/share/DaVinciResolve/Fusion/Scripts/Utility", "/" end -- -- Files ---------------------------------------------------------------------------- local B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" local B64_VALUE = {} for i = 1, #B64 do B64_VALUE[B64:byte(i)] = i - 1 end local function base64_decode(text) text = text:gsub("[^%w%+/]", "") -- drop line breaks and "=" padding local out, n = {}, 0 for i = 1, #text, 4 do local a, b, c, d = text:byte(i, i + 3) local value = B64_VALUE[a] * 262144 + B64_VALUE[b] * 4096 + (c and B64_VALUE[c] * 64 or 0) + (d and B64_VALUE[d] or 0) local x, y, z = math.floor(value / 65536), math.floor(value / 256) % 256, value % 256 n = n + 1 if d then out[n] = string.char(x, y, z) elseif c then out[n] = string.char(x, y) else out[n] = string.char(x) end end return table.concat(out) end local function adler32(data) local a, b = 1, 0 for i = 1, #data do a = (a + data:byte(i)) % 65521 b = (b + a) % 65521 end return b * 65536 + a end local function is_intact(data, file) return data ~= nil and #data == file.size and adler32(data) == file.adler32 end local function read_file(path) local handle = io.open(path, "rb") if not handle then return nil end local data = handle:read("*a") handle:close() return data end local function write_file(path, data) local handle, err = io.open(path, "wb") if not handle then return false, err end local ok, write_err = handle:write(data) handle:close() return ok ~= nil, write_err end local function make_dir(path, system) pcall(function() bmd.createdir(path) end) -- Check by writing a file there; fall back to the system's mkdir. local probe = path .. (system == "Windows" and "\\" or "/") .. ".auphonic-install-check" if write_file(probe, "") then os.remove(probe) return true end if system == "Windows" then os.execute('mkdir "' .. path .. '"') else os.execute("mkdir -p '" .. path:gsub("'", "'\\''") .. "'") end if write_file(probe, "") then os.remove(probe) return true end return false end -- Installs all files into target; returns true, or false and a message. Each file is -- written as ".new" and checked first; only then are the old files replaced. local function install(target, sep, system) if not make_dir(target, system) then return false, "Couldn't create the folder " .. target .. "." end for _, file in ipairs(PAYLOAD) do local data = base64_decode(file.data) if not is_intact(data, file) then return false, "This installer is damaged (" .. file.name .. "). Please download it again." end local temp = target .. sep .. file.name .. ".new" local ok, err = write_file(temp, data) if not ok or not is_intact(read_file(temp), file) then os.remove(temp) return false, "Couldn't write " .. temp .. (err and (": " .. tostring(err)) or ".") end end for _, file in ipairs(PAYLOAD) do local final = target .. sep .. file.name os.remove(final) -- os.rename can't replace a file on Windows local ok, err = os.rename(final .. ".new", final) if not ok then return false, "Couldn't replace " .. final .. ": " .. tostring(err) end end return true end -- -- DaVinci Resolve and the dialogs ----------------------------------------------- local function get_resolve() local found = rawget(_G, "resolve") if found then return found end local ok, value = pcall(bmd.scriptapp, "Resolve") if ok then return value end return nil end local function open_url(url) if pcall(function() bmd.openurl(url) end) then return end local system = os_name() if system == "Windows" then os.execute('start "" "' .. url .. '"') elseif system == "OSX" then os.execute('open "' .. url .. '"') else os.execute('xdg-open "' .. url .. '" >/dev/null 2>&1 &') end end local function escape(text) return (text:gsub("&", "&"):gsub("<", "<"):gsub(">", ">")) end -- Shows a dialog with the given buttons ({ {id, text}, ... }, the last one is the -- default); returns the id of the clicked button, or nil if the window was closed. local function dialog(title, html, buttons) local ui = fu.UIManager local disp = bmd.UIDispatcher(ui) local row = { Weight = 0, ui:HGap(0, 1) } for i, button in ipairs(buttons) do row[#row + 1] = ui:Button({ ID = button[1], Text = button[2], Default = i == #buttons }) end local win = disp:AddWindow({ ID = "AuphonicInstaller", WindowTitle = title, Geometry = { 300, 300, 520, 230 }, }, ui:VGroup({ ui:Label({ ID = "Message", Text = html, WordWrap = true, OpenExternalLinks = true }), ui:HGroup(row), })) local clicked = nil for _, button in ipairs(buttons) do win.On[button[1]].Clicked = function() clicked = button[1] disp:ExitLoop() end end win.On.AuphonicInstaller.Close = function() disp:ExitLoop() end win:Show() disp:RunLoop() win:Hide() return clicked end local function main() local resolve = get_resolve() local product = resolve and resolve:GetProductName() or "" log("version " .. VERSION .. " | " .. (product ~= "" and product or "not DaVinci Resolve") .. " " .. (resolve and resolve:GetVersionString() or "") .. " | " .. os_name()) if not resolve then log("Please run this installer in DaVinci Resolve Studio: drag it onto the Nodes area " .. "of the Fusion page.") return end if not product:find("Studio", 1, true) then -- The free edition doesn't allow scripts to show windows, so explain here, with -- a link to the help page (not opened in the browser: that came as a surprise). log("Auphonic needs DaVinci Resolve Studio; the free edition can't run it. Nothing " .. "was installed. See " .. HELP_URL) return end local utility, sep = utility_dir() if not utility then log("Couldn't find your user folder (HOME or APPDATA isn't set). Nothing was installed.") return end local target = utility .. sep .. FOLDER local updating = read_file(target .. sep .. "Auphonic.lua") ~= nil log((updating and "updating " or "installing into ") .. target) local question = "

Install Auphonic for DaVinci Resolve " .. VERSION .. "?

" .. "

It will be copied to:
" .. escape(target) .. "

" .. (updating and "

This replaces the version that's installed there.

" or "") local shown, answer = pcall(dialog, "Install Auphonic", question, { { "Cancel", "Cancel" }, { "Install", "Install" } }) if not shown then -- No window possible: dragging the installer in was the confirmation. log("couldn't show a window (" .. tostring(answer) .. "); installing without asking") elseif answer ~= "Install" then log("cancelled; nothing was installed") return end local ok, err = install(target, sep, os_name()) if not ok then log("ERROR: " .. err) pcall(dialog, "Auphonic wasn't installed", "

" .. escape(err) .. "

" .. "

Nothing else was changed. If this keeps happening, please email " .. SUPPORT_EMAIL .. " and include the [Auphonic installer] lines from the Console " .. "(Workspace → Console).

", { { "Close", "Close" } }) return end log("installed " .. VERSION .. " into " .. target) local next_step = updating and "

If Auphonic's window is open, close it. Then choose " .. "Workspace → Scripts → Auphonic → Auphonic to start the new version.

" or "

Choose Workspace → Scripts → Auphonic → Auphonic to start it.

" local _, clicked = pcall(dialog, "Auphonic installed", "

Auphonic for DaVinci Resolve " .. VERSION .. " is installed.

" .. next_step, { { "Help", "Open Help" }, { "Close", "Close" } }) if clicked == "Help" then open_url(HELP_URL) end end -- -- The files ------------------------------------------------------------------------ PAYLOAD[#PAYLOAD + 1] = { name = "Auphonic.lua", size = 9950, adler32 = 3866936107, data = [[ LS0gQXVwaG9uaWMgZm9yIERhVmluY2kgUmVzb2x2ZTogbWVudSBlbnRyeSAoV29ya3NwYWNlID4g U2NyaXB0cyA+IEF1cGhvbmljID4gQXVwaG9uaWMpLgotLQotLSBQbGFpbiBMdWEgNS4xLCBzbyBp dCBhbHdheXMgcnVucywgZXZlbiB3aGVuIFJlc29sdmUgY2FuJ3QgZmluZCBQeXRob24uIEl0IGNo ZWNrcwotLSB0aGUgUmVzb2x2ZSBlZGl0aW9uIGFuZCB0aGUgUHl0aG9uIHZlcnNpb24sIHRoZW4g c3RhcnRzIHRoZSBQeXRob24gcGFja2FnZSBmcm9tCi0tIGF1cGhvbmljX2xpYi56aXAgbmV4dCB0 byB0aGlzIGZpbGUgKG9yIGZyb20gdGhlIHJlcG9zaXRvcnkncyBzcmMvIGZvbGRlciB3aGVuIGl0 Ci0tIGlzIHN0YXJ0ZWQgdGhyb3VnaCB0aGUgZGV2IGxhdW5jaGVyLCBzZWUgdG9vbHMvZGV2X3Nl dHVwLnB5KS4KCi0tIEtlZXAgaW4gc3luYyB3aXRoIEhFTFBfVVJMIGluIHNyYy9hdXBob25pY19y ZXNvbHZlL2xpbmtzLnB5IChhIHRlc3QgY2hlY2tzIHRoaXMpLgpsb2NhbCBIRUxQX1VSTCA9ICJo dHRwczovL2F1cGhvbmljLmNvbS9oZWxwL3Jlc291cmNlcy9kYXZpbmNpcmVzb2x2ZS5odG1sIgps b2NhbCBNSU5fUFlUSE9OID0geyAzLCAxMCB9Ci0tIE9sZGVzdCBzdXBwb3J0ZWQgUmVzb2x2ZSAo bWFqb3IsIG1pbm9yKS4gS2VlcCBpbiBzeW5jIHdpdGggY29tcGF0Lk1JTl9SRVNPTFZFLgpsb2Nh bCBNSU5fUkVTT0xWRSA9IHsgMTksIDAgfQpsb2NhbCBLRVkgPSAiQXVwaG9uaWNSZXNvbHZlLiIK Ci0tIFRoZSBkZXYgbGF1bmNoZXIgc2V0cyB0aGlzIGdsb2JhbCBiZWZvcmUgcnVubmluZyB0aGlz IGZpbGUgd2l0aCBkb2ZpbGUoKS4KbG9jYWwgZGV2ID0gcmF3Z2V0KF9HLCAiQVVQSE9OSUNfREVW IikKcmF3c2V0KF9HLCAiQVVQSE9OSUNfREVWIiwgbmlsKQoKbG9jYWwgZnUgPSByYXdnZXQoX0cs ICJmdXNpb24iKSBvciByYXdnZXQoX0csICJmdSIpIG9yIGJtZC5zY3JpcHRhcHAoIkZ1c2lvbiIp Cgpsb2NhbCBmdW5jdGlvbiBsb2cobXNnKQogICAgcHJpbnQoIltBdXBob25pY10gIiAuLiBtc2cp CmVuZAoKLS0gT3BlbnMgdXJsIGluIHRoZSBicm93c2VyLiBibWQub3BlbnVybCBpc24ndCBhdmFp bGFibGUgZXZlcnl3aGVyZSAoaXQgaXMgbWlzc2luZwotLSBmcm9tIFB5dGhvbidzIGJtZCBpbiBS ZXNvbHZlIDIxLjEpLCBzbyBmYWxsIGJhY2sgdG8gdGhlIE9TJ3Mgb3duIG9wZW5lci4KbG9jYWwg ZnVuY3Rpb24gb3Blbl91cmwodXJsKQogICAgaWYgcGNhbGwoZnVuY3Rpb24oKQogICAgICAgIGJt ZC5vcGVudXJsKHVybCkKICAgIGVuZCkgdGhlbgogICAgICAgIHJldHVybiB0cnVlCiAgICBlbmQK ICAgIGxvY2FsIG9zX25hbWUgPSByYXdnZXQoX0csICJqaXQiKSBhbmQgaml0Lm9zIG9yICIiCiAg ICBsb2NhbCBjb21tYW5kCiAgICBpZiBvc19uYW1lID09ICJXaW5kb3dzIiB0aGVuCiAgICAgICAg Y29tbWFuZCA9ICdzdGFydCAiIiAiJyAuLiB1cmwgLi4gJyInCiAgICBlbHNlaWYgb3NfbmFtZSA9 PSAiT1NYIiB0aGVuCiAgICAgICAgY29tbWFuZCA9ICdvcGVuICInIC4uIHVybCAuLiAnIicKICAg IGVsc2UKICAgICAgICBjb21tYW5kID0gJ3hkZy1vcGVuICInIC4uIHVybCAuLiAnIiA+L2Rldi9u dWxsIDI+JjEgJicKICAgIGVuZAogICAgcmV0dXJuIChwY2FsbChvcy5leGVjdXRlLCBjb21tYW5k KSkKZW5kCgpsb2NhbCBmdW5jdGlvbiBzaG93X2RpYWxvZyh0aXRsZSwgaHRtbCkKICAgIGxvY2Fs IHVpID0gZnUuVUlNYW5hZ2VyCiAgICBsb2NhbCBkaXNwID0gYm1kLlVJRGlzcGF0Y2hlcih1aSkK ICAgIGxvY2FsIHdpbiA9IGRpc3A6QWRkV2luZG93KHsKICAgICAgICBJRCA9ICJBdXBob25pY01l c3NhZ2UiLAogICAgICAgIFdpbmRvd1RpdGxlID0gdGl0bGUsCiAgICAgICAgR2VvbWV0cnkgPSB7 IDMwMCwgMzAwLCA0ODAsIDE5MCB9LAogICAgfSwgdWk6Vkdyb3VwKHsKICAgICAgICB1aTpMYWJl bCh7IElEID0gIk1lc3NhZ2UiLCBUZXh0ID0gaHRtbCwgV29yZFdyYXAgPSB0cnVlLCBPcGVuRXh0 ZXJuYWxMaW5rcyA9IHRydWUgfSksCiAgICAgICAgdWk6SEdyb3VwKHsKICAgICAgICAgICAgV2Vp Z2h0ID0gMCwKICAgICAgICAgICAgdWk6SEdhcCgwLCAxKSwKICAgICAgICAgICAgdWk6QnV0dG9u KHsgSUQgPSAiSGVscCIsIFRleHQgPSAiT3BlbiBIZWxwIiB9KSwKICAgICAgICAgICAgdWk6QnV0 dG9uKHsgSUQgPSAiQ2xvc2UiLCBUZXh0ID0gIkNsb3NlIiB9KSwKICAgICAgICB9KSwKICAgIH0p KQogICAgZnVuY3Rpb24gd2luLk9uLkhlbHAuQ2xpY2tlZCgpCiAgICAgICAgb3Blbl91cmwoSEVM UF9VUkwpCiAgICBlbmQKICAgIGZ1bmN0aW9uIHdpbi5Pbi5DbG9zZS5DbGlja2VkKCkKICAgICAg ICBkaXNwOkV4aXRMb29wKCkKICAgIGVuZAogICAgZnVuY3Rpb24gd2luLk9uLkF1cGhvbmljTWVz c2FnZS5DbG9zZSgpCiAgICAgICAgZGlzcDpFeGl0TG9vcCgpCiAgICBlbmQKICAgIHdpbjpTaG93 KCkKICAgIGRpc3A6UnVuTG9vcCgpCiAgICB3aW46SGlkZSgpCmVuZAoKLS0gUmV0dXJucyB0aGUg Zm9sZGVyIHRoaXMgZmlsZSBsaXZlcyBpbiwgb3IgbmlsLgpsb2NhbCBmdW5jdGlvbiBzY3JpcHRf ZGlyKCkKICAgIGxvY2FsIGluZm8gPSBkZWJ1ZyBhbmQgZGVidWcuZ2V0aW5mbyBhbmQgZGVidWcu Z2V0aW5mbygxLCAiUyIpCiAgICBsb2NhbCBzb3VyY2UgPSBpbmZvIGFuZCBpbmZvLnNvdXJjZSBv ciAiIgogICAgaWYgc291cmNlOnN1YigxLCAxKSA9PSAiQCIgdGhlbgogICAgICAgIGxvY2FsIGRp ciA9IHNvdXJjZTpzdWIoMik6bWF0Y2goIl4oLiopWy9cXF0iKQogICAgICAgIGlmIGRpciB0aGVu CiAgICAgICAgICAgIHJldHVybiBkaXIKICAgICAgICBlbmQKICAgIGVuZAogICAgcmV0dXJuIG5p bAplbmQKCmxvY2FsIGZ1bmN0aW9uIGZpbGVfZXhpc3RzKHBhdGgpCiAgICBsb2NhbCBoYW5kbGUg PSBpby5vcGVuKHBhdGgsICJyYiIpCiAgICBpZiBoYW5kbGUgdGhlbgogICAgICAgIGhhbmRsZTpj bG9zZSgpCiAgICAgICAgcmV0dXJuIHRydWUKICAgIGVuZAogICAgcmV0dXJuIGZhbHNlCmVuZAoK LS0gRmluZHMgYXVwaG9uaWNfbGliLnppcCBuZXh0IHRvIHRoaXMgZmlsZSwgZmFsbGluZyBiYWNr IHRvIHRoZSBTY3JpcHRzIHBhdGggbWFwLgpsb2NhbCBmdW5jdGlvbiBmaW5kX2xpYl96aXAoKQog ICAgbG9jYWwgY2FuZGlkYXRlcyA9IHt9CiAgICBsb2NhbCBkaXIgPSBzY3JpcHRfZGlyKCkKICAg IGlmIGRpciB0aGVuCiAgICAgICAgdGFibGUuaW5zZXJ0KGNhbmRpZGF0ZXMsIGRpciAuLiAiL2F1 cGhvbmljX2xpYi56aXAiKQogICAgZW5kCiAgICBsb2NhbCBvaywgc2VnbWVudHMgPSBwY2FsbChm dW5jdGlvbigpCiAgICAgICAgcmV0dXJuIGZ1Ok1hcFBhdGhTZWdtZW50cygiU2NyaXB0czpVdGls aXR5L0F1cGhvbmljL2F1cGhvbmljX2xpYi56aXAiKQogICAgZW5kKQogICAgaWYgb2sgYW5kIHR5 cGUoc2VnbWVudHMpID09ICJ0YWJsZSIgdGhlbgogICAgICAgIGZvciBfLCBwYXRoIGluIHBhaXJz KHNlZ21lbnRzKSBkbwogICAgICAgICAgICB0YWJsZS5pbnNlcnQoY2FuZGlkYXRlcywgcGF0aCkK ICAgICAgICBlbmQKICAgIGVuZAogICAgZm9yIF8sIHBhdGggaW4gaXBhaXJzKGNhbmRpZGF0ZXMp IGRvCiAgICAgICAgaWYgZmlsZV9leGlzdHMocGF0aCkgdGhlbgogICAgICAgICAgICByZXR1cm4g cGF0aAogICAgICAgIGVuZAogICAgZW5kCiAgICByZXR1cm4gbmlsCmVuZAoKbG9jYWwgZnVuY3Rp b24gZ2V0X3Jlc29sdmUoKQogICAgbG9jYWwgZm91bmQgPSByYXdnZXQoX0csICJyZXNvbHZlIikK ICAgIGlmIGZvdW5kIHRoZW4KICAgICAgICByZXR1cm4gZm91bmQKICAgIGVuZAogICAgbG9jYWwg Y3RvciA9IHJhd2dldChfRywgIlJlc29sdmUiKQogICAgaWYgY3RvciB0aGVuCiAgICAgICAgbG9j YWwgb2ssIHZhbHVlID0gcGNhbGwoY3RvcikKICAgICAgICBpZiBvayBhbmQgdmFsdWUgdGhlbgog ICAgICAgICAgICByZXR1cm4gdmFsdWUKICAgICAgICBlbmQKICAgIGVuZAogICAgbG9jYWwgb2ss IHZhbHVlID0gcGNhbGwoYm1kLnNjcmlwdGFwcCwgIlJlc29sdmUiKQogICAgaWYgb2sgdGhlbgog ICAgICAgIHJldHVybiB2YWx1ZQogICAgZW5kCiAgICByZXR1cm4gbmlsCmVuZAoKLS0gSGV4LWVu Y29kZXMgYSBzdHJpbmcgc28gaXQgY2FuIGJlIHBhc3NlZCB0byBQeXRob24gd2l0aG91dCBhbnkg cXVvdGluZyBpc3N1ZXMKLS0gKHBhdGhzIHdpdGggc3BhY2VzLCBxdW90ZXMgb3Igbm9uLUFTQ0lJ IGNoYXJhY3RlcnMpLgpsb2NhbCBmdW5jdGlvbiBoZXgodGV4dCkKICAgIHJldHVybiAodGV4dDpn c3ViKCIuIiwgZnVuY3Rpb24oYykKICAgICAgICByZXR1cm4gc3RyaW5nLmZvcm1hdCgiJTAyeCIs IGM6Ynl0ZSgpKQogICAgZW5kKSkKZW5kCgpsb2NhbCBmdW5jdGlvbiBydW5fcHl0aG9uKGNvZGUp CiAgICBmdTpFeGVjdXRlKCIhUHkzOiBleGVjKGJ5dGVzLmZyb21oZXgoJyIgLi4gaGV4KGNvZGUp IC4uICInKS5kZWNvZGUoJ3V0Zi04JykpIikKZW5kCgotLSBSZXR1cm5zIG1ham9yLCBtaW5vciwg ZXhlY3V0YWJsZSBvZiBSZXNvbHZlJ3MgUHl0aG9uIDMsIG9yIG5pbCBpZiB0aGVyZSBpcyBub25l Lgpsb2NhbCBmdW5jdGlvbiBwcm9iZV9weXRob24oKQogICAgbG9jYWwgdG9rZW4gPSB0b3N0cmlu Zyhvcy50aW1lKCkpIC4uICItIiAuLiB0b3N0cmluZyhtYXRoLnJhbmRvbSgxLCAxMDAwMDAwMDAw KSkKICAgIGZ1OlNldERhdGEoS0VZIC4uICJQeVByb2JlIiwgbmlsKQogICAgcnVuX3B5dGhvbih0 YWJsZS5jb25jYXQoewogICAgICAgICJpbXBvcnQgc3lzIiwKICAgICAgICAiX2YgPSBnbG9iYWxz KCkuZ2V0KCdmdXNpb24nKSBvciBnbG9iYWxzKCkuZ2V0KCdmdScpIiwKICAgICAgICAiX2YuU2V0 RGF0YSgnIiAuLiBLRVkgLi4gIlB5UHJvYmUnLCAnJXN8JWR8JWR8JXMnICUgKCciIC4uIHRva2Vu IC4uICInLCIKICAgICAgICAgICAgLi4gIiBzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lv bl9pbmZvWzFdLCBzeXMuZXhlY3V0YWJsZSBvciBzeXMucHJlZml4KSkiLAogICAgfSwgIlxuIikp CiAgICAtLSBmdXNpb246RXhlY3V0ZSBpcyBleHBlY3RlZCB0byBiZSBzeW5jaHJvbm91czsgcG9s bCBicmllZmx5IGluIGNhc2UgaXQgaXNuJ3QuCiAgICBmb3IgXyA9IDEsIDIwIGRvCiAgICAgICAg bG9jYWwgdmFsdWUgPSBmdTpHZXREYXRhKEtFWSAuLiAiUHlQcm9iZSIpCiAgICAgICAgaWYgdHlw ZSh2YWx1ZSkgPT0gInN0cmluZyIgdGhlbgogICAgICAgICAgICBsb2NhbCBnb3QsIG1ham9yLCBt aW5vciwgZXhlID0gdmFsdWU6bWF0Y2goIl4oW158XSopfCglZCspfCglZCspfCguKikkIikKICAg ICAgICAgICAgaWYgZ290ID09IHRva2VuIHRoZW4KICAgICAgICAgICAgICAgIGZ1OlNldERhdGEo S0VZIC4uICJQeVByb2JlIiwgbmlsKQogICAgICAgICAgICAgICAgcmV0dXJuIHRvbnVtYmVyKG1h am9yKSwgdG9udW1iZXIobWlub3IpLCBleGUKICAgICAgICAgICAgZW5kCiAgICAgICAgZW5kCiAg ICAgICAgYm1kLndhaXQoMC4xKQogICAgZW5kCiAgICByZXR1cm4gbmlsCmVuZAoKbG9jYWwgZnVu Y3Rpb24gcHl0aG9uX2lzX3Rvb19vbGQobWFqb3IsIG1pbm9yKQogICAgcmV0dXJuIG1ham9yIDwg TUlOX1BZVEhPTlsxXSBvciAobWFqb3IgPT0gTUlOX1BZVEhPTlsxXSBhbmQgbWlub3IgPCBNSU5f UFlUSE9OWzJdKQplbmQKCi0tIFN0YXJ0cyB0aGUgcGx1Z2luLiBSZXNvbHZlIGtlZXBzIGl0cyBQ eXRob24gcnVubmluZyBiZXR3ZWVuIHNjcmlwdHMsIHNvIGV2ZXJ5Ci0tIHN0YXJ0IGZpcnN0IHVu bG9hZHMgdGhlIHBsdWdpbidzIG1vZHVsZXMgYW5kIGZvcmdldHMgd2hhdCBQeXRob24gY2FjaGVk IGFib3V0Ci0tIGF1cGhvbmljX2xpYi56aXA6IGFuIHVwZGF0ZWQgcGx1Z2luIChvciwgd2l0aCB0 aGUgZGV2IGxhdW5jaGVyLCBlZGl0ZWQgY29kZSkgaXMKLS0gdGhlbiB1c2VkIHdpdGhvdXQgcmVz dGFydGluZyBSZXNvbHZlLgpsb2NhbCBmdW5jdGlvbiBsYXVuY2gobGliX3BhdGgpCiAgICBydW5f cHl0aG9uKHRhYmxlLmNvbmNhdCh7CiAgICAgICAgImltcG9ydCBpbXBvcnRsaWIsIHN5cywgdHJh Y2ViYWNrIiwKICAgICAgICAiX2xpYiA9IGJ5dGVzLmZyb21oZXgoJyIgLi4gaGV4KGxpYl9wYXRo KSAuLiAiJykuZGVjb2RlKCd1dGYtOCcpIiwKICAgICAgICAiX2RldiA9ICIgLi4gKGRldiBhbmQg IlRydWUiIG9yICJGYWxzZSIpLAogICAgICAgICJmb3IgX20gaW4gbGlzdChzeXMubW9kdWxlcyk6 IiwKICAgICAgICAiICAgIGlmIF9tID09ICdhdXBob25pY19yZXNvbHZlJyBvciBfbS5zdGFydHN3 aXRoKCdhdXBob25pY19yZXNvbHZlLicpOiIsCiAgICAgICAgIiAgICAgICAgZGVsIHN5cy5tb2R1 bGVzW19tXSIsCiAgICAgICAgLS0gQSByZXBsYWNlZCB6aXAgaGFzIGl0cyBmaWxlcyBhdCBvdGhl ciBwb3NpdGlvbnM7IHJlYWRpbmcgaXQgd2l0aCB0aGUgb2xkCiAgICAgICAgLS0gZGlyZWN0b3J5 IHdvdWxkIGZhaWwuIGludmFsaWRhdGVfY2FjaGVzKCkgcmUtcmVhZHMgaXQgZm9yIHRoZSBjYWNo ZWQgaW1wb3J0ZXIuCiAgICAgICAgImltcG9ydGxpYi5pbnZhbGlkYXRlX2NhY2hlcygpIiwKICAg ICAgICAic3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUucG9wKF9saWIsIE5vbmUpIiwKICAgICAgICAi dHJ5OiIsCiAgICAgICAgIiAgICBpbXBvcnQgemlwaW1wb3J0IiwKICAgICAgICAiICAgIHppcGlt cG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS5wb3AoX2xpYiwgTm9uZSkiLAogICAgICAgICJleGNl cHQgRXhjZXB0aW9uOiIsCiAgICAgICAgIiAgICBwYXNzIiwKICAgICAgICAiaWYgX2xpYiBpbiBz eXMucGF0aDoiLAogICAgICAgICIgICAgc3lzLnBhdGgucmVtb3ZlKF9saWIpIiwKICAgICAgICAi c3lzLnBhdGguaW5zZXJ0KDAsIF9saWIpIiwKICAgICAgICAidHJ5OiIsCiAgICAgICAgIiAgICBp bXBvcnQgYXVwaG9uaWNfcmVzb2x2ZSIsCiAgICAgICAgIiAgICBhdXBob25pY19yZXNvbHZlLm1h aW4oIiwKICAgICAgICAiICAgICAgICBmdXNpb249Z2xvYmFscygpLmdldCgnZnVzaW9uJykgb3Ig Z2xvYmFscygpLmdldCgnZnUnKSwiLAogICAgICAgICIgICAgICAgIGJtZD1nbG9iYWxzKCkuZ2V0 KCdibWQnKSwiLAogICAgICAgICIgICAgICAgIHJlc29sdmU9Z2xvYmFscygpLmdldCgncmVzb2x2 ZScpLCIsCiAgICAgICAgIiAgICAgICAgZGV2PV9kZXYsIiwKICAgICAgICAiICAgICkiLAogICAg ICAgICJleGNlcHQgRXhjZXB0aW9uOiIsCiAgICAgICAgIiAgICBwcmludCgnW0F1cGhvbmljXSBV bmV4cGVjdGVkIGVycm9yOicpIiwKICAgICAgICAiICAgIHRyYWNlYmFjay5wcmludF9leGMoKSIs CiAgICB9LCAiXG4iKSkKZW5kCgpsb2NhbCBmdW5jdGlvbiBtYWluKCkKICAgIGxvY2FsIHJlc29s dmUgPSBnZXRfcmVzb2x2ZSgpCiAgICBsb2NhbCBwcm9kdWN0ID0gcmVzb2x2ZSBhbmQgcmVzb2x2 ZTpHZXRQcm9kdWN0TmFtZSgpIG9yICJ1bmtub3duIgogICAgbG9jYWwgdmVyc2lvbiA9IHJlc29s dmUgYW5kIHJlc29sdmU6R2V0VmVyc2lvblN0cmluZygpIG9yICJ1bmtub3duIgogICAgaWYgZGV2 IHRoZW4KICAgICAgICBsb2coImRldiBsYXVuY2hlciwgc3JjOiAiIC4uIGRldi5zcmNfZGlyKQog ICAgZW5kCiAgICBsb2coIkx1YSBsYXVuY2hlciB8IFJlc29sdmUgIiAuLiBwcm9kdWN0IC4uICIg IiAuLiB2ZXJzaW9uKQoKICAgIGxvY2FsIHJlc29sdmVfbWFqb3IsIHJlc29sdmVfbWlub3IgPSB2 ZXJzaW9uOm1hdGNoKCJeKCVkKyklLiglZCspIikKICAgIHJlc29sdmVfbWFqb3IsIHJlc29sdmVf bWlub3IgPSB0b251bWJlcihyZXNvbHZlX21ham9yKSwgdG9udW1iZXIocmVzb2x2ZV9taW5vcikK ICAgIGlmIHJlc29sdmVfbWFqb3IgYW5kIChyZXNvbHZlX21ham9yIDwgTUlOX1JFU09MVkVbMV0K ICAgICAgICBvciAocmVzb2x2ZV9tYWpvciA9PSBNSU5fUkVTT0xWRVsxXSBhbmQgcmVzb2x2ZV9t aW5vciA8IE1JTl9SRVNPTFZFWzJdKSkgdGhlbgogICAgICAgIGxvZygiV0FSTklORzogRGFWaW5j aSBSZXNvbHZlICIgLi4gdmVyc2lvbiAuLiAiIGlzIG5vdCBzdXBwb3J0ZWQuIEF1cGhvbmljIG5l ZWRzICIKICAgICAgICAgICAgLi4gIkRhVmluY2kgUmVzb2x2ZSBTdHVkaW8gIiAuLiBNSU5fUkVT T0xWRVsxXSAuLiAiIG9yIG5ld2VyOyB0cnlpbmcgYW55d2F5LiIpCiAgICBlbmQKCiAgICBpZiBy ZXNvbHZlIGFuZCBub3QgcHJvZHVjdDpmaW5kKCJTdHVkaW8iLCAxLCB0cnVlKSB0aGVuCiAgICAg ICAgLS0gVGhlIGZyZWUgZWRpdGlvbiBubyBsb25nZXIgYWxsb3dzIHNjcmlwdGVkIHdpbmRvd3Mg KFVJTWFuYWdlciksIHNvIHdlCiAgICAgICAgLS0gY2FuJ3Qgc2hvdyBhIGRpYWxvZy4gRXhwbGFp biBpbiB0aGUgQ29uc29sZSwgd2l0aCBhIGxpbmsgdG8gdGhlIGhlbHAgcGFnZQogICAgICAgIC0t IChub3Qgb3BlbmVkIGluIHRoZSBicm93c2VyOiB0aGF0IGNhbWUgYXMgYSBzdXJwcmlzZSkuCiAg ICAgICAgbG9nKCJUaGlzIHBsdWdpbiByZXF1aXJlcyBEYVZpbmNpIFJlc29sdmUgU3R1ZGlvLiBU aGUgZnJlZSBlZGl0aW9uIGRvZXMgbm90ICIKICAgICAgICAgICAgLi4gImFsbG93IHNjcmlwdHMg dG8gc2hvdyB3aW5kb3dzLiBTZWUgIiAuLiBIRUxQX1VSTCkKICAgICAgICByZXR1cm4KICAgIGVu ZAoKICAgIGxvY2FsIGxpYl9wYXRoCiAgICBpZiBkZXYgdGhlbgogICAgICAgIGxpYl9wYXRoID0g ZGV2LnNyY19kaXIKICAgIGVsc2UKICAgICAgICBsaWJfcGF0aCA9IGZpbmRfbGliX3ppcCgpCiAg ICAgICAgaWYgbm90IGxpYl9wYXRoIHRoZW4KICAgICAgICAgICAgc2hvd19kaWFsb2coIkF1cGhv bmljIiwgIlRoZSBBdXBob25pYyBwbHVnaW4gaXMgaW5jb21wbGV0ZTogPGI+YXVwaG9uaWNfbGli LnppcDwvYj4gIgogICAgICAgICAgICAgICAgLi4gImlzIG1pc3NpbmcgbmV4dCB0byBBdXBob25p Yy5sdWEuIFBsZWFzZSByZWluc3RhbGwgdGhlIHBsdWdpbi4iKQogICAgICAgICAgICByZXR1cm4K ICAgICAgICBlbmQKICAgIGVuZAoKICAgIGxvY2FsIG1ham9yLCBtaW5vciwgZXhlID0gcHJvYmVf cHl0aG9uKCkKICAgIGlmIG5vdCBtYWpvciB0aGVuCiAgICAgICAgbG9nKCJQeXRob24gMyBub3Qg Zm91bmQiKQogICAgICAgIHNob3dfZGlhbG9nKCJBdXBob25pYyBuZWVkcyBQeXRob24iLCAiQXVw aG9uaWMgbmVlZHMgPGI+UHl0aG9uICIKICAgICAgICAgICAgLi4gTUlOX1BZVEhPTlsxXSAuLiAi LiIgLi4gTUlOX1BZVEhPTlsyXSAuLiAiIG9yIG5ld2VyPC9iPiwgd2hpY2ggRGFWaW5jaSBSZXNv bHZlICIKICAgICAgICAgICAgLi4gImNvdWxkbid0IGZpbmQuIEluc3RhbGwgaXQgZnJvbSA8YSBo cmVmPVwiaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZHMvXCI+IgogICAgICAgICAgICAu LiAicHl0aG9uLm9yZzwvYT4sIHRoZW4gcmVzdGFydCBSZXNvbHZlLiIpCiAgICAgICAgcmV0dXJu CiAgICBlbmQKICAgIGxvZygiUHl0aG9uICIgLi4gbWFqb3IgLi4gIi4iIC4uIG1pbm9yIC4uICIg YXQgIiAuLiBleGUpCiAgICBpZiBweXRob25faXNfdG9vX29sZChtYWpvciwgbWlub3IpIHRoZW4K ICAgICAgICBzaG93X2RpYWxvZygiQXVwaG9uaWMgbmVlZHMgYSBuZXdlciBQeXRob24iLCAiRGFW aW5jaSBSZXNvbHZlIGlzIHVzaW5nIDxiPlB5dGhvbiAiCiAgICAgICAgICAgIC4uIG1ham9yIC4u ICIuIiAuLiBtaW5vciAuLiAiPC9iPiwgYnV0IEF1cGhvbmljIG5lZWRzIDxiPlB5dGhvbiAiIC4u IE1JTl9QWVRIT05bMV0KICAgICAgICAgICAgLi4gIi4iIC4uIE1JTl9QWVRIT05bMl0gLi4gIiBv ciBuZXdlcjwvYj4uIEluc3RhbGwgYSBuZXdlciB2ZXJzaW9uIGZyb20gIgogICAgICAgICAgICAu LiAiPGEgaHJlZj1cImh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWRzL1wiPnB5dGhvbi5v cmc8L2E+LCB0aGVuIHJlc3RhcnQgUmVzb2x2ZS4iKQogICAgICAgIHJldHVybgogICAgZW5kCgog ICAgbGF1bmNoKGxpYl9wYXRoKQplbmQKCm1haW4oKQo= ]], } PAYLOAD[#PAYLOAD + 1] = { name = "auphonic_lib.zip", size = 262560, adler32 = 1677687765, data = [[ UEsDBBQAAAAAABRbal327ajGiQoAAIkKAAAcAAAAYXVwaG9uaWNfcmVzb2x2ZS9fX2luaXRfXy5w eSIiIkF1cGhvbmljIGZvciBEYVZpbmNpIFJlc29sdmUuCgpJTVBPUlRBTlQ6IHRoaXMgbW9kdWxl IG11c3Qgc3RheSBwYXJzZWFibGUgYnkgb2xkIFB5dGhvbiAzIGludGVycHJldGVycywgc28gdGhh dAphIHRvby1vbGQgUHl0aG9uIGluc2lkZSBSZXNvbHZlIGNhbiBzdGlsbCBzaG93IGEgZnJpZW5k bHkgInBsZWFzZSB1cGdyYWRlIgptZXNzYWdlIGluc3RlYWQgb2YgYSBTeW50YXhFcnJvci4gRG8g bm90IHVzZSBmLXN0cmluZ3MsIHRoZSB3YWxydXMgb3BlcmF0b3IsCmBgbWF0Y2hgYCwgdHlwZSBh bm5vdGF0aW9ucywgcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMgb3IgYW55IG90aGVyIHN5bnRh eApuZXdlciB0aGFuIFB5dGhvbiAzLjAgaGVyZTsgcHV0IHR5cGUgaGludHMgaW4gYGAjIHR5cGU6 YGAgY29tbWVudHMuCmBgdG9vbHMvY2hlY2tfb2xkX3N5bnRheC5weWBgIGVuZm9yY2VzIHRoaXMg aW4gQ0kuCiIiIgoKaW1wb3J0IG9zCmltcG9ydCBzeXMKCiMgT2xkLVB5dGhvbi1jb21wYXRpYmxl IHdheSB0byBpbXBvcnQgdHlwaW5nIG5hbWVzIGZvciBteXB5IG9ubHkuCk1ZUFkgPSBGYWxzZQpp ZiBNWVBZOgogICAgZnJvbSB0eXBpbmcgaW1wb3J0IEFueSAgIyBub3FhOiBGNDAxCgpNSU5fUFlU SE9OID0gKDMsIDEwKQoKCmRlZiBfcmVhZF92ZXJzaW9uKCk6CiAgICAjIHR5cGU6ICgpIC0+IHN0 cgogICAgIyBSZWxlYXNlIGJ1aWxkcyBzaGlwIGEgZ2VuZXJhdGVkIF92ZXJzaW9uLnB5LiBJbiBk ZXYgbW9kZSAocnVubmluZyBmcm9tCiAgICAjIHRoZSByZXBvc2l0b3J5KSBmYWxsIGJhY2sgdG8g dGhlIFZFUlNJT04gZmlsZSBhdCB0aGUgcmVwb3NpdG9yeSByb290LgogICAgdHJ5OgogICAgICAg IGZyb20gLl92ZXJzaW9uIGltcG9ydCBfX3ZlcnNpb25fXyBhcyB2ZXJzaW9uCgogICAgICAgIHJl dHVybiBzdHIodmVyc2lvbikKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzCiAg ICBoZXJlID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCiAgICBw YXRoID0gb3MucGF0aC5qb2luKGhlcmUsIG9zLnBhcmRpciwgb3MucGFyZGlyLCAiVkVSU0lPTiIp CiAgICB0cnk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgpIGFzIGhhbmRsZToKICAgICAgICAgICAg cmV0dXJuIGhhbmRsZS5yZWFkKCkuc3RyaXAoKQogICAgZXhjZXB0IChJT0Vycm9yLCBPU0Vycm9y KToKICAgICAgICByZXR1cm4gIjAuMC4wK3Vua25vd24iCgoKX192ZXJzaW9uX18gPSBfcmVhZF92 ZXJzaW9uKCkKCgpkZWYgX3Nob3dfdG9vX29sZF9kaWFsb2coZnVzaW9uLCBibWQsIG1lc3NhZ2Up OgogICAgIyB0eXBlOiAoQW55LCBBbnksIHN0cikgLT4gTm9uZQogICAgdWkgPSBnZXRhdHRyKGZ1 c2lvbiwgIlVJTWFuYWdlciIsIE5vbmUpCiAgICBpZiB1aSBpcyBOb25lIG9yIGJtZCBpcyBOb25l OgogICAgICAgIHJldHVybgogICAgZGlzcCA9IGJtZC5VSURpc3BhdGNoZXIodWkpCiAgICB3aW4g PSBkaXNwLkFkZFdpbmRvdygKICAgICAgICB7IklEIjogIkF1cGhvbmljVG9vT2xkIiwgIldpbmRv d1RpdGxlIjogIkF1cGhvbmljIiwgIkdlb21ldHJ5IjogWzMwMCwgMzAwLCA0NjAsIDE1MF19LAog ICAgICAgIHVpLlZHcm91cCgKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgdWkuTGFiZWwo eyJUZXh0IjogbWVzc2FnZSwgIldvcmRXcmFwIjogVHJ1ZX0pLAogICAgICAgICAgICAgICAgdWku QnV0dG9uKHsiSUQiOiAiQ2xvc2UiLCAiVGV4dCI6ICJDbG9zZSIsICJXZWlnaHQiOiAwfSksCiAg ICAgICAgICAgIF0KICAgICAgICApLAogICAgKQoKICAgIGRlZiBjbG9zZShldik6CiAgICAgICAg IyB0eXBlOiAoQW55KSAtPiBOb25lCiAgICAgICAgZGlzcC5FeGl0TG9vcCgpCgogICAgd2luLk9u LkNsb3NlLkNsaWNrZWQgPSBjbG9zZQogICAgd2luLk9uLkF1cGhvbmljVG9vT2xkLkNsb3NlID0g Y2xvc2UKICAgIHdpbi5TaG93KCkKICAgIGRpc3AuUnVuTG9vcCgpCiAgICB3aW4uSGlkZSgpCgoK ZGVmIG1haW4oZnVzaW9uPU5vbmUsIGJtZD1Ob25lLCByZXNvbHZlPU5vbmUsIGRldj1GYWxzZSk6 CiAgICAjIHR5cGU6IChBbnksIEFueSwgQW55LCBib29sKSAtPiBOb25lCiAgICAiIiJFbnRyeSBw b2ludCBjYWxsZWQgYnkgdGhlIEx1YSBsYXVuY2hlciBpbnNpZGUgRGFWaW5jaSBSZXNvbHZlLiIi IgogICAgaWYgdHVwbGUoc3lzLnZlcnNpb25faW5mb1s6Ml0pIDwgTUlOX1BZVEhPTjoKICAgICAg ICBtZXNzYWdlID0gKAogICAgICAgICAgICAiRGFWaW5jaSBSZXNvbHZlIGlzIHVzaW5nIFB5dGhv biAlZC4lZCwgYnV0IEF1cGhvbmljIG5lZWRzIFB5dGhvbiAlZC4lZCBvciBuZXdlci4iCiAgICAg ICAgICAgICUgKAogICAgICAgICAgICAgICAgc3lzLnZlcnNpb25faW5mb1swXSwKICAgICAgICAg ICAgICAgIHN5cy52ZXJzaW9uX2luZm9bMV0sCiAgICAgICAgICAgICAgICBNSU5fUFlUSE9OWzBd LAogICAgICAgICAgICAgICAgTUlOX1BZVEhPTlsxXSwKICAgICAgICAgICAgKQogICAgICAgICkK ICAgICAgICBwcmludCgiW0F1cGhvbmljXSAiICsgbWVzc2FnZSkKICAgICAgICBfc2hvd190b29f b2xkX2RpYWxvZyhmdXNpb24sIGJtZCwgbWVzc2FnZSkKICAgICAgICByZXR1cm4KICAgIGZyb20g LiBpbXBvcnQgYXBwCgogICAgYXBwLnJ1bihmdXNpb249ZnVzaW9uLCBibWQ9Ym1kLCByZXNvbHZl PXJlc29sdmUsIGRldj1kZXYpClBLAwQUAAAAAAAUW2pdPcfUZkcAAABHAAAAHAAAAGF1cGhvbmlj X3Jlc29sdmUvX3ZlcnNpb24ucHkiIiJHZW5lcmF0ZWQgYnkgdG9vbHMvYnVpbGQucHkgZnJvbSBW RVJTSU9OLiIiIgoKX192ZXJzaW9uX18gPSAiMS4wLjAiClBLAwQUAAAAAAAUW2pdx4aabR42AAAe NgAAFwAAAGF1cGhvbmljX3Jlc29sdmUvYXBwLnB5IiIiQXBwbGljYXRpb24gb3JjaGVzdHJhdGlv bjogc3RhcnR1cCwgc2NyZWVucywgbG9naW4gc3RhdGUuIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1w b3J0IGFubm90YXRpb25zCgppbXBvcnQgdGhyZWFkaW5nCmZyb20gdHlwaW5nIGltcG9ydCBBbnkK CmZyb20gLiBpbXBvcnQgX192ZXJzaW9uX18sIGNvbXBhdCwgY29uZmlnLCBsaW5rcywgbG9nLCBy ZXNvbHZlX2lvCmZyb20gLmF1cGhvbmljX2FwaSBpbXBvcnQgQXBpRXJyb3IsIEF1dGhFcnJvciwg TmV0d29ya0Vycm9yLCBTZXJ2aWNlRXJyb3IKZnJvbSAuYXV0aCBpbXBvcnQgQXV0aE1hbmFnZXIs IFNlc3Npb24KZnJvbSAuY3JlZGVudGlhbHMgaW1wb3J0IEtleXJpbmdTdG9yZSwgZGVmYXVsdF9z dG9yZQpmcm9tIC5tYWluX3NjcmVlbiBpbXBvcnQgTWFpblNjcmVlbgpmcm9tIC51aS5sb2dpbiBp bXBvcnQgTG9naW5XaW5kb3cKZnJvbSAudWkubG9nbyBpbXBvcnQgbG9nb19odG1sCmZyb20gLnVp Lm1haW4gaW1wb3J0IE1JTl9XSU5ET1dfU0laRSwgTWFpbkNhbGxiYWNrcywgTWFpbldpbmRvdwpm cm9tIC51aS50YXNrcyBpbXBvcnQgVGFza1J1bm5lcgoKVElNRVJfSUQgPSAiQXVwaG9uaWNUaW1l ciIKVElNRVJfSU5URVJWQUxfTVMgPSA1MDAKIyBDaGVjayB0aGUgdGltZWxpbmUgZm9yIGNoYW5n ZXMgZXZlcnkgdGhpcyBtYW55IHRpbWVyIHRpY2tzICgyIHMpLgpQT0xMX0VWRVJZX1RJQ0tTID0g NAoKUFlUSE9OX05PVElDRSA9ICgKICAgICJEYVZpbmNpIFJlc29sdmUgaXMgdXNpbmcgYW5vdGhl ciBQeXRob24gdGhhbiBpdHMgYnVpbHQtaW4gb25lLiBJZiB5b3UgcnVuIGludG8gIgogICAgInBy b2JsZW1zLCBzZWUgdGhlIHdhcm5pbmcgaW4gdGhlIENvbnNvbGUgKFdvcmtzcGFjZSDihpIgQ29u c29sZSkuIgopCgpOT1RfU0FWRURfTk9USUNFID0gKAogICAgIllvdXIgQVBJIGtleSBjb3VsZG4n dCBiZSBzYXZlZCBpbiB7c3RvcmV9LCBzbyB5b3UnbGwgbmVlZCB0byBwYXN0ZSBpdCBhZ2FpbiBu ZXh0ICIKICAgICJ0aW1lLiBEZXRhaWxzIGFyZSBpbiB0aGUgQ29uc29sZSAoV29ya3NwYWNlIOKG kiBDb25zb2xlKS4iCikKTk9fS0VZUklOR19XQVJOSU5HID0gKAogICAgIk5vIHN5c3RlbSBrZXly aW5nIGZvdW5kLCBzbyB0aGUgQVBJIGtleSBjYW4ndCBiZSByZW1lbWJlcmVkIGFuZCBpcyBvbmx5 IGtlcHQgaW4gIgogICAgIm1lbW9yeS4gT24gTGludXgsIGluc3RhbGwgc2VjcmV0LXRvb2wgKHBh Y2thZ2UgbGlic2VjcmV0LXRvb2xzIG9yIGxpYnNlY3JldCkgYW5kIGEgIgogICAgImtleXJpbmcg c3VjaCBhcyBHTk9NRSBLZXlyaW5nIG9yIEtXYWxsZXQuIgopCgoKZGVmIHJ1bigqLCBmdXNpb246 IEFueSwgYm1kOiBBbnksIHJlc29sdmU6IEFueSwgZGV2OiBib29sKSAtPiBOb25lOgogICAgbG9n LnNldF92ZXJib3NlKGRldikKICAgIHJlc29sdmUsIGhvdyA9IHJlc29sdmVfaW8uZmluZF9yZXNv bHZlKHJlc29sdmUsIGJtZCwgZnVzaW9uKQogICAgbG9nLmVtaXQobG9nLmRpYWdub3N0aWNfbGlu ZShfX3ZlcnNpb25fXywgcmVzb2x2ZSkpCiAgICBsb2cuZGVidWcoZiJSZXNvbHZlIG9iamVjdCBv YnRhaW5lZCB2aWEge2hvd30iKQogICAgcHl0aG9uX3dhcm5pbmcgPSBjb21wYXQucHl0aG9uX3dh cm5pbmcocmVzb2x2ZSkKICAgIGlmIHB5dGhvbl93YXJuaW5nOgogICAgICAgIGxvZy53YXJuaW5n KHB5dGhvbl93YXJuaW5nKQogICAgaWYgZnVzaW9uIGlzIE5vbmUgb3IgYm1kIGlzIE5vbmU6CiAg ICAgICAgbG9nLmVycm9yKCJGdXNpb24gVUlNYW5hZ2VyIGlzIG5vdCBhdmFpbGFibGUsIHNvIG5v IHdpbmRvdyBjYW4gYmUgc2hvd24uIikKICAgICAgICByZXR1cm4KICAgIEFwcChmdXNpb249ZnVz aW9uLCBibWQ9Ym1kLCByZXNvbHZlPXJlc29sdmUsIGRldj1kZXYsIHB5dGhvbl93YXJuaW5nPXB5 dGhvbl93YXJuaW5nKS5ydW4oKQoKCmRlZiBfcGFpcih2YWx1ZTogQW55KSAtPiBsaXN0W2ludF0g fCBOb25lOgogICAgIiIiVHdvIG51bWJlcnMgZnJvbSBhIFVJTWFuYWdlciByZXN1bHQ6IGEgbGlz dCwgb3IgYSBMdWEtc3R5bGUgdGFibGUgYGB7MTogeCwgMjogeX1gYC4iIiIKICAgIGlmIGlzaW5z dGFuY2UodmFsdWUsIGRpY3QpOgogICAgICAgIHZhbHVlID0gW3ZhbHVlW2tdIGZvciBrIGluIHNv cnRlZCh2YWx1ZSldCiAgICB0cnk6CiAgICAgICAgbnVtYmVycyA9IFtpbnQodikgZm9yIHYgaW4g bGlzdCh2YWx1ZSlbOjJdXQogICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgogICAg ICAgIHJldHVybiBOb25lCiAgICByZXR1cm4gbnVtYmVycyBpZiBsZW4obnVtYmVycykgPT0gMiBl bHNlIE5vbmUKCgpjbGFzcyBBcHA6CiAgICBkZWYgX19pbml0X18oCiAgICAgICAgc2VsZiwKICAg ICAgICAqLAogICAgICAgIGZ1c2lvbjogQW55LAogICAgICAgIGJtZDogQW55LAogICAgICAgIHJl c29sdmU6IEFueSwKICAgICAgICBkZXY6IGJvb2wgPSBGYWxzZSwKICAgICAgICBweXRob25fd2Fy bmluZzogc3RyIHwgTm9uZSA9IE5vbmUsCiAgICAgICAgc2V0dGluZ3Nfc3RvcmU6IGNvbmZpZy5T ZXR0aW5nc1N0b3JlIHwgTm9uZSA9IE5vbmUsCiAgICAgICAgY3JlZGVudGlhbF9zdG9yZTogS2V5 cmluZ1N0b3JlIHwgTm9uZSA9IE5vbmUsCiAgICAgICAgYXV0aDogQXV0aE1hbmFnZXIgfCBOb25l ID0gTm9uZSwKICAgICAgICB0YXNrczogVGFza1J1bm5lciB8IE5vbmUgPSBOb25lLAogICAgICAg IHBpcGVsaW5lX29wdGlvbnM6IGRpY3Rbc3RyLCBBbnldIHwgTm9uZSA9IE5vbmUsCiAgICApIC0+ IE5vbmU6CiAgICAgICAgc2VsZi5mdXNpb24gPSBmdXNpb24KICAgICAgICBzZWxmLmJtZCA9IGJt ZAogICAgICAgIHNlbGYucmVzb2x2ZSA9IHJlc29sdmUKICAgICAgICBzZWxmLmRldiA9IGRldgog ICAgICAgIHNlbGYucHl0aG9uX3dhcm5pbmcgPSBweXRob25fd2FybmluZwogICAgICAgIHNlbGYu c2V0dGluZ3Nfc3RvcmUgPSBzZXR0aW5nc19zdG9yZSBvciBjb25maWcuU2V0dGluZ3NTdG9yZSgp CiAgICAgICAgc2VsZi5zZXR0aW5ncyA9IHNlbGYuc2V0dGluZ3Nfc3RvcmUubG9hZCgpCiAgICAg ICAgc2VsZi5zdG9yZSA9IGNyZWRlbnRpYWxfc3RvcmUgb3IgZGVmYXVsdF9zdG9yZShzZWxmLnNl dHRpbmdzX3N0b3JlLmRpcmVjdG9yeSkKICAgICAgICBzZWxmLmF1dGggPSBhdXRoIG9yIEF1dGhN YW5hZ2VyKHNlbGYuc3RvcmUpCiAgICAgICAgc2VsZi50YXNrcyA9IHRhc2tzIG9yIFRhc2tSdW5u ZXIoKQogICAgICAgIHNlbGYuc2Vzc2lvbjogU2Vzc2lvbiB8IE5vbmUgPSBOb25lCiAgICAgICAg c2VsZi51aSA9IGZ1c2lvbi5VSU1hbmFnZXIKICAgICAgICBzZWxmLmRpc3AgPSBibWQuVUlEaXNw YXRjaGVyKHNlbGYudWkpCiAgICAgICAgZ2VvbWV0cnkgPSBzZWxmLl9zYXZlZF9nZW9tZXRyeSgp CiAgICAgICAgbG9nbyA9IGxvZ29faHRtbChzZWxmLnNldHRpbmdzX3N0b3JlLmRpcmVjdG9yeSAv ICJhc3NldHMiKQogICAgICAgIHNlbGYubG9naW4gPSBMb2dpbldpbmRvdygKICAgICAgICAgICAg c2VsZi51aSwKICAgICAgICAgICAgc2VsZi5kaXNwLAogICAgICAgICAgICBvbl9sb2dpbj1zZWxm Lm9uX2xvZ2luLAogICAgICAgICAgICBvbl9yZXRyeT1zZWxmLnJlc3RvcmUsCiAgICAgICAgICAg IG9uX2Nsb3NlPXNlbGYucXVpdCwKICAgICAgICAgICAgcG9zaXRpb249Z2VvbWV0cnlbOjJdIGlm IGdlb21ldHJ5IGVsc2UgTm9uZSwKICAgICAgICAgICAgbG9nbz1sb2dvLAogICAgICAgICkKICAg ICAgICBzZWxmLm1haW4gPSBNYWluV2luZG93KAogICAgICAgICAgICBzZWxmLnVpLAogICAgICAg ICAgICBzZWxmLmRpc3AsCiAgICAgICAgICAgIE1haW5DYWxsYmFja3MoCiAgICAgICAgICAgICAg ICBvbl9sb2dvdXQ9c2VsZi5vbl9sb2dvdXQsCiAgICAgICAgICAgICAgICBvbl9yZWZyZXNoX2Fj Y291bnQ9c2VsZi5vbl9yZWZyZXNoX2FjY291bnQsCiAgICAgICAgICAgICAgICBvbl9jbG9zZT1z ZWxmLnF1aXQsCiAgICAgICAgICAgICAgICBvbl90cmFja19jaGVja2VkPWxhbWJkYSBpLCBjaGVj a2VkOiBzZWxmLnNjcmVlbi5vbl90cmFja19jaGVja2VkKGksIGNoZWNrZWQpLAogICAgICAgICAg ICAgICAgb25fY2xpcF9jaGVja2VkPWxhbWJkYSB0LCBjLCBjaGVja2VkOiBzZWxmLnNjcmVlbi5v bl9jbGlwX2NoZWNrZWQodCwgYywgY2hlY2tlZCksCiAgICAgICAgICAgICAgICBvbl9wcmVzZXRf Y2hhbmdlZD1sYW1iZGEgaTogc2VsZi5zY3JlZW4ub25fcHJlc2V0X2NoYW5nZWQoaSksCiAgICAg ICAgICAgICAgICBvbl9yZWZyZXNoX3ByZXNldHM9bGFtYmRhOiBzZWxmLnNjcmVlbi5sb2FkX3By ZXNldHMoKSwKICAgICAgICAgICAgICAgIG9uX3JlZnJlc2hfdGltZWxpbmU9bGFtYmRhOiBzZWxm LnNjcmVlbi5yZWZyZXNoX3RpbWVsaW5lKCksCiAgICAgICAgICAgICAgICBvbl9jbGVhcl9pbl9v dXQ9bGFtYmRhOiBzZWxmLnNjcmVlbi5jbGVhcl9pbl9vdXQoKSwKICAgICAgICAgICAgICAgIG9u X211dGVfY2hhbmdlZD1sYW1iZGEgY2hlY2tlZDogc2VsZi5zY3JlZW4ub25fbXV0ZV9jaGFuZ2Vk KGNoZWNrZWQpLAogICAgICAgICAgICAgICAgb25fZm9sbG93X2NoYW5nZWQ9bGFtYmRhIGNoZWNr ZWQ6IHNlbGYuc2NyZWVuLm9uX2ZvbGxvd19jaGFuZ2VkKGNoZWNrZWQpLAogICAgICAgICAgICAg ICAgb25fc3RhcnQ9bGFtYmRhOiBzZWxmLnNjcmVlbi5vbl9zdGFydCgpLAogICAgICAgICAgICAg ICAgb25fZWRpdF9zdGFydD1sYW1iZGE6IHNlbGYuc2NyZWVuLm9uX3N0YXJ0KGVkaXRfZmlyc3Q9 VHJ1ZSksCiAgICAgICAgICAgICAgICBvbl9jYW5jZWw9bGFtYmRhOiBzZWxmLnNjcmVlbi5vbl9j YW5jZWwoKSwKICAgICAgICAgICAgICAgIG9uX2tlZXBfcHJvZHVjdGlvbj1sYW1iZGE6IHNlbGYu c2NyZWVuLm9uX2tlZXBfcHJvZHVjdGlvbigpLAogICAgICAgICAgICAgICAgb25fZGVsZXRlX3By b2R1Y3Rpb249bGFtYmRhOiBzZWxmLnNjcmVlbi5vbl9kZWxldGVfcHJvZHVjdGlvbigpLAogICAg ICAgICAgICAgICAgb25fYmFja190b19zZXR0aW5ncz1sYW1iZGE6IHNlbGYuc2NyZWVuLm9uX2Jh Y2tfdG9fc2V0dGluZ3MoKSwKICAgICAgICAgICAgICAgIG9uX2NvbnRpbnVlX3NpbGVudD1sYW1i ZGE6IHNlbGYuc2NyZWVuLm9uX2NvbnRpbnVlX3NpbGVudCgpLAogICAgICAgICAgICAgICAgb25f bmV3X3Byb2R1Y3Rpb249bGFtYmRhOiBzZWxmLnNjcmVlbi5vbl9uZXdfcHJvZHVjdGlvbigpLAog ICAgICAgICAgICAgICAgb25fZWRpdF9hZ2Fpbj1sYW1iZGE6IHNlbGYuc2NyZWVuLm9uX2VkaXRf YWdhaW4oKSwKICAgICAgICAgICAgICAgIG9uX29wZW5fdXJsPXNlbGYuX29wZW5fdXJsLAogICAg ICAgICAgICAgICAgb25fc2hvd19maWxlPWxhbWJkYTogc2VsZi5zY3JlZW4ub25fc2hvd19maWxl KCksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGdlb21ldHJ5PWdlb21ldHJ5LAogICAgICAg ICAgICBsb2dvPWxvZ28sCiAgICAgICAgKQogICAgICAgIHNlbGYuc2NyZWVuID0gTWFpblNjcmVl bigKICAgICAgICAgICAgc2VsZi5tYWluLAogICAgICAgICAgICByZXNvbHZlPXJlc29sdmUsCiAg ICAgICAgICAgIHNldHRpbmdzPXNlbGYuc2V0dGluZ3MsCiAgICAgICAgICAgIHNhdmVfc2V0dGlu Z3M9bGFtYmRhOiBzZWxmLnNldHRpbmdzX3N0b3JlLnNhdmUoc2VsZi5zZXR0aW5ncyksCiAgICAg ICAgICAgIHRhc2tzPXNlbGYudGFza3MsCiAgICAgICAgICAgIG9uX2F1dGhfZXJyb3I9c2VsZi5f b25fYXV0aF9lcnJvciwKICAgICAgICAgICAgb25fcHJvZHVjdGlvbl9kb25lPXNlbGYucmVmcmVz aF9jcmVkaXRzX3F1aWV0bHksCiAgICAgICAgICAgIHBpcGVsaW5lX29wdGlvbnM9cGlwZWxpbmVf b3B0aW9ucywKICAgICAgICApCiAgICAgICAgc2VsZi50aW1lcjogQW55ID0gTm9uZQogICAgICAg IHNlbGYuX3RpY2tzID0gMAoKICAgIGRlZiBfb3Blbl91cmwoc2VsZiwgdXJsOiBzdHIpIC0+IE5v bmU6CiAgICAgICAgaWYgdXJsOgogICAgICAgICAgICBsaW5rcy5vcGVuX3VybCh1cmwsIHNlbGYu Ym1kKQoKICAgICMgLS0gbGlmZWN5Y2xlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBkZWYgcnVuKHNlbGYpIC0+ IE5vbmU6CiAgICAgICAgc2VsZi50aW1lciA9IHNlbGYudWkuVGltZXIoeyJJRCI6IFRJTUVSX0lE LCAiSW50ZXJ2YWwiOiBUSU1FUl9JTlRFUlZBTF9NU30pCiAgICAgICAgIyBPbmx5IHRoZSBkaWN0 LXN0eWxlIHJlZ2lzdHJhdGlvbiBmaXJlcyBpbiBSZXNvbHZlIChzZWUgZG9jcy9kZWNpc2lvbnMu bWQpLgogICAgICAgIHNlbGYuZGlzcFsiT24iXVsiVGltZW91dCJdID0gc2VsZi5vbl90aW1lb3V0 CiAgICAgICAgc2VsZi50aW1lci5TdGFydCgpCiAgICAgICAgbG9nLnNldF91aV90aHJlYWQodGhy ZWFkaW5nLmdldF9pZGVudCgpKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5zdGFydCgp CiAgICAgICAgICAgIHNlbGYuZGlzcC5SdW5Mb29wKCkKICAgICAgICBmaW5hbGx5OgogICAgICAg ICAgICBzZWxmLnRpbWVyLlN0b3AoKQogICAgICAgICAgICBsb2cuZmx1c2hfcGVuZGluZygpCiAg ICAgICAgICAgIGxvZy5zZXRfdWlfdGhyZWFkKE5vbmUpCiAgICAgICAgICAgIHNlbGYubG9naW4u aGlkZSgpCiAgICAgICAgICAgIHNlbGYubWFpbi5oaWRlKCkKCiAgICBkZWYgc3RhcnQoc2VsZikg LT4gTm9uZToKICAgICAgICBpZiBub3Qgc2VsZi5zdG9yZS5hdmFpbGFibGU6CiAgICAgICAgICAg IGxvZy53YXJuaW5nKE5PX0tFWVJJTkdfV0FSTklORykKICAgICAgICAgICAgc2VsZi5sb2dpbi5z ZXRfY2FuX3JlbWVtYmVyKEZhbHNlKQogICAgICAgIHNlbGYubG9naW4uc2hvdyhzZWxmLnNldHRp bmdzLnJlbWVtYmVyX21lKQogICAgICAgIHNlbGYucmVzdG9yZSgpCgogICAgZGVmIHJlc3RvcmUo c2VsZikgLT4gTm9uZToKICAgICAgICAiIiJDaGVjayB0aGUgc2F2ZWQgbG9naW4gKGlmIGFueSkg aW4gdGhlIGJhY2tncm91bmQuIiIiCiAgICAgICAgc2VsZi5sb2dpbi5zaG93X3JldHJ5KEZhbHNl KQogICAgICAgIHNlbGYubG9naW4uc2V0X2J1c3koVHJ1ZSwgIkNoZWNraW5nIHlvdXIgc2F2ZWQg bG9naW7igKYiKQogICAgICAgIHNlbGYudGFza3MucnVuKCJyZXN0b3JlIiwgc2VsZi5hdXRoLnJl c3RvcmUsIHNlbGYub25fcmVzdG9yZWQpCgogICAgZGVmIHF1aXQoc2VsZikgLT4gTm9uZToKICAg ICAgICAjIENsb3NpbmcgdGhlIHdpbmRvdyBjYW5jZWxzIGEgcnVubmluZyBwcm9kdWN0aW9uLCBz byB0aGUgdHJhY2tzLCB0aGUgcGFnZQogICAgICAgICMgYW5kIHRoZSByZW5kZXIgcXVldWUgYXJl IHJlc3RvcmVkLgogICAgICAgIHNlbGYuc2NyZWVuLm9uX2NhbmNlbCgpCiAgICAgICAgc2VsZi5f c2F2ZV9nZW9tZXRyeSgpCiAgICAgICAgc2VsZi5kaXNwLkV4aXRMb29wKCkKCiAgICBkZWYgb25f dGltZW91dChzZWxmLCBldjogQW55KSAtPiBOb25lOgogICAgICAgIGlmIGV2IGlzIE5vbmUgb3Ig ZXZbIndobyJdID09IFRJTUVSX0lEOgogICAgICAgICAgICBsb2cuZmx1c2hfcGVuZGluZygpCiAg ICAgICAgICAgIHNlbGYudGFza3MucG9sbCgpCiAgICAgICAgICAgIHNlbGYuX3RpY2tzICs9IDEK ICAgICAgICAgICAgaWYgc2VsZi5zZXNzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAg c2VsZi5zY3JlZW4udGljaygpCiAgICAgICAgICAgICAgICBpZiBzZWxmLl90aWNrcyAlIFBPTExf RVZFUllfVElDS1MgPT0gMDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNjcmVlbi5wb2xsKCkK ICAgICAgICAgICAgICAgIGVsaWYgbm90IHNlbGYuc2NyZWVuLnJ1bm5pbmc6CiAgICAgICAgICAg ICAgICAgICAgIyBDbGlja2luZyBjbGlwcyBpbiB0aGUgdGltZWxpbmUgc2hvdWxkIHRpY2sgdGhl bSBxdWlja2x5LgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2NyZWVuLmZvbGxvd190aW1lbGlu ZV9zZWxlY3Rpb24oKQoKICAgICMgLS0gd2luZG93IHBvc2l0aW9uIC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGRlZiBf c2F2ZWRfZ2VvbWV0cnkoc2VsZikgLT4gbGlzdFtpbnRdIHwgTm9uZToKICAgICAgICBzYXZlZCA9 IHNlbGYuc2V0dGluZ3Mud2luZG93X3Bvc2l0aW9uCiAgICAgICAgaWYgbGVuKHNhdmVkKSA9PSA0 IGFuZCBhbGwoaXNpbnN0YW5jZSh2LCBpbnQpIGZvciB2IGluIHNhdmVkKToKICAgICAgICAgICAg eCwgeSwgdywgaCA9IHNhdmVkCiAgICAgICAgICAgICMgS2VlcCB0aGUgd2luZG93IHJlYWNoYWJs ZSBldmVuIGlmIHRoZSBzY3JlZW4gbGF5b3V0IGNoYW5nZWQuCiAgICAgICAgICAgIG1pbl93LCBt aW5faCA9IE1JTl9XSU5ET1dfU0laRQogICAgICAgICAgICByZXR1cm4gW21heCgwLCB4KSwgbWF4 KDAsIHkpLCBtYXgobWluX3csIHcpLCBtYXgobWluX2gsIGgpXQogICAgICAgIHJldHVybiBOb25l CgogICAgZGVmIF9zYXZlX2dlb21ldHJ5KHNlbGYpIC0+IE5vbmU6CiAgICAgICAgIiIiUmVtZW1i ZXIgd2hlcmUgdGhlIG1haW4gd2luZG93IGlzIGFuZCBob3cgYmlnIGl0IGlzLgoKICAgICAgICBS ZWFkaW5nIHRoZSBgYEdlb21ldHJ5YGAgYXR0cmlidXRlIGRpZG4ndCBjYXB0dXJlIGEgbW92ZWQg d2luZG93IGluIFJlc29sdmUgMjEuMQogICAgICAgIChpdCByZW9wZW5lZCBhdCB0aGUgZGVmYXVs dCksIHNvIHVzZSB0aGUgZG9jdW1lbnRlZCB3aW5kb3cgZnVuY3Rpb25zIGBgUG9zKClgYAogICAg ICAgIGFuZCBgYFNpemUoKWBgLCBhbmQgZmFsbCBiYWNrIHRvIHRoZSBhdHRyaWJ1dGUuCiAgICAg ICAgIiIiCiAgICAgICAgaWYgc2VsZi5zZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVy bgogICAgICAgIHdpbmRvdyA9IHNlbGYubWFpbi53aW4KICAgICAgICBnZW9tZXRyeTogbGlzdFtp bnRdIHwgTm9uZSA9IE5vbmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBvcywgc2l6ZSA9IF9w YWlyKHdpbmRvdy5Qb3MoKSksIF9wYWlyKHdpbmRvdy5TaXplKCkpCiAgICAgICAgICAgIGlmIHBv cyBhbmQgc2l6ZToKICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gcG9zICsgc2l6ZQogICAgICAg IGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICBsb2cuZGVidWcoZiJ3aW5kb3cg UG9zKCkvU2l6ZSgpIG5vdCBhdmFpbGFibGU6IHtleGMhcn0iKQogICAgICAgIGlmIGdlb21ldHJ5 IGlzIE5vbmU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHZhbHVlcyA9IHdpbmRv dy5HZW9tZXRyeQogICAgICAgICAgICAgICAgdmFsdWVzID0gbGlzdCh2YWx1ZXMudmFsdWVzKCkp IGlmIGlzaW5zdGFuY2UodmFsdWVzLCBkaWN0KSBlbHNlIGxpc3QodmFsdWVzKQogICAgICAgICAg ICAgICAgZ2VvbWV0cnkgPSBbaW50KHYpIGZvciB2IGluIHZhbHVlc1s6NF1dCiAgICAgICAgICAg IGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICAgICAgbG9nLmRlYnVnKGYid2lu ZG93IGdlb21ldHJ5IG5vdCByZWFkYWJsZToge2V4YyFyfSIpCiAgICAgICAgICAgICAgICByZXR1 cm4KICAgICAgICBsb2cuZGVidWcoZiJzYXZpbmcgd2luZG93IGdlb21ldHJ5IHtnZW9tZXRyeX0i KQogICAgICAgIGlmIGxlbihnZW9tZXRyeSkgPT0gNDoKICAgICAgICAgICAgc2VsZi5zZXR0aW5n cy53aW5kb3dfcG9zaXRpb24gPSBnZW9tZXRyeQogICAgICAgICAgICBzZWxmLnNldHRpbmdzX3N0 b3JlLnNhdmUoc2VsZi5zZXR0aW5ncykKCiAgICAjIC0tIGxvZ2luIC8gbG9nb3V0IC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K CiAgICBkZWYgb25fcmVzdG9yZWQoc2VsZiwgc2Vzc2lvbjogU2Vzc2lvbiB8IE5vbmUsIGVycm9y OiBCYXNlRXhjZXB0aW9uIHwgTm9uZSkgLT4gTm9uZToKICAgICAgICBpZiBlcnJvciBpcyBub3Qg Tm9uZToKICAgICAgICAgICAgc2VsZi5fcmVwb3J0KGVycm9yLCBzZWxmLmxvZ2luLnNob3dfZXJy b3IpCiAgICAgICAgICAgICMgT2ZmbGluZSBvciBBdXBob25pYyBkb3duOiB0aGUgc2F2ZWQgbG9n aW4gaXMga2VwdDsgb2ZmZXIgdG8gY2hlY2sgYWdhaW4uCiAgICAgICAgICAgIHNlbGYubG9naW4u c2hvd19yZXRyeShpc2luc3RhbmNlKGVycm9yLCAoTmV0d29ya0Vycm9yLCBTZXJ2aWNlRXJyb3Ip KSkKICAgICAgICBlbGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5sb2dpbi5z ZXRfYnVzeShGYWxzZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9lbnRlcl9tYWlu KHNlc3Npb24pCgogICAgZGVmIG9uX2xvZ2luKHNlbGYsIGFwaV9rZXk6IHN0ciwgcmVtZW1iZXI6 IGJvb2wpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5sb2dpbi5zaG93X3JldHJ5KEZhbHNlKQogICAg ICAgIHNlbGYubG9naW4uc2V0X2J1c3koVHJ1ZSwgIkxvZ2dpbmcgaW7igKYiKQogICAgICAgIHNl bGYudGFza3MucnVuKCJsb2dpbiIsIGxhbWJkYTogc2VsZi5hdXRoLmxvZ2luKGFwaV9rZXksIHJl bWVtYmVyKSwgc2VsZi5vbl9sb2dnZWRfaW4pCiAgICAgICAgaWYgc2VsZi5zdG9yZS5hdmFpbGFi bGU6ICAjIGVsc2UgdGhlIGNoZWNrYm94IGlzIG9mZiBhbmQgZGlzYWJsZWQKICAgICAgICAgICAg c2VsZi5zZXR0aW5ncy5yZW1lbWJlcl9tZSA9IHJlbWVtYmVyCiAgICAgICAgICAgIHNlbGYuc2V0 dGluZ3Nfc3RvcmUuc2F2ZShzZWxmLnNldHRpbmdzKQoKICAgIGRlZiBvbl9sb2dnZWRfaW4oc2Vs Ziwgc2Vzc2lvbjogU2Vzc2lvbiB8IE5vbmUsIGVycm9yOiBCYXNlRXhjZXB0aW9uIHwgTm9uZSkg LT4gTm9uZToKICAgICAgICBpZiBlcnJvciBpcyBub3QgTm9uZSBvciBzZXNzaW9uIGlzIE5vbmU6 CiAgICAgICAgICAgIHNlbGYuX3JlcG9ydChlcnJvciwgc2VsZi5sb2dpbi5zaG93X2Vycm9yKQog ICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmxvZ2luLmNsZWFyX2FwaV9rZXkoKQogICAg ICAgIHNlbGYuX2VudGVyX21haW4oc2Vzc2lvbikKICAgICAgICBpZiBzZWxmLnN0b3JlLmF2YWls YWJsZSBhbmQgc2VsZi5zZXR0aW5ncy5yZW1lbWJlcl9tZSBhbmQgbm90IHNlc3Npb24ucmVtZW1i ZXJlZDoKICAgICAgICAgICAgc2VsZi5tYWluLnNob3dfbm90aWNlKE5PVF9TQVZFRF9OT1RJQ0Uu Zm9ybWF0KHN0b3JlPXNlbGYuc3RvcmUubmFtZSkpCgogICAgZGVmIG9uX2xvZ291dChzZWxmKSAt PiBOb25lOgogICAgICAgIHNlbGYuYXV0aC5sb2dvdXQoKQogICAgICAgIHNlbGYuc2Vzc2lvbiA9 IE5vbmUKICAgICAgICBzZWxmLm1haW4uaGlkZSgpCiAgICAgICAgc2VsZi5sb2dpbi5zZXRfYnVz eShGYWxzZSkKICAgICAgICBzZWxmLmxvZ2luLnNob3coc2VsZi5zZXR0aW5ncy5yZW1lbWJlcl9t ZSkKCiAgICBkZWYgX2VudGVyX21haW4oc2VsZiwgc2Vzc2lvbjogU2Vzc2lvbikgLT4gTm9uZToK ICAgICAgICBzZWxmLnNlc3Npb24gPSBzZXNzaW9uCiAgICAgICAgc2VsZi5sb2dpbi5oaWRlKCkK ICAgICAgICBzZWxmLm1haW4uc2V0X2FjY291bnRfYnVzeShGYWxzZSkKICAgICAgICBzZWxmLm1h aW4uc2V0X3N0YXR1cygiIikKICAgICAgICBzZWxmLnNjcmVlbi5lbnRlcihzZXNzaW9uLmNsaWVu dCwgc2Vzc2lvbi5hY2NvdW50KQogICAgICAgIHNlbGYubWFpbi5zaG93KCkKICAgICAgICBpZiBz ZWxmLnB5dGhvbl93YXJuaW5nOgogICAgICAgICAgICBzZWxmLm1haW4uc2hvd19ub3RpY2UoUFlU SE9OX05PVElDRSkKICAgICAgICAgICAgc2VsZi5weXRob25fd2FybmluZyA9IE5vbmUgICMgb25j ZSBwZXIgc2Vzc2lvbgoKICAgICMgLS0gYWNjb3VudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZGVm IG9uX3JlZnJlc2hfYWNjb3VudChzZWxmKSAtPiBOb25lOgogICAgICAgIGlmIHNlbGYuc2Vzc2lv biBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLm1haW4uc2V0X2FjY291 bnRfYnVzeShUcnVlKQogICAgICAgIHNlbGYubWFpbi5zZXRfc3RhdHVzKCJSZWZyZXNoaW5n4oCm IikKICAgICAgICBzZWxmLnRhc2tzLnJ1bigiYWNjb3VudCIsIHNlbGYuc2Vzc2lvbi5jbGllbnQu Z2V0X2FjY291bnQsIHNlbGYub25fYWNjb3VudCkKCiAgICBkZWYgb25fYWNjb3VudChzZWxmLCBh Y2NvdW50OiBBbnksIGVycm9yOiBCYXNlRXhjZXB0aW9uIHwgTm9uZSkgLT4gTm9uZToKICAgICAg ICBzZWxmLm1haW4uc2V0X2FjY291bnRfYnVzeShGYWxzZSkKICAgICAgICBpZiBpc2luc3RhbmNl KGVycm9yLCBBdXRoRXJyb3IpOgogICAgICAgICAgICBzZWxmLl9vbl9hdXRoX2Vycm9yKGVycm9y KQogICAgICAgIGVsaWYgZXJyb3IgaXMgbm90IE5vbmUgb3Igc2VsZi5zZXNzaW9uIGlzIE5vbmU6 CiAgICAgICAgICAgIHNlbGYuX3JlcG9ydChlcnJvciwgc2VsZi5tYWluLnNob3dfZXJyb3IpCiAg ICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zZXNzaW9uLmFjY291bnQgPSBhY2NvdW50CiAg ICAgICAgICAgIHNlbGYubWFpbi5zZXRfc3RhdHVzKCIiKQogICAgICAgICAgICBzZWxmLnNjcmVl bi5zZXRfYWNjb3VudChhY2NvdW50KQoKICAgIGRlZiByZWZyZXNoX2NyZWRpdHNfcXVpZXRseShz ZWxmKSAtPiBOb25lOgogICAgICAgICIiIlVwZGF0ZSB0aGUgcmVtYWluaW5nIGNyZWRpdHMgYWZ0 ZXIgYSBwcm9kdWN0aW9uLCB3aXRob3V0IHRvdWNoaW5nIHRoZSBzdGF0dXMuIiIiCiAgICAgICAg aWYgc2VsZi5zZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYu dGFza3MucnVuKCJjcmVkaXRzIiwgc2VsZi5zZXNzaW9uLmNsaWVudC5nZXRfYWNjb3VudCwgc2Vs Zi5fb25fcXVpZXRfYWNjb3VudCkKCiAgICBkZWYgX29uX3F1aWV0X2FjY291bnQoc2VsZiwgYWNj b3VudDogQW55LCBlcnJvcjogQmFzZUV4Y2VwdGlvbiB8IE5vbmUpIC0+IE5vbmU6CiAgICAgICAg aWYgZXJyb3IgaXMgTm9uZSBhbmQgc2VsZi5zZXNzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAg ICBzZWxmLnNlc3Npb24uYWNjb3VudCA9IGFjY291bnQKICAgICAgICAgICAgc2VsZi5zY3JlZW4u c2V0X2FjY291bnQoYWNjb3VudCkKICAgICAgICBlbGlmIGVycm9yIGlzIG5vdCBOb25lOgogICAg ICAgICAgICBsb2cuZGVidWcoZiJyZWZyZXNoaW5nIHRoZSBjcmVkaXRzIGFmdGVyIHRoZSBwcm9k dWN0aW9uIGZhaWxlZDoge2Vycm9yIXJ9IikKCiAgICBkZWYgX29uX2F1dGhfZXJyb3Ioc2VsZiwg ZXJyb3I6IEF1dGhFcnJvcikgLT4gTm9uZToKICAgICAgICAiIiJUaGUgdG9rZW4gc3RvcHBlZCB3 b3JraW5nOiBiYWNrIHRvIHRoZSBsb2dpbiBzY3JlZW4gd2l0aCB0aGUgcmVhc29uLiIiIgogICAg ICAgIHNlbGYub25fbG9nb3V0KCkKICAgICAgICBzZWxmLmxvZ2luLnNob3dfZXJyb3Ioc3RyKGVy cm9yKSkKCiAgICAjIC0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGRlZiBfcmVwb3J0 KHNlbGYsIGVycm9yOiBCYXNlRXhjZXB0aW9uIHwgTm9uZSwgc2hvdzogQW55KSAtPiBOb25lOgog ICAgICAgICIiIlNob3cgYSBvbmUtc2VudGVuY2UgbWVzc2FnZTsgdW5leHBlY3RlZCBlcnJvcnMg YWxzbyBnZXQgYSBmdWxsIHRyYWNlYmFjay4iIiIKICAgICAgICBpZiBpc2luc3RhbmNlKGVycm9y LCBBcGlFcnJvcik6CiAgICAgICAgICAgIHNob3coc3RyKGVycm9yKSkKICAgICAgICBlbHNlOgog ICAgICAgICAgICBsb2cuZXJyb3IoIlVuZXhwZWN0ZWQgZXJyb3IuIiwgZXJyb3IpCiAgICAgICAg ICAgIHNob3cobGlua3MuVU5FWFBFQ1RFRF9FUlJPUikKUEsDBBQAAAAAABRbal1108FLHC0AABwt AAAdAAAAYXVwaG9uaWNfcmVzb2x2ZS9hdWRpb2ZpbGUucHkiIiJSZWFkIHRoZSBmb3JtYXQgYW5k IGxlbmd0aCBvZiByZW5kZXJlZCBhdWRpbyAoV0FWLCBSRjY0LCBGTEFDKSwgc3RhbmRhcmQgbGli cmFyeSBvbmx5LgoKVXNlZCB0byBjaGVjayBldmVyeSByZW5kZXI6IFJlc29sdmUncyByZW5kZXJl ZCBsZW5ndGggdGVsbHMgdXMgd2hldGhlciB0aGUgcmVxdWVzdGVkCnJhbmdlIHdhcyByZW5kZXJl ZCBleGFjdGx5LCB3aGljaCBtYXR0ZXJzIGZvciBrZWVwaW5nIHRoZSByZXN1bHQgaW4gc3luYzsg YW5kIHdoZXRoZXIKdGhlIHJlbmRlciBpcyBjb21wbGV0ZSBzaWxlbmNlIChlLmcuIHRoZSB0aWNr ZWQgdHJhY2tzIHdlcmUgc29sb2VkIGF3YXkpLgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQg YW5ub3RhdGlvbnMKCmltcG9ydCBzdHJ1Y3QKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNs YXNzCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIHR5cGluZyBpbXBvcnQgQmluYXJ5SU8K CgpjbGFzcyBBdWRpb0ZpbGVFcnJvcihFeGNlcHRpb24pOgogICAgcGFzcwoKCkBkYXRhY2xhc3Mo ZnJvemVuPVRydWUpCmNsYXNzIEF1ZGlvSW5mbzoKICAgIHNhbXBsZV9yYXRlOiBpbnQKICAgIGNo YW5uZWxzOiBpbnQKICAgIGJpdHNfcGVyX3NhbXBsZTogaW50CiAgICBmcmFtZXM6IGludCAgIyBz YW1wbGUgZnJhbWVzIChvbmUgc2FtcGxlIHBlciBjaGFubmVsKQoKICAgIEBwcm9wZXJ0eQogICAg ZGVmIHNlY29uZHMoc2VsZikgLT4gZmxvYXQ6CiAgICAgICAgcmV0dXJuIHNlbGYuZnJhbWVzIC8g c2VsZi5zYW1wbGVfcmF0ZSBpZiBzZWxmLnNhbXBsZV9yYXRlIGVsc2UgMC4wCgogICAgZGVmIGRl c2NyaWJlKHNlbGYpIC0+IHN0cjoKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBmIntzZWxm LnNlY29uZHM6LjNmfSBzLCB7c2VsZi5zYW1wbGVfcmF0ZX0gSHosIHtzZWxmLmJpdHNfcGVyX3Nh bXBsZX0tYml0LCAiCiAgICAgICAgICAgIGYie3NlbGYuY2hhbm5lbHN9IGNoYW5uZWx7J3MnICog KHNlbGYuY2hhbm5lbHMgIT0gMSl9IgogICAgICAgICkKCgpkZWYgcmVhZF93YXZfaW5mbyhwYXRo OiBQYXRoKSAtPiBBdWRpb0luZm86CiAgICB3aXRoIG9wZW4ocGF0aCwgInJiIikgYXMgaGFuZGxl OgogICAgICAgIGhlYWRlciA9IGhhbmRsZS5yZWFkKDEyKQogICAgICAgIGlmIGxlbihoZWFkZXIp IDwgMTIgb3IgaGVhZGVyWzg6MTJdICE9IGIiV0FWRSIgb3IgaGVhZGVyWzo0XSBub3QgaW4gKGIi UklGRiIsIGIiUkY2NCIpOgogICAgICAgICAgICByYWlzZSBBdWRpb0ZpbGVFcnJvcihmIntwYXRo Lm5hbWV9IGlzIG5vdCBhIFdBViBmaWxlIikKICAgICAgICByZjY0ID0gaGVhZGVyWzo0XSA9PSBi IlJGNjQiCiAgICAgICAgZGF0YV9zaXplXzY0OiBpbnQgfCBOb25lID0gTm9uZQogICAgICAgIGZt dDogdHVwbGVbaW50LCBpbnQsIGludCwgaW50XSB8IE5vbmUgPSBOb25lICAjIGZvcm1hdCB0YWcs IGNoYW5uZWxzLCByYXRlLCBiaXRzCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgY2h1 bmsgPSBoYW5kbGUucmVhZCg4KQogICAgICAgICAgICBpZiBsZW4oY2h1bmspIDwgODoKICAgICAg ICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGNodW5rX2lkLCBzaXplID0gY2h1bmtbOjRdLCBz dHJ1Y3QudW5wYWNrKCI8SSIsIGNodW5rWzQ6XSlbMF0KICAgICAgICAgICAgaWYgY2h1bmtfaWQg PT0gYiJkczY0IiBhbmQgcmY2NDoKICAgICAgICAgICAgICAgIGJvZHkgPSBoYW5kbGUucmVhZChz aXplKQogICAgICAgICAgICAgICAgaWYgbGVuKGJvZHkpIDwgMTY6CiAgICAgICAgICAgICAgICAg ICAgcmFpc2UgQXVkaW9GaWxlRXJyb3IoZiJ7cGF0aC5uYW1lfTogZHM2NCBjaHVuayB0b28gc2hv cnQiKQogICAgICAgICAgICAgICAgZGF0YV9zaXplXzY0ID0gc3RydWN0LnVucGFjaygiPFEiLCBi b2R5Wzg6MTZdKVswXQogICAgICAgICAgICBlbGlmIGNodW5rX2lkID09IGIiZm10ICI6CiAgICAg ICAgICAgICAgICBib2R5ID0gaGFuZGxlLnJlYWQoc2l6ZSkKICAgICAgICAgICAgICAgIGlmIGxl bihib2R5KSA8IDE2OgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEF1ZGlvRmlsZUVycm9yKGYi e3BhdGgubmFtZX06IGZtdCBjaHVuayB0b28gc2hvcnQiKQogICAgICAgICAgICAgICAgdGFnLCBj aGFubmVscywgcmF0ZSwgXywgXywgYml0cyA9IHN0cnVjdC51bnBhY2soIjxISElJSEgiLCBib2R5 WzoxNl0pCiAgICAgICAgICAgICAgICBmbXQgPSAodGFnLCBjaGFubmVscywgcmF0ZSwgYml0cykK ICAgICAgICAgICAgZWxpZiBjaHVua19pZCA9PSBiImRhdGEiOgogICAgICAgICAgICAgICAgaWYg Zm10IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXVkaW9GaWxlRXJyb3IoZiJ7 cGF0aC5uYW1lfTogZGF0YSBiZWZvcmUgZm9ybWF0IikKICAgICAgICAgICAgICAgIGRhdGFfc2l6 ZSA9IGRhdGFfc2l6ZV82NCBpZiAocmY2NCBhbmQgc2l6ZSA9PSAweEZGRkZGRkZGKSBlbHNlIHNp emUKICAgICAgICAgICAgICAgIF8sIGNoYW5uZWxzLCByYXRlLCBiaXRzID0gZm10CiAgICAgICAg ICAgICAgICBmcmFtZV9ieXRlcyA9IGNoYW5uZWxzICogKChiaXRzICsgNykgLy8gOCkKICAgICAg ICAgICAgICAgIGlmIG5vdCBmcmFtZV9ieXRlczoKICAgICAgICAgICAgICAgICAgICByYWlzZSBB dWRpb0ZpbGVFcnJvcihmIntwYXRoLm5hbWV9OiBpbnZhbGlkIGZvcm1hdCIpCiAgICAgICAgICAg ICAgICByZXR1cm4gQXVkaW9JbmZvKHJhdGUsIGNoYW5uZWxzLCBiaXRzLCAoZGF0YV9zaXplIG9y IDApIC8vIGZyYW1lX2J5dGVzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaGFu ZGxlLnNlZWsoc2l6ZSwgMSkKICAgICAgICAgICAgaWYgc2l6ZSAlIDI6ICAjIGNodW5rcyBhcmUg d29yZC1hbGlnbmVkCiAgICAgICAgICAgICAgICBoYW5kbGUuc2VlaygxLCAxKQogICAgcmFpc2Ug QXVkaW9GaWxlRXJyb3IoZiJ7cGF0aC5uYW1lfSBoYXMgbm8gYXVkaW8gZGF0YSIpCgoKZGVmIF9z a2lwX2lkMyhoYW5kbGU6IEJpbmFyeUlPKSAtPiBOb25lOgogICAgIiIiU2tpcCBhbiBJRDN2MiB0 YWcgc29tZSBlbmNvZGVycyBwdXQgaW4gZnJvbnQgb2YgRkxBQyBkYXRhLiIiIgogICAgaGVhZGVy ID0gaGFuZGxlLnJlYWQoMTApCiAgICBpZiBsZW4oaGVhZGVyKSA9PSAxMCBhbmQgaGVhZGVyWzoz XSA9PSBiIklEMyI6CiAgICAgICAgc2l6ZSA9IDAKICAgICAgICBmb3IgYnl0ZSBpbiBoZWFkZXJb NjoxMF06ICAjIHN5bmNzYWZlIGludGVnZXI6IDcgYml0cyBwZXIgYnl0ZQogICAgICAgICAgICBz aXplID0gKHNpemUgPDwgNykgfCAoYnl0ZSAmIDB4N0YpCiAgICAgICAgaGFuZGxlLnNlZWsoMTAg KyBzaXplKQogICAgZWxzZToKICAgICAgICBoYW5kbGUuc2VlaygwKQoKCmRlZiByZWFkX2ZsYWNf aW5mbyhwYXRoOiBQYXRoKSAtPiBBdWRpb0luZm86CiAgICAiIiJGb3JtYXQgYW5kIGxlbmd0aCBm cm9tIEZMQUMncyBTVFJFQU1JTkZPIGJsb2NrICh0aGUgZmlyc3QgbWV0YWRhdGEgYmxvY2spLiIi IgogICAgd2l0aCBvcGVuKHBhdGgsICJyYiIpIGFzIGhhbmRsZToKICAgICAgICBfc2tpcF9pZDMo aGFuZGxlKQogICAgICAgIGlmIGhhbmRsZS5yZWFkKDQpICE9IGIiZkxhQyI6CiAgICAgICAgICAg IHJhaXNlIEF1ZGlvRmlsZUVycm9yKGYie3BhdGgubmFtZX0gaXMgbm90IGEgRkxBQyBmaWxlIikK ICAgICAgICBibG9ja19oZWFkZXIgPSBoYW5kbGUucmVhZCg0KQogICAgICAgIGlmIGxlbihibG9j a19oZWFkZXIpIDwgNCBvciBibG9ja19oZWFkZXJbMF0gJiAweDdGICE9IDA6CiAgICAgICAgICAg IHJhaXNlIEF1ZGlvRmlsZUVycm9yKGYie3BhdGgubmFtZX06IFNUUkVBTUlORk8gbWlzc2luZyIp CiAgICAgICAgaW5mbyA9IGhhbmRsZS5yZWFkKDM0KQogICAgICAgIGlmIGxlbihpbmZvKSA8IDM0 OgogICAgICAgICAgICByYWlzZSBBdWRpb0ZpbGVFcnJvcihmIntwYXRoLm5hbWV9OiBTVFJFQU1J TkZPIHRydW5jYXRlZCIpCiAgICAgICAgcGFja2VkID0gaW50LmZyb21fYnl0ZXMoaW5mb1sxMDox OF0sICJiaWciKQogICAgICAgIHNhbXBsZV9yYXRlID0gcGFja2VkID4+IDQ0CiAgICAgICAgY2hh bm5lbHMgPSAoKHBhY2tlZCA+PiA0MSkgJiAweDcpICsgMQogICAgICAgIGJpdHMgPSAoKHBhY2tl ZCA+PiAzNikgJiAweDFGKSArIDEKICAgICAgICB0b3RhbF9zYW1wbGVzID0gcGFja2VkICYgMHhG RkZGRkZGRkYgICMgMCBtZWFucyAidW5rbm93biIKICAgICAgICBpZiBub3Qgc2FtcGxlX3JhdGU6 CiAgICAgICAgICAgIHJhaXNlIEF1ZGlvRmlsZUVycm9yKGYie3BhdGgubmFtZX06IGludmFsaWQg c2FtcGxlIHJhdGUiKQogICAgICAgIHJldHVybiBBdWRpb0luZm8oc2FtcGxlX3JhdGUsIGNoYW5u ZWxzLCBiaXRzLCB0b3RhbF9zYW1wbGVzKQoKCmRlZiByZWFkX2F1ZGlvX2luZm8ocGF0aDogUGF0 aCkgLT4gQXVkaW9JbmZvOgogICAgIiIiV0FWL1JGNjQgb3IgRkxBQywgYnkgZmlsZSBleHRlbnNp b24uIiIiCiAgICBpZiBwYXRoLnN1ZmZpeC5sb3dlcigpID09ICIuZmxhYyI6CiAgICAgICAgcmV0 dXJuIHJlYWRfZmxhY19pbmZvKHBhdGgpCiAgICByZXR1cm4gcmVhZF93YXZfaW5mbyhwYXRoKQoK CiMgLS0gc2lsZW5jZSAoZS5nLiBhbm90aGVyIHRyYWNrIHdhcyBzb2xvZWQ6IHRoZSByZW5kZXIg aXMgYWxsIHplcm9zKSAtLS0tLS0tLS0tLS0tLS0tCgpSRUFEX0NIVU5LID0gMSA8PCAxNgoKCmRl ZiBfd2F2X3NpbGVuY2UocGF0aDogUGF0aCkgLT4gdHVwbGVbYm9vbCB8IE5vbmUsIHN0cl06CiAg ICAiIiJXaGV0aGVyIGV2ZXJ5IHNhbXBsZSBpbiB0aGUgZGF0YSBjaHVuayBpcyB6ZXJvIChzdG9w cyBhdCB0aGUgZmlyc3QgdGhhdCBpc24ndCkuIiIiCiAgICBpbmZvID0gcmVhZF93YXZfaW5mbyhw YXRoKQogICAgZnJhbWVfYnl0ZXMgPSBpbmZvLmNoYW5uZWxzICogKChpbmZvLmJpdHNfcGVyX3Nh bXBsZSArIDcpIC8vIDgpCiAgICB3aXRoIG9wZW4ocGF0aCwgInJiIikgYXMgaGFuZGxlOgogICAg ICAgIGhhbmRsZS5zZWVrKDEyKQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGNodW5r ID0gaGFuZGxlLnJlYWQoOCkKICAgICAgICAgICAgaWYgbGVuKGNodW5rKSA8IDg6CiAgICAgICAg ICAgICAgICByZXR1cm4gTm9uZSwgIm5vIGRhdGEgY2h1bmsiCiAgICAgICAgICAgIGNodW5rX2lk LCBzaXplID0gY2h1bmtbOjRdLCBzdHJ1Y3QudW5wYWNrKCI8SSIsIGNodW5rWzQ6XSlbMF0KICAg ICAgICAgICAgaWYgY2h1bmtfaWQgPT0gYiJkYXRhIjoKICAgICAgICAgICAgICAgIGJyZWFrCiAg ICAgICAgICAgIGhhbmRsZS5zZWVrKHNpemUgKyBzaXplICUgMiwgMSkKICAgICAgICByZW1haW5p bmcsIGRvbmUgPSBpbmZvLmZyYW1lcyAqIGZyYW1lX2J5dGVzLCAwCiAgICAgICAgd2hpbGUgcmVt YWluaW5nID4gMDoKICAgICAgICAgICAgZGF0YSA9IGhhbmRsZS5yZWFkKG1pbihSRUFEX0NIVU5L LCByZW1haW5pbmcpKQogICAgICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgICAgIGJy ZWFrCiAgICAgICAgICAgIHJlc3QgPSBkYXRhLmxzdHJpcChiIlwwIikKICAgICAgICAgICAgaWYg cmVzdDoKICAgICAgICAgICAgICAgIG9mZnNldCA9IGRvbmUgKyBsZW4oZGF0YSkgLSBsZW4ocmVz dCkKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZSwgZiJhdWRpbyBhdCBzYW1wbGUgZnJhbWUg e29mZnNldCAvLyBmcmFtZV9ieXRlc30iCiAgICAgICAgICAgIHJlbWFpbmluZyAtPSBsZW4oZGF0 YSkKICAgICAgICAgICAgZG9uZSArPSBsZW4oZGF0YSkKICAgIHJldHVybiBUcnVlLCBmIntpbmZv LmZyYW1lc30gc2FtcGxlIGZyYW1lcywgYWxsIHplcm8iCgoKY2xhc3MgX0JpdHM6CiAgICAiIiJS ZWFkcyBiaXRzIGZyb20gYSBmaWxlLCBidWZmZXJpbmcgYWhlYWQgKEZMQUMgZnJhbWVzIGFyZW4n dCBieXRlLWFsaWduZWQgaW5zaWRlKS4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaGFuZGxl OiBCaW5hcnlJTykgLT4gTm9uZToKICAgICAgICBzZWxmLmhhbmRsZSA9IGhhbmRsZQogICAgICAg IHNlbGYuYnVmZmVyID0gYiIiCiAgICAgICAgc2VsZi5iaXQgPSAwICAjIHBvc2l0aW9uIGluIGBg YnVmZmVyYGAKICAgICAgICBzZWxmLmRyb3BwZWQgPSAwICAjIGJ5dGVzIGRyb3BwZWQgZnJvbSB0 aGUgZnJvbnQgb2YgYGBidWZmZXJgYCAoZm9yIG9mZnNldHMpCgogICAgZGVmIF9maWxsKHNlbGYs IGJpdHM6IGludCkgLT4gTm9uZToKICAgICAgICBpZiBzZWxmLmJpdCArIGJpdHMgPiBsZW4oc2Vs Zi5idWZmZXIpICogODoKICAgICAgICAgICAgc2VsZi5kcm9wcGVkICs9IHNlbGYuYml0IC8vIDgK ICAgICAgICAgICAgc2VsZi5idWZmZXIgPSBzZWxmLmJ1ZmZlcltzZWxmLmJpdCAvLyA4IDpdICsg c2VsZi5oYW5kbGUucmVhZChSRUFEX0NIVU5LKQogICAgICAgICAgICBzZWxmLmJpdCAlPSA4CiAg ICAgICAgICAgIGlmIHNlbGYuYml0ICsgYml0cyA+IGxlbihzZWxmLmJ1ZmZlcikgKiA4OgogICAg ICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKCiAgICBkZWYgYXRfZW5kKHNlbGYpIC0+IGJvb2w6 CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9maWxsKDgpCiAgICAgICAgZXhjZXB0IEVP RkVycm9yOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAg IGRlZiByZWFkKHNlbGYsIGJpdHM6IGludCkgLT4gaW50OgogICAgICAgIHNlbGYuX2ZpbGwoYml0 cykKICAgICAgICBzdGFydCwgZW5kID0gc2VsZi5iaXQgLy8gOCwgKHNlbGYuYml0ICsgYml0cyAr IDcpIC8vIDgKICAgICAgICBzcGFuID0gaW50LmZyb21fYnl0ZXMoc2VsZi5idWZmZXJbc3RhcnQ6 ZW5kXSwgImJpZyIpCiAgICAgICAgdmFsdWUgPSAoc3BhbiA+PiAoZW5kICogOCAtIHNlbGYuYml0 IC0gYml0cykpICYgKCgxIDw8IGJpdHMpIC0gMSkKICAgICAgICBzZWxmLmJpdCArPSBiaXRzCiAg ICAgICAgcmV0dXJuIHZhbHVlCgogICAgZGVmIGFsaWduKHNlbGYpIC0+IE5vbmU6CiAgICAgICAg c2VsZi5iaXQgPSAoc2VsZi5iaXQgKyA3KSAvLyA4ICogOAoKCl9GTEFDX1NBTVBMRV9TSVpFUyA9 IHsxOiA4LCAyOiAxMiwgNDogMTYsIDU6IDIwLCA2OiAyNCwgNzogMzJ9CgoKZGVmIF9mbGFjX3Np bGVuY2UocGF0aDogUGF0aCkgLT4gdHVwbGVbYm9vbCB8IE5vbmUsIHN0cl06CiAgICAiIiJXaGV0 aGVyIGV2ZXJ5IEZMQUMgZnJhbWUgaXMgYWxsIHplcm9zIChOb25lOiB0aGUgc3RyZWFtIGlzbid0 IHVuZGVyc3Rvb2QpLCBhbmQKICAgIHdoeSwgZm9yIHRoZSBsb2cuCgogICAgRW5jb2RlcnMgc3Rv cmUgYSBibG9jayB3aG9zZSBzYW1wbGVzIGFyZSBhbGwgZXF1YWwgYXMgYSBDT05TVEFOVCBzdWJm cmFtZSwgc28gYQogICAgc2lsZW50IGZpbGUgY29uc2lzdHMgb25seSBvZiB0aG9zZSwgd2l0aCB0 aGUgdmFsdWUgMC4gVGhlIGZyYW1lcyBhcmUgd2Fsa2VkCiAgICAoaGVhZGVyLCBzdWJmcmFtZSBo ZWFkZXJzLCBDUkMpOyB0aGUgZmlyc3QgZnJhbWUgd2l0aCByZWFsIGF1ZGlvIGVuZHMgdGhlIHdh bGssIHNvCiAgICB0aGlzIGlzIHF1aWNrIGZvciBub3JtYWwgYXVkaW8uCiAgICAiIiIKICAgIGlu Zm8gPSByZWFkX2ZsYWNfaW5mbyhwYXRoKQogICAgd2l0aCBvcGVuKHBhdGgsICJyYiIpIGFzIGhh bmRsZToKICAgICAgICBfc2tpcF9pZDMoaGFuZGxlKQogICAgICAgIGhhbmRsZS5zZWVrKDQsIDEp ICAjICJmTGFDIgogICAgICAgIHdoaWxlIFRydWU6ICAjIG1ldGFkYXRhIGJsb2NrcwogICAgICAg ICAgICBoZWFkZXIgPSBoYW5kbGUucmVhZCg0KQogICAgICAgICAgICBpZiBsZW4oaGVhZGVyKSA8 IDQ6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZSwgIm1ldGFkYXRhIGN1dCBvZmYiCiAgICAg ICAgICAgIGhhbmRsZS5zZWVrKGludC5mcm9tX2J5dGVzKGhlYWRlclsxOjRdLCAiYmlnIiksIDEp CiAgICAgICAgICAgIGlmIGhlYWRlclswXSAmIDB4ODA6ICAjIHRoZSBsYXN0IG9uZQogICAgICAg ICAgICAgICAgYnJlYWsKICAgICAgICBzdGFydCA9IGhhbmRsZS50ZWxsKCkKICAgICAgICBiaXRz ID0gX0JpdHMoaGFuZGxlKQogICAgICAgIGZyYW1lcyA9IDAKICAgICAgICB0cnk6CiAgICAgICAg ICAgIHdoaWxlIG5vdCBiaXRzLmF0X2VuZCgpOgogICAgICAgICAgICAgICAgb2Zmc2V0ID0gc3Rh cnQgKyBiaXRzLmRyb3BwZWQgKyBiaXRzLmJpdCAvLyA4CiAgICAgICAgICAgICAgICBzaWxlbnQs IHdoeSA9IF9mbGFjX2ZyYW1lX3NpbGVuY2UoYml0cywgaW5mby5iaXRzX3Blcl9zYW1wbGUpCiAg ICAgICAgICAgICAgICBpZiBzaWxlbnQgaXMgbm90IFRydWU6CiAgICAgICAgICAgICAgICAgICAg cmV0dXJuIHNpbGVudCwgZiJmcmFtZSB7ZnJhbWVzfSAoYnl0ZSB7b2Zmc2V0fSk6IHt3aHl9Igog ICAgICAgICAgICAgICAgZnJhbWVzICs9IDEKICAgICAgICBleGNlcHQgRU9GRXJyb3I6CiAgICAg ICAgICAgIHJldHVybiBOb25lLCBmImZyYW1lIHtmcmFtZXN9IGlzIGN1dCBvZmYiCiAgICBpZiBu b3QgZnJhbWVzOgogICAgICAgIHJldHVybiBOb25lLCAibm8gYXVkaW8gZnJhbWVzIgogICAgcmV0 dXJuIFRydWUsIGYie2ZyYW1lc30gZnJhbWVzLCBhbGwgY29uc3RhbnQgemVybyIKCgpfU1VCRlJB TUVfS0lORFMgPSB7MDogIkNPTlNUQU5UIiwgMTogIlZFUkJBVElNIn0KCgpkZWYgX3N1YmZyYW1l X2tpbmQoa2luZDogaW50KSAtPiBzdHI6CiAgICBpZiBraW5kIGluIF9TVUJGUkFNRV9LSU5EUzoK ICAgICAgICByZXR1cm4gX1NVQkZSQU1FX0tJTkRTW2tpbmRdCiAgICBpZiA4IDw9IGtpbmQgPD0g MTI6CiAgICAgICAgcmV0dXJuIGYiRklYRUQgb3JkZXIge2tpbmQgLSA4fSIKICAgIGlmIGtpbmQg Pj0gMzI6CiAgICAgICAgcmV0dXJuIGYiTFBDIG9yZGVyIHtraW5kIC0gMzF9IgogICAgcmV0dXJu IGYicmVzZXJ2ZWQgdHlwZSB7a2luZH0iCgoKZGVmIF9mbGFjX2ZyYW1lX3NpbGVuY2UoYml0czog X0JpdHMsIHN0cmVhbV9iaXRzOiBpbnQpIC0+IHR1cGxlW2Jvb2wgfCBOb25lLCBzdHJdOgogICAg c3luYyA9IGJpdHMucmVhZCgxNSkKICAgIGlmIHN5bmMgIT0gMGIxMTExMTExMTExMTExMDA6ICAj IHN5bmMgY29kZSBhbmQgYSByZXNlcnZlZCAwCiAgICAgICAgcmV0dXJuIE5vbmUsIGYibm8gZnJh bWUgc3luYyAoe3N5bmM6IzA2eH0pIgogICAgYml0cy5yZWFkKDEpICAjIGJsb2NraW5nIHN0cmF0 ZWd5CiAgICBibG9ja19jb2RlLCByYXRlX2NvZGUgPSBiaXRzLnJlYWQoNCksIGJpdHMucmVhZCg0 KQogICAgYXNzaWdubWVudCwgc2l6ZV9jb2RlID0gYml0cy5yZWFkKDQpLCBiaXRzLnJlYWQoMykK ICAgIGJpdHMucmVhZCgxKQogICAgIyBUaGUgZnJhbWUgb3Igc2FtcGxlIG51bWJlciwgVVRGLTgg c3R5bGU6IGxlYWRpbmcgMSBiaXRzID0gdGhlIG51bWJlciBvZiBieXRlcy4KICAgIGZpcnN0ID0g Yml0cy5yZWFkKDgpCiAgICBleHRyYSA9IDAKICAgIHdoaWxlIGZpcnN0ICYgKDB4ODAgPj4gZXh0 cmEpIGFuZCBleHRyYSA8IDc6CiAgICAgICAgZXh0cmEgKz0gMQogICAgZm9yIF8gaW4gcmFuZ2Uo bWF4KDAsIGV4dHJhIC0gMSkpOgogICAgICAgIGJpdHMucmVhZCg4KQogICAgaWYgYmxvY2tfY29k ZSBpbiAoNiwgNyk6CiAgICAgICAgYml0cy5yZWFkKDggaWYgYmxvY2tfY29kZSA9PSA2IGVsc2Ug MTYpCiAgICBpZiByYXRlX2NvZGUgPT0gMTI6CiAgICAgICAgYml0cy5yZWFkKDgpCiAgICBlbGlm IHJhdGVfY29kZSBpbiAoMTMsIDE0KToKICAgICAgICBiaXRzLnJlYWQoMTYpCiAgICBiaXRzLnJl YWQoOCkgICMgaGVhZGVyIENSQwogICAgaWYgc2l6ZV9jb2RlID09IDA6CiAgICAgICAgc2FtcGxl X2JpdHMgPSBzdHJlYW1fYml0cwogICAgZWxpZiBzaXplX2NvZGUgaW4gX0ZMQUNfU0FNUExFX1NJ WkVTOgogICAgICAgIHNhbXBsZV9iaXRzID0gX0ZMQUNfU0FNUExFX1NJWkVTW3NpemVfY29kZV0K ICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIE5vbmUsIGYicmVzZXJ2ZWQgc2FtcGxlIHNpemUge3Np emVfY29kZX0iCiAgICBpZiBhc3NpZ25tZW50IDw9IDc6CiAgICAgICAgY2hhbm5lbHMsIHNpZGUg PSBhc3NpZ25tZW50ICsgMSwgLTEKICAgIGVsaWYgYXNzaWdubWVudCA8PSAxMDoKICAgICAgICBj aGFubmVscywgc2lkZSA9IDIsICgwIGlmIGFzc2lnbm1lbnQgPT0gOSBlbHNlIDEpICAjIHRoZSBz aWRlIGNoYW5uZWwncyBiaXRzICsgMQogICAgZWxzZToKICAgICAgICByZXR1cm4gTm9uZSwgZiJy ZXNlcnZlZCBjaGFubmVsIGFzc2lnbm1lbnQge2Fzc2lnbm1lbnR9IgogICAgZm9yIGNoYW5uZWwg aW4gcmFuZ2UoY2hhbm5lbHMpOgogICAgICAgIGlmIGJpdHMucmVhZCgxKTogICMgcGFkZGluZywg bXVzdCBiZSAwCiAgICAgICAgICAgIHJldHVybiBOb25lLCBmImNoYW5uZWwge2NoYW5uZWx9OiBw YWRkaW5nIGJpdCBzZXQiCiAgICAgICAga2luZCwgd2FzdGVkID0gYml0cy5yZWFkKDYpLCAwCiAg ICAgICAgaWYgYml0cy5yZWFkKDEpOiAgIyB3YXN0ZWQgYml0czogdW5hcnktY29kZWQgY291bnQg LSAxCiAgICAgICAgICAgIHdhc3RlZCA9IDEKICAgICAgICAgICAgd2hpbGUgbm90IGJpdHMucmVh ZCgxKToKICAgICAgICAgICAgICAgIHdhc3RlZCArPSAxCiAgICAgICAgaWYga2luZCAhPSAwOiAg IyBub3QgQ09OU1RBTlQ6IHJlYWwgYXVkaW8KICAgICAgICAgICAgcmV0dXJuIEZhbHNlLCBmImNo YW5uZWwge2NoYW5uZWx9OiB7X3N1YmZyYW1lX2tpbmQoa2luZCl9IHN1YmZyYW1lIgogICAgICAg IHdpZHRoID0gc2FtcGxlX2JpdHMgKyAoY2hhbm5lbCA9PSBzaWRlKSAtIHdhc3RlZAogICAgICAg IGlmIHdpZHRoIDwgMDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUsIGYiY2hhbm5lbCB7Y2hhbm5l bH06IG1vcmUgd2FzdGVkIGJpdHMgdGhhbiBzYW1wbGUgYml0cyIKICAgICAgICB2YWx1ZSA9IGJp dHMucmVhZCh3aWR0aCkKICAgICAgICBpZiB2YWx1ZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNl LCBmImNoYW5uZWwge2NoYW5uZWx9OiBjb25zdGFudCB2YWx1ZSB7dmFsdWV9IgogICAgYml0cy5h bGlnbigpCiAgICBiaXRzLnJlYWQoMTYpICAjIGZyYW1lIENSQwogICAgcmV0dXJuIFRydWUsICIi CgoKZGVmIGNoZWNrX3NpbGVuY2UocGF0aDogUGF0aCkgLT4gdHVwbGVbYm9vbCB8IE5vbmUsIHN0 cl06CiAgICAiIiJXaGV0aGVyIHJlbmRlcmVkIGF1ZGlvIGlzIGNvbXBsZXRlIHNpbGVuY2UsIGFu ZCB3aHkgKGZvciB0aGUgbG9nKS4gTm9uZSBpZiB0aGF0CiAgICBjYW4ndCBiZSB0b2xkIChlLmcu IFF1aWNrVGltZSwgb3IgYSBGTEFDIGZpbGUgdGhpcyByZWFkZXIgZG9lc24ndCB1bmRlcnN0YW5k KS4iIiIKICAgIHN1ZmZpeCA9IHBhdGguc3VmZml4Lmxvd2VyKCkKICAgIGlmIHN1ZmZpeCA9PSAi LmZsYWMiOgogICAgICAgIHJldHVybiBfZmxhY19zaWxlbmNlKHBhdGgpCiAgICBpZiBzdWZmaXgg PT0gIi53YXYiOgogICAgICAgIHJldHVybiBfd2F2X3NpbGVuY2UocGF0aCkKICAgIHJldHVybiBO b25lLCBmIntzdWZmaXggb3IgJ25vIGV4dGVuc2lvbid9OiBub3QgY2hlY2tlZCIKCgpkZWYgaXNf c2lsZW50KHBhdGg6IFBhdGgpIC0+IGJvb2wgfCBOb25lOgogICAgcmV0dXJuIGNoZWNrX3NpbGVu Y2UocGF0aClbMF0KUEsDBBQAAAAAABRbal0hC/HPe14AAHteAAAgAAAAYXVwaG9uaWNfcmVzb2x2 ZS9hdXBob25pY19hcGkucHkiIiJBdXBob25pYyBIVFRQIGNsaWVudCAoYGB1cmxsaWJgYCBvbmx5 LCBubyBSZXNvbHZlIGltcG9ydHMpLgoKQVBJIGRvY3VtZW50YXRpb246IGh0dHBzOi8vYXVwaG9u aWMuY29tL2hlbHAvYXBpLwoKRXZlcnkgZXhjZXB0aW9uIHJhaXNlZCBoZXJlIGNhcnJpZXMgYSBv bmUtc2VudGVuY2UsIHVzZXItZmFjaW5nIG1lc3NhZ2UgKGBgc3RyKGV4YylgYCk7CmZ1bGwgZGV0 YWlscyAoSFRUUCBzdGF0dXMsIHJlc3BvbnNlIGJvZHkgd2l0aCBzZWNyZXRzIHJlZGFjdGVkKSBn byB0byB0aGUgY29uc29sZS4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25z CgppbXBvcnQgaGFzaGxpYgppbXBvcnQganNvbgppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHN5cwpp bXBvcnQgdGhyZWFkaW5nCmltcG9ydCB0aW1lCmltcG9ydCB1cmxsaWIuZXJyb3IKaW1wb3J0IHVy bGxpYi5wYXJzZQppbXBvcnQgdXJsbGliLnJlcXVlc3QKaW1wb3J0IHV1aWQKZnJvbSBjb2xsZWN0 aW9ucy5hYmMgaW1wb3J0IENhbGxhYmxlLCBJdGVyYXRvcgpmcm9tIGRhdGFjbGFzc2VzIGltcG9y dCBkYXRhY2xhc3MKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gdHlwaW5nIGltcG9ydCBB bnkKCmZyb20gLiBpbXBvcnQgX192ZXJzaW9uX18sIGxvZwoKQkFTRV9VUkwgPSAiaHR0cHM6Ly9h dXBob25pYy5jb20iClRSVVNURURfSE9TVF9TVUZGSVggPSAiYXVwaG9uaWMuY29tIgojIFJlcXVl c3RzIGEgdXNlciBpcyBhY3RpdmVseSB3YWl0aW5nIGZvciAobG9naW4sIGFjY291bnQsIHByZXNl dHMpIGZhaWwgZmFzdCBhbmQKIyBhcmVuJ3QgcmV0cmllZCwgc28gdGhlIHdpbmRvdyBuZXZlciBz aXRzIGF0ICJDaGVja2luZ+KApiIgZm9yIG1pbnV0ZXMgd2hlbiBvZmZsaW5lLgpJTlRFUkFDVElW RV9USU1FT1VUID0gMTAuMAoKIyBhdXBob25pYy13ZWIgc2V0cyBhIHByb2R1Y3Rpb24ncyBjbGll bnRfbmFtZSBmcm9tIHRoaXMgcHJlZml4IChBUEkga2V5cyBjYXJyeSBubwojIGNsaWVudCBuYW1l IG9mIHRoZWlyIG93biksIHNvIHByb2R1Y3Rpb25zIGZyb20gdGhlIHBsdWdpbiBjYW4gYmUgZmls dGVyZWQgdGhlcmUuCiMgS2VlcCBpdCBpbiBzeW5jIHdpdGggdGhlIGNoZWNrIGluIGF1cGhvbmlj LXdlYi4KVVNFUl9BR0VOVF9QUk9EVUNUID0gIkF1cGhvbmljLURhVmluY2ktUmVzb2x2ZSIKVVNF Ul9BR0VOVCA9ICgKICAgIGYie1VTRVJfQUdFTlRfUFJPRFVDVH0ve19fdmVyc2lvbl9ffSAiCiAg ICBmIihQeXRob24geycuJy5qb2luKG1hcChzdHIsIHN5cy52ZXJzaW9uX2luZm9bOjNdKSl9OyB7 cGxhdGZvcm0uc3lzdGVtKCl9KSIKKQoKCmNsYXNzIEFwaUVycm9yKEV4Y2VwdGlvbik6CiAgICAi IiJBbiBBdXBob25pYyByZXF1ZXN0IGZhaWxlZC4gYGBzdHIoZXhjKWBgIGlzIGEgdXNlci1mYWNp bmcgc2VudGVuY2UuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U6IHN0ciwgKiwg c3RhdHVzOiBpbnQgfCBOb25lID0gTm9uZSwgYm9keTogc3RyID0gIiIpIC0+IE5vbmU6CiAgICAg ICAgc3VwZXIoKS5fX2luaXRfXyhtZXNzYWdlKQogICAgICAgIHNlbGYuc3RhdHVzID0gc3RhdHVz CiAgICAgICAgc2VsZi5ib2R5ID0gYm9keQoKCmNsYXNzIEF1dGhFcnJvcihBcGlFcnJvcik6CiAg ICAiIiJBdXBob25pYyByZWplY3RlZCB0aGUgQVBJIGtleSAod3JvbmcsIG9yIHJlc2V0IGJ5IHRo ZSB1c2VyKS4gTmV2ZXIgcmV0cmllZC4iIiIKCgpjbGFzcyBOZXR3b3JrRXJyb3IoQXBpRXJyb3Ip OgogICAgIiIiQXVwaG9uaWMgY291bGRuJ3QgYmUgcmVhY2hlZCAob2ZmbGluZSwgRE5TLCB0aW1l b3V0LCBUTFMpLiIiIgoKCmNsYXNzIFNlcnZpY2VFcnJvcihBcGlFcnJvcik6CiAgICAiIiJBdXBo b25pYyBhbnN3ZXJlZCB3aXRoIGEgc2VydmVyIGVycm9yICg1eHgpIG9yIGlzIHJhdGUtbGltaXRp bmcgdXMuIiIiCgoKY2xhc3MgQ2FuY2VsbGVkKEV4Y2VwdGlvbik6CiAgICAiIiJUaGUgdXNlciBj YW5jZWxsZWQgYSBydW5uaW5nIHVwbG9hZCBvciBkb3dubG9hZC4iIiIKCgojIFByb2R1Y3Rpb24g c3RhdHVzIGNvZGVzIChodHRwczovL2F1cGhvbmljLmNvbS9hcGkvaW5mby9wcm9kdWN0aW9uX3N0 YXR1cy5qc29uKS4KU1RBVFVTX0VSUk9SID0gMgpTVEFUVVNfRE9ORSA9IDMKU1RBVFVTX0ZBSUxF RCA9IHtTVEFUVVNfRVJST1IsIDksIDExLCA5OH0gICMgRXJyb3IsIEluY29tcGxldGUsIE91dGRh dGVkLCBFbXB0eQojIE5vdCBzdGFydGVkICh5ZXQpLCBvciBjaGFuZ2VkIGFmdGVyIGVkaXRpbmc6 IHdoYXQgYSBwcm9kdWN0aW9uIHNob3dzIHdoaWxlIHRoZSB1c2VyCiMgZWRpdHMgaXQgb24gYXVw aG9uaWMuY29tIGJlZm9yZSBzdGFydGluZyBpdC4KU1RBVFVTX05PVF9TVEFSVEVEID0gezksIDEw LCAxMSwgMTV9ICAjIEluY29tcGxldGUsIE5vdCBTdGFydGVkIFlldCwgT3V0ZGF0ZWQsIENoYW5n ZWQKCkNIVU5LX1NJWkUgPSAyNTYgKiAxMDI0ClRSQU5TRkVSX1RJTUVPVVQgPSAxMjAuMCAgIyBz ZWNvbmRzIHdpdGhvdXQgcHJvZ3Jlc3Mgb24gYW4gdXBsb2FkL2Rvd25sb2FkIHNvY2tldAojIEFm dGVyIGEgZmFpbGVkIGRvd25sb2FkOiB0aGUgcmVzdWx0IHdpbmRvdyBzaG93cyBPcGVuIFByb2R1 Y3Rpb24gdGhlbi4KRE9XTkxPQURfSElOVCA9ICJUaGUgcHJvY2Vzc2VkIGF1ZGlvIGlzIGFsc28g b24gYXVwaG9uaWMuY29tIChPcGVuIFByb2R1Y3Rpb24pLiIKCgpAZGF0YWNsYXNzKGZyb3plbj1U cnVlKQpjbGFzcyBBY2NvdW50OgogICAgdXNlcm5hbWU6IHN0cgogICAgZW1haWw6IHN0cgogICAg Y3JlZGl0c19ob3VyczogZmxvYXQKICAgIG9uZXRpbWVfY3JlZGl0c19ob3VyczogZmxvYXQKICAg IHJlY3VycmluZ19jcmVkaXRzX2hvdXJzOiBmbG9hdAogICAgcmVjaGFyZ2VfZGF0ZTogc3RyCiAg ICAjIE5vbmUgd2hlbiB0aGUgQVBJIGRvZXNuJ3Qgc2F5ICh0aGVuIG5vIGppbmdsZSB3YXJuaW5n IGlzIHNob3duKS4KICAgIGlzX3BheWluZ191c2VyOiBib29sIHwgTm9uZSA9IE5vbmUKCiAgICBA cHJvcGVydHkKICAgIGRlZiBnZXRzX2ppbmdsZShzZWxmKSAtPiBib29sOgogICAgICAgICIiIkF1 cGhvbmljIGFkZHMgaXRzIGppbmdsZSB0byBmcmVlIHVzZXJzJyBwcm9kdWN0aW9ucyAobWFraW5n IHRoZW0gbG9uZ2VyKS4KCiAgICAgICAgVGhlIHNhbWUgY2hlY2sgYXMgQXVwaG9uaWMncyBBZG9i ZSBleHRlbnNpb25zOiBvbmx5IGFuIGV4cGxpY2l0IGBgZmFsc2VgYC4KICAgICAgICAiIiIKICAg ICAgICByZXR1cm4gc2VsZi5pc19wYXlpbmdfdXNlciBpcyBGYWxzZQoKICAgIEBwcm9wZXJ0eQog ICAgZGVmIGRpc3BsYXlfbmFtZShzZWxmKSAtPiBzdHI6CiAgICAgICAgIiIiYGB1c2VybmFtZSAo ZW1haWwpYGAsIG9yIHdoaWNoZXZlciBvZiB0aGUgdHdvIGlzIGtub3duLiIiIgogICAgICAgIGlm IHNlbGYudXNlcm5hbWUgYW5kIHNlbGYuZW1haWwgYW5kIHNlbGYudXNlcm5hbWUgIT0gc2VsZi5l bWFpbDoKICAgICAgICAgICAgcmV0dXJuIGYie3NlbGYudXNlcm5hbWV9ICh7c2VsZi5lbWFpbH0p IgogICAgICAgIHJldHVybiBzZWxmLnVzZXJuYW1lIG9yIHNlbGYuZW1haWwKCiAgICBAcHJvcGVy dHkKICAgIGRlZiBsb2dfbmFtZShzZWxmKSAtPiBzdHI6CiAgICAgICAgIiIiRm9yIHRoZSBDb25z b2xlOiB0aGUgdXNlcm5hbWUsIG5ldmVyIGFuIGVtYWlsIGFkZHJlc3MgKGxvZ3MgZ2V0IHNoYXJl ZCkuIiIiCiAgICAgICAgaWYgc2VsZi51c2VybmFtZSBhbmQgIkAiIG5vdCBpbiBzZWxmLnVzZXJu YW1lOgogICAgICAgICAgICByZXR1cm4gc2VsZi51c2VybmFtZQogICAgICAgIHJldHVybiAiPGVt YWlsIGFkZHJlc3Mgbm90IGxvZ2dlZD4iCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9h cGkoY2xzLCBkYXRhOiBkaWN0W3N0ciwgQW55XSkgLT4gQWNjb3VudDoKICAgICAgICBkZWYgaG91 cnMoa2V5OiBzdHIpIC0+IGZsb2F0OgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBy ZXR1cm4gZmxvYXQoZGF0YS5nZXQoa2V5KSBvciAwLjApCiAgICAgICAgICAgIGV4Y2VwdCAoVHlw ZUVycm9yLCBWYWx1ZUVycm9yKToKICAgICAgICAgICAgICAgIHJldHVybiAwLjAKCiAgICAgICAg cGF5aW5nID0gZGF0YS5nZXQoImlzX3BheWluZ191c2VyIikKICAgICAgICByZXR1cm4gY2xzKAog ICAgICAgICAgICB1c2VybmFtZT1zdHIoZGF0YS5nZXQoInVzZXJuYW1lIikgb3IgIiIpLAogICAg ICAgICAgICBlbWFpbD1zdHIoZGF0YS5nZXQoImVtYWlsIikgb3IgIiIpLAogICAgICAgICAgICBj cmVkaXRzX2hvdXJzPWhvdXJzKCJjcmVkaXRzIiksCiAgICAgICAgICAgIG9uZXRpbWVfY3JlZGl0 c19ob3Vycz1ob3Vycygib25ldGltZV9jcmVkaXRzIiksCiAgICAgICAgICAgIHJlY3VycmluZ19j cmVkaXRzX2hvdXJzPWhvdXJzKCJyZWN1cnJpbmdfY3JlZGl0cyIpLAogICAgICAgICAgICByZWNo YXJnZV9kYXRlPXN0cihkYXRhLmdldCgicmVjaGFyZ2VfZGF0ZSIpIG9yICIiKSwKICAgICAgICAg ICAgaXNfcGF5aW5nX3VzZXI9cGF5aW5nIGlmIGlzaW5zdGFuY2UocGF5aW5nLCBib29sKSBlbHNl IE5vbmUsCiAgICAgICAgKQoKCkBkYXRhY2xhc3MoZnJvemVuPVRydWUpCmNsYXNzIFByZXNldDoK ICAgIHV1aWQ6IHN0cgogICAgbmFtZTogc3RyCiAgICBhdXBob25pYzogYm9vbCA9IEZhbHNlICAj IG9uZSBvZiBBdXBob25pYydzIG93biBwcmVzZXRzIChub3QgdGhlIHVzZXIncykKCgpAZGF0YWNs YXNzKGZyb3plbj1UcnVlKQpjbGFzcyBPdXRwdXRGaWxlOgogICAgZm9ybWF0OiBzdHIKICAgIGVu ZGluZzogc3RyCiAgICBmaWxlbmFtZTogc3RyCiAgICBkb3dubG9hZF91cmw6IHN0cgogICAgc2l6 ZTogaW50CiAgICBjaGVja3N1bTogc3RyICAjIE1ENSwgZW1wdHkgaWYgdW5rbm93bgoKICAgIEBj bGFzc21ldGhvZAogICAgZGVmIGZyb21fYXBpKGNscywgZGF0YTogZGljdFtzdHIsIEFueV0pIC0+ IE91dHB1dEZpbGU6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzaXplID0gaW50KGRhdGEuZ2V0 KCJzaXplIikgb3IgMCkKICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CiAg ICAgICAgICAgIHNpemUgPSAwCiAgICAgICAgcmV0dXJuIGNscygKICAgICAgICAgICAgZm9ybWF0 PXN0cihkYXRhLmdldCgiZm9ybWF0Iikgb3IgIiIpLAogICAgICAgICAgICBlbmRpbmc9c3RyKGRh dGEuZ2V0KCJlbmRpbmciKSBvciAiIiksCiAgICAgICAgICAgIGZpbGVuYW1lPXN0cihkYXRhLmdl dCgiZmlsZW5hbWUiKSBvciAiIiksCiAgICAgICAgICAgIGRvd25sb2FkX3VybD1zdHIoZGF0YS5n ZXQoImRvd25sb2FkX3VybCIpIG9yICIiKSwKICAgICAgICAgICAgc2l6ZT1zaXplLAogICAgICAg ICAgICBjaGVja3N1bT1zdHIoZGF0YS5nZXQoImNoZWNrc3VtIikgb3IgIiIpLAogICAgICAgICkK CiAgICBAcHJvcGVydHkKICAgIGRlZiBpc193YXYoc2VsZikgLT4gYm9vbDoKICAgICAgICByZXR1 cm4gc2VsZi5mb3JtYXQgaW4gKCJ3YXYiLCAid2F2LTI0Yml0Iikgb3Igc2VsZi5lbmRpbmcubG93 ZXIoKSA9PSAid2F2IgoKCkBkYXRhY2xhc3MoZnJvemVuPVRydWUpCmNsYXNzIFByb2R1Y3Rpb246 CiAgICB1dWlkOiBzdHIKICAgIHN0YXR1czogaW50CiAgICBzdGF0dXNfc3RyaW5nOiBzdHIKICAg IHN0YXR1c19wYWdlOiBzdHIKICAgIGVycm9yX21lc3NhZ2U6IHN0cgogICAgb3V0cHV0X2ZpbGVz OiB0dXBsZVtPdXRwdXRGaWxlLCAuLi5dCiAgICBjaGFuZ2VfdGltZTogc3RyID0gIiIgICMgY2hh bmdlcyB3aGVuIHRoZSBwcm9kdWN0aW9uIGlzIGVkaXRlZCBvciBwcm9jZXNzZWQgYWdhaW4KCiAg ICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2FwaShjbHMsIGRhdGE6IGRpY3Rbc3RyLCBBbnld KSAtPiBQcm9kdWN0aW9uOgogICAgICAgIHJhd19zdGF0dXMgPSBkYXRhLmdldCgic3RhdHVzIikK ICAgICAgICBzdGF0dXMgPSBpbnQocmF3X3N0YXR1cykgaWYgaXNpbnN0YW5jZShyYXdfc3RhdHVz LCAoaW50LCBmbG9hdCkpIGVsc2UgLTEKICAgICAgICBmaWxlcyA9IGRhdGEuZ2V0KCJvdXRwdXRf ZmlsZXMiKSBvciBbXQogICAgICAgIHN0YXR1c19wYWdlID0gc3RyKGRhdGEuZ2V0KCJzdGF0dXNf cGFnZSIpIG9yICIiKQogICAgICAgIHJldHVybiBjbHMoCiAgICAgICAgICAgIHV1aWQ9c3RyKGRh dGEuZ2V0KCJ1dWlkIikgb3IgIiIpLAogICAgICAgICAgICBzdGF0dXM9c3RhdHVzLAogICAgICAg ICAgICBzdGF0dXNfc3RyaW5nPXN0cihkYXRhLmdldCgic3RhdHVzX3N0cmluZyIpIG9yICIiKSwK ICAgICAgICAgICAgIyBPcGVuZWQgaW4gdGhlIGJyb3dzZXI6IG9ubHkgYWNjZXB0IGEgcGFnZSBv biBhdXBob25pYy5jb20uCiAgICAgICAgICAgIHN0YXR1c19wYWdlPXN0YXR1c19wYWdlIGlmIGlz X3RydXN0ZWRfdXJsKHN0YXR1c19wYWdlKSBlbHNlICIiLAogICAgICAgICAgICBlcnJvcl9tZXNz YWdlPXN0cihkYXRhLmdldCgiZXJyb3JfbWVzc2FnZSIpIG9yICIiKSwKICAgICAgICAgICAgb3V0 cHV0X2ZpbGVzPXR1cGxlKE91dHB1dEZpbGUuZnJvbV9hcGkoZikgZm9yIGYgaW4gZmlsZXMgaWYg aXNpbnN0YW5jZShmLCBkaWN0KSksCiAgICAgICAgICAgIGNoYW5nZV90aW1lPXN0cihkYXRhLmdl dCgiY2hhbmdlX3RpbWUiKSBvciAiIiksCiAgICAgICAgKQoKICAgIGRlZiB3YXZfb3V0cHV0KHNl bGYpIC0+IE91dHB1dEZpbGUgfCBOb25lOgogICAgICAgICIiIlRoZSBXQVYgb3V0cHV0IHRvIGRv d25sb2FkLCAyNC1iaXQgcHJlZmVycmVkLiIiIgogICAgICAgIHdhdnMgPSBbZiBmb3IgZiBpbiBz ZWxmLm91dHB1dF9maWxlcyBpZiBmLmlzX3dhdl0KICAgICAgICB3YXZzLnNvcnQoa2V5PWxhbWJk YSBmOiBmLmZvcm1hdCAhPSAid2F2LTI0Yml0IikKICAgICAgICByZXR1cm4gd2F2c1swXSBpZiB3 YXZzIGVsc2UgTm9uZQoKClByb2dyZXNzRm4gPSBDYWxsYWJsZVtbaW50LCBpbnRdLCBOb25lXSAg IyBieXRlcyBkb25lLCBieXRlcyB0b3RhbAoKCmNsYXNzIF9NdWx0aXBhcnRGaWxlOgogICAgIiIi QSBtdWx0aXBhcnQvZm9ybS1kYXRhIGJvZHkgd2l0aCBvbmUgZmlsZSBmaWVsZCwgc3RyZWFtZWQg ZnJvbSBkaXNrLgoKICAgIEl0ZXJhdGluZyB5aWVsZHMgdGhlIGJvZHkgaW4gY2h1bmtzLCByZXBv cnRpbmcgcHJvZ3Jlc3MgYW5kIGNoZWNraW5nIGZvcgogICAgY2FuY2VsbGF0aW9uIGJldHdlZW4g Y2h1bmtzLCBzbyBsYXJnZSBmaWxlcyBuZXZlciBzaXQgaW4gbWVtb3J5LgogICAgIiIiCgogICAg ZGVmIF9faW5pdF9fKAogICAgICAgIHNlbGYsCiAgICAgICAgZmllbGQ6IHN0ciwKICAgICAgICBw YXRoOiBQYXRoLAogICAgICAgIGNvbnRlbnRfdHlwZTogc3RyLAogICAgICAgIHByb2dyZXNzOiBQ cm9ncmVzc0ZuIHwgTm9uZSA9IE5vbmUsCiAgICAgICAgY2FuY2VsOiB0aHJlYWRpbmcuRXZlbnQg fCBOb25lID0gTm9uZSwKICAgICkgLT4gTm9uZToKICAgICAgICBzZWxmLmJvdW5kYXJ5ID0gZiJh dXBob25pYy17dXVpZC51dWlkNCgpLmhleH0iCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAg ICAgIHNlbGYucHJvZ3Jlc3MgPSBwcm9ncmVzcwogICAgICAgIHNlbGYuY2FuY2VsID0gY2FuY2Vs CiAgICAgICAgZmlsZW5hbWUgPSBwYXRoLm5hbWUucmVwbGFjZSgnIicsICIiKQogICAgICAgIHNl bGYuaGVhZCA9ICgKICAgICAgICAgICAgZiItLXtzZWxmLmJvdW5kYXJ5fVxyXG4iCiAgICAgICAg ICAgIGYnQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJ7ZmllbGR9IjsgZmls ZW5hbWU9IntmaWxlbmFtZX0iXHJcbicKICAgICAgICAgICAgZiJDb250ZW50LVR5cGU6IHtjb250 ZW50X3R5cGV9XHJcblxyXG4iCiAgICAgICAgKS5lbmNvZGUoKQogICAgICAgIHNlbGYudGFpbCA9 IGYiXHJcbi0te3NlbGYuYm91bmRhcnl9LS1cclxuIi5lbmNvZGUoKQogICAgICAgIHNlbGYuZmls ZV9zaXplID0gcGF0aC5zdGF0KCkuc3Rfc2l6ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbnRl bnRfdHlwZShzZWxmKSAtPiBzdHI6CiAgICAgICAgcmV0dXJuIGYibXVsdGlwYXJ0L2Zvcm0tZGF0 YTsgYm91bmRhcnk9e3NlbGYuYm91bmRhcnl9IgoKICAgIGRlZiBfX2xlbl9fKHNlbGYpIC0+IGlu dDoKICAgICAgICByZXR1cm4gbGVuKHNlbGYuaGVhZCkgKyBzZWxmLmZpbGVfc2l6ZSArIGxlbihz ZWxmLnRhaWwpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpIC0+IEl0ZXJhdG9yW2J5dGVzXToKICAg ICAgICB5aWVsZCBzZWxmLmhlYWQKICAgICAgICBzZW50ID0gMAogICAgICAgIHdpdGggb3Blbihz ZWxmLnBhdGgsICJyYiIpIGFzIGhhbmRsZToKICAgICAgICAgICAgd2hpbGUgY2h1bmsgOj0gaGFu ZGxlLnJlYWQoQ0hVTktfU0laRSk6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmNhbmNlbCBpcyBu b3QgTm9uZSBhbmQgc2VsZi5jYW5jZWwuaXNfc2V0KCk6CiAgICAgICAgICAgICAgICAgICAgcmFp c2UgQ2FuY2VsbGVkKCkKICAgICAgICAgICAgICAgIHlpZWxkIGNodW5rCiAgICAgICAgICAgICAg ICBzZW50ICs9IGxlbihjaHVuaykKICAgICAgICAgICAgICAgIGlmIHNlbGYucHJvZ3Jlc3MgaXMg bm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9ncmVzcyhzZW50LCBzZWxmLmZp bGVfc2l6ZSkKICAgICAgICB5aWVsZCBzZWxmLnRhaWwKCgpkZWYgaXNfdHJ1c3RlZF91cmwodXJs OiBzdHIpIC0+IGJvb2w6CiAgICAiIiJUcnVlIGZvciBodHRwcyBVUkxzIG9uIGF1cGhvbmljLmNv bSBvciBpdHMgc3ViZG9tYWlucy4iIiIKICAgIHBhcnRzID0gdXJsbGliLnBhcnNlLnVybHNwbGl0 KHVybCkKICAgIGhvc3QgPSAocGFydHMuaG9zdG5hbWUgb3IgIiIpLmxvd2VyKCkKICAgIHJldHVy biBwYXJ0cy5zY2hlbWUgPT0gImh0dHBzIiBhbmQgKAogICAgICAgIGhvc3QgPT0gVFJVU1RFRF9I T1NUX1NVRkZJWCBvciBob3N0LmVuZHN3aXRoKCIuIiArIFRSVVNURURfSE9TVF9TVUZGSVgpCiAg ICApCgoKY2xhc3MgX1NhZmVSZWRpcmVjdEhhbmRsZXIodXJsbGliLnJlcXVlc3QuSFRUUFJlZGly ZWN0SGFuZGxlcik6CiAgICAiIiJGb2xsb3cgcmVkaXJlY3RzIHRvIGh0dHBzIG9ubHksIGFuZCBz ZW5kIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBvbmx5IHRvCiAgICBBdXBob25pYyBob3N0cy4K CiAgICBgYHVybGxpYmBgIGZvbGxvd3MgcmVkaXJlY3RzIHRvIGh0dHAgYW5kIGZ0cCB0b28sIGFu ZCBjb3BpZXMgYWxsIG5vbi1jb250ZW50IGhlYWRlcnMKICAgIHRvIHRoZSByZWRpcmVjdGVkIHJl cXVlc3QgYnkgZGVmYXVsdCwgd2hpY2ggd291bGQgbGVhayB0aGUgYmVhcmVyIHRva2VuIHRvIGUu Zy4gYQogICAgc3RvcmFnZSBwcm92aWRlci4KICAgICIiIgoKICAgIGRlZiByZWRpcmVjdF9yZXF1 ZXN0KAogICAgICAgIHNlbGYsCiAgICAgICAgcmVxOiB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0LAog ICAgICAgIGZwOiBBbnksCiAgICAgICAgY29kZTogaW50LAogICAgICAgIG1zZzogc3RyLAogICAg ICAgIGhlYWRlcnM6IEFueSwKICAgICAgICBuZXd1cmw6IHN0ciwKICAgICkgLT4gdXJsbGliLnJl cXVlc3QuUmVxdWVzdCB8IE5vbmU6CiAgICAgICAgaWYgdXJsbGliLnBhcnNlLnVybHNwbGl0KG5l d3VybCkuc2NoZW1lICE9ICJodHRwcyI6CiAgICAgICAgICAgIHJhaXNlIHVybGxpYi5lcnJvci5I VFRQRXJyb3IoCiAgICAgICAgICAgICAgICBuZXd1cmwsIGNvZGUsIGYie21zZ30gLSByZWRpcmVj dCB0byBhIG5vbi1odHRwcyBVUkwgcmVmdXNlZCIsIGhlYWRlcnMsIGZwCiAgICAgICAgICAgICkK ICAgICAgICBuZXcgPSBzdXBlcigpLnJlZGlyZWN0X3JlcXVlc3QocmVxLCBmcCwgY29kZSwgbXNn LCBoZWFkZXJzLCBuZXd1cmwpCiAgICAgICAgaWYgbmV3IGlzIG5vdCBOb25lIGFuZCBub3QgaXNf dHJ1c3RlZF91cmwobmV3dXJsKToKICAgICAgICAgICAgbmV3LnJlbW92ZV9oZWFkZXIoIkF1dGhv cml6YXRpb24iKQogICAgICAgIHJldHVybiBuZXcKCgpPcGVuZXIgPSBDYWxsYWJsZVtbdXJsbGli LnJlcXVlc3QuUmVxdWVzdCwgZmxvYXRdLCBBbnldCgoKZGVmIGRlZmF1bHRfb3BlbmVyKCkgLT4g T3BlbmVyOgogICAgb3BlbmVyID0gdXJsbGliLnJlcXVlc3QuYnVpbGRfb3BlbmVyKF9TYWZlUmVk aXJlY3RIYW5kbGVyKCkpCiAgICByZXR1cm4gbGFtYmRhIHJlcXVlc3QsIHRpbWVvdXQ6IG9wZW5l ci5vcGVuKHJlcXVlc3QsIHRpbWVvdXQ9dGltZW91dCkKCgpkZWYgX2Rlc2NyaWJlKHJlcXVlc3Q6 IHVybGxpYi5yZXF1ZXN0LlJlcXVlc3QpIC0+IHN0cjoKICAgIHJldHVybiBmIntyZXF1ZXN0Lmdl dF9tZXRob2QoKX0ge3JlcXVlc3QuZnVsbF91cmx9IgoKCmNsYXNzIEF1cGhvbmljQ2xpZW50Ogog ICAgIiIiYGB0b2tlbmBgIGlzIHRoZSB1c2VyJ3MgQVBJIGtleTsgaXQncyBzZW50IGFzIGBgQXV0 aG9yaXphdGlvbjogQmVhcmVyIDxrZXk+YGAuIiIiCgogICAgZGVmIF9faW5pdF9fKAogICAgICAg IHNlbGYsCiAgICAgICAgdG9rZW46IHN0ciB8IE5vbmUgPSBOb25lLAogICAgICAgICosCiAgICAg ICAgYmFzZV91cmw6IHN0ciA9IEJBU0VfVVJMLAogICAgICAgIG9wZW5lcjogT3BlbmVyIHwgTm9u ZSA9IE5vbmUsCiAgICAgICAgc2xlZXA6IENhbGxhYmxlW1tmbG9hdF0sIE5vbmVdID0gdGltZS5z bGVlcCwKICAgICAgICByZXRyaWVzOiBpbnQgPSAzLAogICAgICAgIHRpbWVvdXQ6IGZsb2F0ID0g MzAuMCwKICAgICkgLT4gTm9uZToKICAgICAgICBzZWxmLnRva2VuID0gdG9rZW4KICAgICAgICBz ZWxmLmJhc2VfdXJsID0gYmFzZV91cmwucnN0cmlwKCIvIikKICAgICAgICBzZWxmLl9vcGVuID0g b3BlbmVyIG9yIGRlZmF1bHRfb3BlbmVyKCkKICAgICAgICBzZWxmLl9zbGVlcCA9IHNsZWVwCiAg ICAgICAgc2VsZi5yZXRyaWVzID0gcmV0cmllcwogICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVv dXQKCiAgICAjIC0tIGxvdyBsZXZlbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBkZWYgX2J1aWxkKAogICAgICAgIHNl bGYsCiAgICAgICAgbWV0aG9kOiBzdHIsCiAgICAgICAgcGF0aDogc3RyLAogICAgICAgICosCiAg ICAgICAgcXVlcnk6IGRpY3Rbc3RyLCBBbnldIHwgTm9uZSA9IE5vbmUsCiAgICAgICAganNvbl9i b2R5OiBBbnkgPSBOb25lLAogICAgICAgIGhlYWRlcnM6IGRpY3Rbc3RyLCBzdHJdIHwgTm9uZSA9 IE5vbmUsCiAgICApIC0+IHVybGxpYi5yZXF1ZXN0LlJlcXVlc3Q6CiAgICAgICAgdXJsID0gc2Vs Zi5iYXNlX3VybCArIHBhdGgKICAgICAgICBpZiBxdWVyeToKICAgICAgICAgICAgdXJsICs9ICI/ IiArIHVybGxpYi5wYXJzZS51cmxlbmNvZGUocXVlcnkpCiAgICAgICAgZGF0YTogYnl0ZXMgfCBO b25lID0gTm9uZQogICAgICAgIGFsbF9oZWFkZXJzID0geyJVc2VyLUFnZW50IjogVVNFUl9BR0VO VCwgIkFjY2VwdCI6ICJhcHBsaWNhdGlvbi9qc29uIn0KICAgICAgICBpZiBqc29uX2JvZHkgaXMg bm90IE5vbmU6CiAgICAgICAgICAgIGRhdGEgPSBqc29uLmR1bXBzKGpzb25fYm9keSkuZW5jb2Rl KCJ1dGYtOCIpCiAgICAgICAgICAgIGFsbF9oZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9ICJhcHBs aWNhdGlvbi9qc29uIgogICAgICAgIGlmIG5vdCBzZWxmLnRva2VuOgogICAgICAgICAgICByYWlz ZSBBdXRoRXJyb3IoIllvdSdyZSBub3QgbG9nZ2VkIGluIHRvIEF1cGhvbmljLiIpCiAgICAgICAg YWxsX2hlYWRlcnNbIkF1dGhvcml6YXRpb24iXSA9IGYiQmVhcmVyIHtzZWxmLnRva2VufSIKICAg ICAgICBhbGxfaGVhZGVycy51cGRhdGUoaGVhZGVycyBvciB7fSkKICAgICAgICByZXR1cm4gdXJs bGliLnJlcXVlc3QuUmVxdWVzdCh1cmwsIGRhdGE9ZGF0YSwgaGVhZGVycz1hbGxfaGVhZGVycywg bWV0aG9kPW1ldGhvZCkKCiAgICBkZWYgX3NlbmQoCiAgICAgICAgc2VsZiwKICAgICAgICByZXF1 ZXN0OiB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0LAogICAgICAgICosCiAgICAgICAgcmV0cnk6IGJv b2wgPSBUcnVlLAogICAgICAgIHRpbWVvdXQ6IGZsb2F0IHwgTm9uZSA9IE5vbmUsCiAgICApIC0+ IHR1cGxlW2ludCwgYnl0ZXNdOgogICAgICAgICIiIlNlbmQgYGByZXF1ZXN0YGA7IHJldHJ5IHRy YW5zaWVudCBmYWlsdXJlcyB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYuIiIiCiAgICAgICAgYXR0 ZW1wdHMgPSAxICsgKHNlbGYucmV0cmllcyBpZiByZXRyeSBlbHNlIDApCiAgICAgICAgdGltZW91 dCA9IHNlbGYudGltZW91dCBpZiB0aW1lb3V0IGlzIE5vbmUgZWxzZSB0aW1lb3V0CiAgICAgICAg ZGVsYXkgPSAxLjAKICAgICAgICBsYXN0OiBBcGlFcnJvciB8IE5vbmUgPSBOb25lCiAgICAgICAg Zm9yIGF0dGVtcHQgaW4gcmFuZ2UoMSwgYXR0ZW1wdHMgKyAxKToKICAgICAgICAgICAgdHJ5Ogog ICAgICAgICAgICAgICAgbG9nLmRlYnVnKGYie19kZXNjcmliZShyZXF1ZXN0KX0gKGF0dGVtcHQg e2F0dGVtcHR9L3thdHRlbXB0c30pIikKICAgICAgICAgICAgICAgIHdpdGggc2VsZi5fb3Blbihy ZXF1ZXN0LCB0aW1lb3V0KSBhcyByZXNwb25zZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4g aW50KHJlc3BvbnNlLnN0YXR1cyksIHJlc3BvbnNlLnJlYWQoKQogICAgICAgICAgICBleGNlcHQg dXJsbGliLmVycm9yLkhUVFBFcnJvciBhcyBleGM6CiAgICAgICAgICAgICAgICBzdGF0dXMsIGJv ZHkgPSBleGMuY29kZSwgX3JlYWRfZXJyb3JfYm9keShleGMpCiAgICAgICAgICAgICAgICBpZiBz dGF0dXMgaW4gKDQyOSwpIG9yIHN0YXR1cyA+PSA1MDA6CiAgICAgICAgICAgICAgICAgICAgbGFz dCA9IFNlcnZpY2VFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgIkF1cGhvbmljIGlzIGN1 cnJlbnRseSB1bmF2YWlsYWJsZS4gUGxlYXNlIHRyeSBhZ2FpbiBpbiBhIGZldyBtaW51dGVzLiIs CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cz1zdGF0dXMsCiAgICAgICAgICAgICAgICAg ICAgICAgIGJvZHk9Ym9keSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBl bHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMsIGJvZHkuZW5jb2RlKCJ1dGYt OCIpCiAgICAgICAgICAgIGV4Y2VwdCAodXJsbGliLmVycm9yLlVSTEVycm9yLCBUaW1lb3V0RXJy b3IsIENvbm5lY3Rpb25FcnJvcikgYXMgZXhjOgogICAgICAgICAgICAgICAgbGFzdCA9IE5ldHdv cmtFcnJvcigKICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgcmVhY2ggQXVwaG9uaWMuIFBs ZWFzZSBjaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb24uIiwKICAgICAgICAgICAgICAgICAg ICBib2R5PXJlcHIoZXhjKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgbG9nLmRlYnVn KGYie19kZXNjcmliZShyZXF1ZXN0KX0gZmFpbGVkOiB7bGFzdH0ge2xhc3Quc3RhdHVzIG9yICcn fSB7bGFzdC5ib2R5fSIpCiAgICAgICAgICAgIGlmIGF0dGVtcHQgPCBhdHRlbXB0czoKICAgICAg ICAgICAgICAgIHNlbGYuX3NsZWVwKGRlbGF5KQogICAgICAgICAgICAgICAgZGVsYXkgKj0gMgog ICAgICAgIGFzc2VydCBsYXN0IGlzIG5vdCBOb25lCiAgICAgICAgbG9nLmVycm9yKAogICAgICAg ICAgICBmIntfZGVzY3JpYmUocmVxdWVzdCl9IGZhaWxlZCBhZnRlciB7YXR0ZW1wdHN9IGF0dGVt cHQocyk6ICIKICAgICAgICAgICAgZiJIVFRQIHtsYXN0LnN0YXR1cyBvciAnLSd9IHtsYXN0LmJv ZHl9IgogICAgICAgICkKICAgICAgICByYWlzZSBsYXN0CgogICAgZGVmIF9hcGkoCiAgICAgICAg c2VsZiwKICAgICAgICBtZXRob2Q6IHN0ciwKICAgICAgICBwYXRoOiBzdHIsCiAgICAgICAgKiwK ICAgICAgICBpbnRlcmFjdGl2ZTogYm9vbCA9IEZhbHNlLAogICAgICAgIHJldHJ5OiBib29sIHwg Tm9uZSA9IE5vbmUsCiAgICAgICAgKiprd2FyZ3M6IEFueSwKICAgICkgLT4gQW55OgogICAgICAg ICIiIkNhbGwgYW4gYGAvYXBpLy4uLmBgIGVuZHBvaW50IGFuZCByZXR1cm4gdGhlIGVudmVsb3Bl J3MgYGBkYXRhYGAuCgogICAgICAgIGBgaW50ZXJhY3RpdmVgYCByZXF1ZXN0cyAoYSB1c2VyIGlz IHdhaXRpbmcpIHVzZSBhIHNob3J0IHRpbWVvdXQgYW5kIG5vIHJldHJpZXMuCiAgICAgICAgYGBy ZXRyeT1GYWxzZWBgIGlzIGZvciByZXF1ZXN0cyB0aGF0IG11c3Qgbm90IHJ1biB0d2ljZSAoY3Jl YXRpbmcgdGhpbmdzKS4KICAgICAgICAiIiIKICAgICAgICByZXF1ZXN0ID0gc2VsZi5fYnVpbGQo bWV0aG9kLCBwYXRoLCAqKmt3YXJncykKICAgICAgICBzdGF0dXMsIHJhdyA9IHNlbGYuX3NlbmQo CiAgICAgICAgICAgIHJlcXVlc3QsCiAgICAgICAgICAgIHJldHJ5PShub3QgaW50ZXJhY3RpdmUp IGlmIHJldHJ5IGlzIE5vbmUgZWxzZSByZXRyeSwKICAgICAgICAgICAgdGltZW91dD1JTlRFUkFD VElWRV9USU1FT1VUIGlmIGludGVyYWN0aXZlIGVsc2UgTm9uZSwKICAgICAgICApCiAgICAgICAg cmV0dXJuIHNlbGYuX2RhdGEocmVxdWVzdCwgc3RhdHVzLCByYXcpCgogICAgZGVmIF9kYXRhKHNl bGYsIHJlcXVlc3Q6IHVybGxpYi5yZXF1ZXN0LlJlcXVlc3QsIHN0YXR1czogaW50LCByYXc6IGJ5 dGVzKSAtPiBBbnk6CiAgICAgICAgdGV4dCA9IHJhdy5kZWNvZGUoInV0Zi04IiwgZXJyb3JzPSJy ZXBsYWNlIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBheWxvYWQgPSBqc29uLmxvYWRzKHRl eHQpIGlmIHRleHQgZWxzZSB7fQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAg ICBwYXlsb2FkID0ge30KICAgICAgICBpZiBzdGF0dXMgaW4gKDQwMSwgNDAzKToKICAgICAgICAg ICAgbG9nLmVycm9yKGYie19kZXNjcmliZShyZXF1ZXN0KX06IEhUVFAge3N0YXR1c30ge3RleHR9 IikKICAgICAgICAgICAgcmFpc2UgQXV0aEVycm9yKAogICAgICAgICAgICAgICAgIllvdXIgQXVw aG9uaWMgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBQbGVhc2UgbG9nIGluIGFnYWluLiIsCiAg ICAgICAgICAgICAgICBzdGF0dXM9c3RhdHVzLAogICAgICAgICAgICAgICAgYm9keT10ZXh0LAog ICAgICAgICAgICApCiAgICAgICAgIyAzeHggb25seSBhcnJpdmVzIGhlcmUgZm9yIGEgcmVmdXNl ZCByZWRpcmVjdCAoc2VlIF9TYWZlUmVkaXJlY3RIYW5kbGVyKS4KICAgICAgICBpZiBzdGF0dXMg Pj0gMzAwIG9yIG5vdCBpc2luc3RhbmNlKHBheWxvYWQsIGRpY3QpOgogICAgICAgICAgICBsb2cu ZXJyb3IoZiJ7X2Rlc2NyaWJlKHJlcXVlc3QpfTogSFRUUCB7c3RhdHVzfSB7dGV4dH0iKQogICAg ICAgICAgICBtZXNzYWdlID0gcGF5bG9hZC5nZXQoImVycm9yX21lc3NhZ2UiKSBpZiBpc2luc3Rh bmNlKHBheWxvYWQsIGRpY3QpIGVsc2UgTm9uZQogICAgICAgICAgICByYWlzZSBBcGlFcnJvcigK ICAgICAgICAgICAgICAgIGYiQXVwaG9uaWMgcmVwb3J0ZWQgYW4gZXJyb3I6IHttZXNzYWdlfSIK ICAgICAgICAgICAgICAgIGlmIG1lc3NhZ2UKICAgICAgICAgICAgICAgIGVsc2UgZiJBdXBob25p YyByZXBvcnRlZCBhbiB1bmV4cGVjdGVkIGVycm9yIChIVFRQIHtzdGF0dXN9KS4iLAogICAgICAg ICAgICAgICAgc3RhdHVzPXN0YXR1cywKICAgICAgICAgICAgICAgIGJvZHk9dGV4dCwKICAgICAg ICAgICAgKQogICAgICAgIHJldHVybiBwYXlsb2FkLmdldCgiZGF0YSIpCgogICAgIyAtLSBlbmRw b2ludHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KCiAgICBkZWYgZ2V0X2FjY291bnQoc2VsZiwgKiwgaW50ZXJhY3RpdmU6 IGJvb2wgPSBUcnVlKSAtPiBBY2NvdW50OgogICAgICAgIGRhdGEgPSBzZWxmLl9hcGkoIkdFVCIs ICIvYXBpL3VzZXIuanNvbiIsIGludGVyYWN0aXZlPWludGVyYWN0aXZlKQogICAgICAgIGlmIG5v dCBpc2luc3RhbmNlKGRhdGEsIGRpY3QpOgogICAgICAgICAgICByYWlzZSBBcGlFcnJvcigiQXVw aG9uaWMgc2VudCBhbiB1bmV4cGVjdGVkIGFuc3dlciBmb3IgeW91ciBhY2NvdW50LiIpCiAgICAg ICAgcmV0dXJuIEFjY291bnQuZnJvbV9hcGkoZGF0YSkKCiAgICBkZWYgZ2V0X3ByZXNldHMoc2Vs ZiwgcGFnZV9zaXplOiBpbnQgPSAxMDAsICosIGludGVyYWN0aXZlOiBib29sID0gVHJ1ZSkgLT4g bGlzdFtQcmVzZXRdOgogICAgICAgICIiIlNpbmdsZXRyYWNrIHByZXNldHM6IHRoZSB1c2VyJ3Mg b3duLCB0aGVuIEF1cGhvbmljJ3MsIGVhY2ggc29ydGVkIGJ5IG5hbWUuIiIiCiAgICAgICAgb3du ID0gc2VsZi5fcHJlc2V0X2xpc3Qoe30sIEZhbHNlLCBwYWdlX3NpemUsIGludGVyYWN0aXZlKQog ICAgICAgIGtub3duID0ge3AudXVpZCBmb3IgcCBpbiBvd259CiAgICAgICAgYXVwaG9uaWMgPSBb CiAgICAgICAgICAgIHAKICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5fcHJlc2V0X2xpc3QoCiAg ICAgICAgICAgICAgICB7InByZXNldF90eXBlIjogImF1cGhvbmljX3ByZXNldHMifSwgVHJ1ZSwg cGFnZV9zaXplLCBpbnRlcmFjdGl2ZQogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIHAudXVp ZCBub3QgaW4ga25vd24gICMgaW4gY2FzZSB0aGUgdHlwZSBmaWx0ZXIgaXMgaWdub3JlZAogICAg ICAgIF0KICAgICAgICByZXR1cm4gb3duICsgYXVwaG9uaWMKCiAgICBkZWYgX3ByZXNldF9saXN0 KAogICAgICAgIHNlbGYsIHF1ZXJ5OiBkaWN0W3N0ciwgQW55XSwgYXVwaG9uaWM6IGJvb2wsIHBh Z2Vfc2l6ZTogaW50LCBpbnRlcmFjdGl2ZTogYm9vbAogICAgKSAtPiBsaXN0W1ByZXNldF06CiAg ICAgICAgcHJlc2V0czogbGlzdFtQcmVzZXRdID0gW10KICAgICAgICBvZmZzZXQgPSAwCiAgICAg ICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2FwaSgKICAgICAgICAgICAg ICAgICJHRVQiLAogICAgICAgICAgICAgICAgIi9hcGkvcHJlc2V0cy5qc29uIiwKICAgICAgICAg ICAgICAgIHF1ZXJ5PXsqKnF1ZXJ5LCAibWluaW1hbF9kYXRhIjogMSwgImxpbWl0IjogcGFnZV9z aXplLCAib2Zmc2V0Ijogb2Zmc2V0fSwKICAgICAgICAgICAgICAgIGludGVyYWN0aXZlPWludGVy YWN0aXZlLAogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGEs IGxpc3QpOgogICAgICAgICAgICAgICAgcmFpc2UgQXBpRXJyb3IoIkF1cGhvbmljIHNlbnQgYW4g dW5leHBlY3RlZCBhbnN3ZXIgZm9yIHlvdXIgcHJlc2V0cy4iKQogICAgICAgICAgICBmb3IgaXRl bSBpbiBkYXRhOgogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgZGljdCkg b3IgaXRlbS5nZXQoImlzX211bHRpdHJhY2siKToKICAgICAgICAgICAgICAgICAgICBjb250aW51 ZQogICAgICAgICAgICAgICAgdXVpZCA9IHN0cihpdGVtLmdldCgidXVpZCIpIG9yICIiKQogICAg ICAgICAgICAgICAgaWYgdXVpZDoKICAgICAgICAgICAgICAgICAgICBuYW1lID0gc3RyKGl0ZW0u Z2V0KCJwcmVzZXRfbmFtZSIpIG9yIHV1aWQpCiAgICAgICAgICAgICAgICAgICAgcHJlc2V0cy5h cHBlbmQoUHJlc2V0KHV1aWQ9dXVpZCwgbmFtZT1uYW1lLCBhdXBob25pYz1hdXBob25pYykpCiAg ICAgICAgICAgIGlmIGxlbihkYXRhKSA8IHBhZ2Vfc2l6ZToKICAgICAgICAgICAgICAgIGJyZWFr CiAgICAgICAgICAgIG9mZnNldCArPSBwYWdlX3NpemUKICAgICAgICByZXR1cm4gc29ydGVkKHBy ZXNldHMsIGtleT1sYW1iZGEgcDogcC5uYW1lLmNhc2Vmb2xkKCkpCgogICAgIyAtLSBwcm9kdWN0 aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQoKICAgIGRlZiBjcmVhdGVfcHJvZHVjdGlvbigKICAgICAgICBzZWxmLCBw cmVzZXRfdXVpZDogc3RyLCB0aXRsZTogc3RyLCBjaGFwdGVyczogbGlzdFtkaWN0W3N0ciwgc3Ry XV0KICAgICkgLT4gUHJvZHVjdGlvbjoKICAgICAgICAiIiJDcmVhdGUgYSBwcm9kdWN0aW9uIGZy b20gYSBwcmVzZXQsIGtlZXBpbmcgdGhlIHByZXNldCdzIG90aGVyIHNldHRpbmdzLiIiIgogICAg ICAgIGJvZHk6IGRpY3Rbc3RyLCBBbnldID0geyJwcmVzZXQiOiBwcmVzZXRfdXVpZCwgIm1ldGFk YXRhIjogeyJ0aXRsZSI6IHRpdGxlfX0KICAgICAgICBpZiBjaGFwdGVyczoKICAgICAgICAgICAg Ym9keVsiY2hhcHRlcnMiXSA9IGNoYXB0ZXJzCiAgICAgICAgZGF0YSA9IHNlbGYuX2FwaSgiUE9T VCIsICIvYXBpL3Byb2R1Y3Rpb25zLmpzb24iLCBqc29uX2JvZHk9Ym9keSwgcmV0cnk9RmFsc2Up CiAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2R1Y3Rpb24oZGF0YSkKCiAgICBkZWYgYWRkX291dHB1 dF9maWxlcyhzZWxmLCBwcm9kdWN0aW9uX3V1aWQ6IHN0ciwgZmlsZXM6IGxpc3RbZGljdFtzdHIs IEFueV1dKSAtPiBOb25lOgogICAgICAgICIiIkFkZCBvdXRwdXQgZmlsZXMgdG8gYSBwcm9kdWN0 aW9uICh0aGUgcHJlc2V0J3Mgb3V0cHV0cyBhcmUga2VwdCkuIiIiCiAgICAgICAgc2VsZi5fYXBp KAogICAgICAgICAgICAiUE9TVCIsCiAgICAgICAgICAgIGYiL2FwaS9wcm9kdWN0aW9uL3twcm9k dWN0aW9uX3V1aWR9L291dHB1dF9maWxlcy5qc29uIiwKICAgICAgICAgICAganNvbl9ib2R5PWZp bGVzLAogICAgICAgICAgICByZXRyeT1GYWxzZSwKICAgICAgICApCgogICAgZGVmIHVwbG9hZCgK ICAgICAgICBzZWxmLAogICAgICAgIHByb2R1Y3Rpb25fdXVpZDogc3RyLAogICAgICAgIHBhdGg6 IFBhdGgsCiAgICAgICAgKiwKICAgICAgICBwcm9ncmVzczogUHJvZ3Jlc3NGbiB8IE5vbmUgPSBO b25lLAogICAgICAgIGNhbmNlbDogdGhyZWFkaW5nLkV2ZW50IHwgTm9uZSA9IE5vbmUsCiAgICAp IC0+IE5vbmU6CiAgICAgICAgIiIiVXBsb2FkIHRoZSBpbnB1dCBmaWxlIChtdWx0aXBhcnQvZm9y bS1kYXRhLCBzdHJlYW1lZCBmcm9tIGRpc2spLiIiIgogICAgICAgIGNvbnRlbnRfdHlwZSA9IHsi LmZsYWMiOiAiYXVkaW8vZmxhYyIsICIud2F2IjogImF1ZGlvL3dhdiIsICIubW92IjogInZpZGVv L3F1aWNrdGltZSJ9CiAgICAgICAgYm9keSA9IF9NdWx0aXBhcnRGaWxlKAogICAgICAgICAgICAi aW5wdXRfZmlsZSIsCiAgICAgICAgICAgIHBhdGgsCiAgICAgICAgICAgIGNvbnRlbnRfdHlwZS5n ZXQocGF0aC5zdWZmaXgubG93ZXIoKSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpLAogICAg ICAgICAgICBwcm9ncmVzcywKICAgICAgICAgICAgY2FuY2VsLAogICAgICAgICkKICAgICAgICBy ZXF1ZXN0ID0gc2VsZi5fYnVpbGQoCiAgICAgICAgICAgICJQT1NUIiwKICAgICAgICAgICAgZiIv YXBpL3Byb2R1Y3Rpb24ve3Byb2R1Y3Rpb25fdXVpZH0vdXBsb2FkLmpzb24iLAogICAgICAgICAg ICBoZWFkZXJzPXsiQ29udGVudC1UeXBlIjogYm9keS5jb250ZW50X3R5cGV9LAogICAgICAgICkK ICAgICAgICAjIHVybGxpYiBzdHJlYW1zIGl0ZXJhYmxlIGJvZGllcywgYnV0IG5lZWRzIENvbnRl bnQtTGVuZ3RoIGZvciB0aGVtLiBBc3NpZ25pbmcKICAgICAgICAjIHJlcXVlc3QuZGF0YSByZW1v dmVzIHRoYXQgaGVhZGVyLCBzbyBhZGQgaXQgYWZ0ZXJ3YXJkcy4KICAgICAgICByZXF1ZXN0LmRh dGEgPSBib2R5CiAgICAgICAgcmVxdWVzdC5hZGRfaGVhZGVyKCJDb250ZW50LUxlbmd0aCIsIHN0 cihsZW4oYm9keSkpKQogICAgICAgIHN0YXR1cywgcmF3ID0gc2VsZi5fc2VuZChyZXF1ZXN0LCBy ZXRyeT1GYWxzZSwgdGltZW91dD1UUkFOU0ZFUl9USU1FT1VUKQogICAgICAgIHNlbGYuX2RhdGEo cmVxdWVzdCwgc3RhdHVzLCByYXcpCgogICAgZGVmIHN0YXJ0X3Byb2R1Y3Rpb24oc2VsZiwgcHJv ZHVjdGlvbl91dWlkOiBzdHIpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5fYXBpKCJQT1NUIiwgZiIv YXBpL3Byb2R1Y3Rpb24ve3Byb2R1Y3Rpb25fdXVpZH0vc3RhcnQuanNvbiIsIHJldHJ5PUZhbHNl KQoKICAgIGRlZiBnZXRfcHJvZHVjdGlvbihzZWxmLCBwcm9kdWN0aW9uX3V1aWQ6IHN0cikgLT4g UHJvZHVjdGlvbjoKICAgICAgICByZXR1cm4gc2VsZi5fcHJvZHVjdGlvbihzZWxmLl9hcGkoIkdF VCIsIGYiL2FwaS9wcm9kdWN0aW9uL3twcm9kdWN0aW9uX3V1aWR9Lmpzb24iKSkKCiAgICBkZWYg ZGVsZXRlX3Byb2R1Y3Rpb24oc2VsZiwgcHJvZHVjdGlvbl91dWlkOiBzdHIpIC0+IE5vbmU6CiAg ICAgICAgc2VsZi5fYXBpKCJERUxFVEUiLCBmIi9hcGkvcHJvZHVjdGlvbi97cHJvZHVjdGlvbl91 dWlkfS5qc29uIiwgcmV0cnk9RmFsc2UpCgogICAgZGVmIGRvd25sb2FkKAogICAgICAgIHNlbGYs CiAgICAgICAgb3V0cHV0OiBPdXRwdXRGaWxlLAogICAgICAgIHRhcmdldDogUGF0aCwKICAgICAg ICAqLAogICAgICAgIHByb2dyZXNzOiBQcm9ncmVzc0ZuIHwgTm9uZSA9IE5vbmUsCiAgICAgICAg Y2FuY2VsOiB0aHJlYWRpbmcuRXZlbnQgfCBOb25lID0gTm9uZSwKICAgICkgLT4gTm9uZToKICAg ICAgICAiIiJEb3dubG9hZCBgYG91dHB1dGBgIHRvIGBgdGFyZ2V0YGAsIHZlcmlmeWluZyBpdHMg c2l6ZSBhbmQgTUQ1IGNoZWNrc3VtLgoKICAgICAgICBUaGUgdG9rZW4gaXMgc2VudCBhcyBhIGhl YWRlciwgYW5kIG9ubHkgdG8gQXVwaG9uaWMgaG9zdHMgKGFsc28gb24gcmVkaXJlY3RzKS4KICAg ICAgICBEYXRhIGdvZXMgdG8gYSBgYC5wYXJ0YGAgZmlsZSBmaXJzdCwgc28gYGB0YXJnZXRgYCBv bmx5IGV2ZXIgaG9sZHMgYSBjb21wbGV0ZSBmaWxlLgogICAgICAgICIiIgogICAgICAgICMgaHR0 cHMgb25seTogdXJsbGliIHdvdWxkIGFsc28gb3BlbiBlLmcuIGZpbGU6Ly8gb3IgZnRwOi8vIFVS THMuCiAgICAgICAgaWYgdXJsbGliLnBhcnNlLnVybHNwbGl0KG91dHB1dC5kb3dubG9hZF91cmwp LnNjaGVtZSAhPSAiaHR0cHMiOgogICAgICAgICAgICBsb2cuZXJyb3IoZiJyZWZ1c2luZyB0byBk b3dubG9hZCBmcm9tIHtvdXRwdXQuZG93bmxvYWRfdXJsIXJ9IikKICAgICAgICAgICAgcmFpc2Ug QXBpRXJyb3IoIkF1cGhvbmljIGRpZG4ndCBwcm92aWRlIGEgZG93bmxvYWQgZm9yIHRoZSBwcm9j ZXNzZWQgYXVkaW8uIikKICAgICAgICBoZWFkZXJzID0geyJVc2VyLUFnZW50IjogVVNFUl9BR0VO VH0KICAgICAgICBpZiBpc190cnVzdGVkX3VybChvdXRwdXQuZG93bmxvYWRfdXJsKSBhbmQgc2Vs Zi50b2tlbjoKICAgICAgICAgICAgaGVhZGVyc1siQXV0aG9yaXphdGlvbiJdID0gZiJCZWFyZXIg e3NlbGYudG9rZW59IgogICAgICAgIHJlcXVlc3QgPSB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0KG91 dHB1dC5kb3dubG9hZF91cmwsIGhlYWRlcnM9aGVhZGVycykKICAgICAgICBwYXJ0aWFsID0gdGFy Z2V0LndpdGhfbmFtZSh0YXJnZXQubmFtZSArICIucGFydCIpCiAgICAgICAgdGFyZ2V0LnBhcmVu dC5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCiAgICAgICAgZGlnZXN0ID0gaGFz aGxpYi5tZDUodXNlZGZvcnNlY3VyaXR5PUZhbHNlKQogICAgICAgIGRvbmUgPSAwCiAgICAgICAg dHJ5OgogICAgICAgICAgICBsb2cuZGVidWcoZiJHRVQge291dHB1dC5kb3dubG9hZF91cmx9IikK ICAgICAgICAgICAgd2l0aCBzZWxmLl9vcGVuKHJlcXVlc3QsIFRSQU5TRkVSX1RJTUVPVVQpIGFz IHJlc3BvbnNlLCBvcGVuKHBhcnRpYWwsICJ3YiIpIGFzIG91dDoKICAgICAgICAgICAgICAgIHRv dGFsID0gaW50KHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCJDb250ZW50LUxlbmd0aCIpIG9yIG91dHB1 dC5zaXplIG9yIDApCiAgICAgICAgICAgICAgICB3aGlsZSBjaHVuayA6PSByZXNwb25zZS5yZWFk KENIVU5LX1NJWkUpOgogICAgICAgICAgICAgICAgICAgIGlmIGNhbmNlbCBpcyBub3QgTm9uZSBh bmQgY2FuY2VsLmlzX3NldCgpOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBDYW5jZWxs ZWQoKQogICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShjaHVuaykKICAgICAgICAgICAgICAg ICAgICBkaWdlc3QudXBkYXRlKGNodW5rKQogICAgICAgICAgICAgICAgICAgIGRvbmUgKz0gbGVu KGNodW5rKQogICAgICAgICAgICAgICAgICAgIGlmIHByb2dyZXNzIGlzIG5vdCBOb25lOgogICAg ICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyhkb25lLCB0b3RhbCkKICAgICAgICBleGNlcHQg dXJsbGliLmVycm9yLkhUVFBFcnJvciBhcyBleGM6CiAgICAgICAgICAgIHBhcnRpYWwudW5saW5r KG1pc3Npbmdfb2s9VHJ1ZSkKICAgICAgICAgICAgYm9keSA9IF9yZWFkX2Vycm9yX2JvZHkoZXhj KQogICAgICAgICAgICBsb2cuZXJyb3IoZiJkb3dubG9hZCBmYWlsZWQ6IEhUVFAge2V4Yy5jb2Rl fSB7Ym9keX0iKQogICAgICAgICAgICAjIE9ubHkgYSBob3N0IHRoYXQgZ290IHRoZSBBUEkga2V5 IGNhbiByZWplY3QgaXQ7IGEgNDAzIGZyb20gYSBzdG9yYWdlCiAgICAgICAgICAgICMgaG9zdCAo ZS5nLiBhbiBleHBpcmVkIGxpbmspIG11c3Qgbm90IGxvZyB0aGUgdXNlciBvdXQuCiAgICAgICAg ICAgIGlmIGV4Yy5jb2RlIGluICg0MDEsIDQwMykgYW5kIGlzX3RydXN0ZWRfdXJsKGV4Yy5maWxl bmFtZSBvciBvdXRwdXQuZG93bmxvYWRfdXJsKToKICAgICAgICAgICAgICAgIHJhaXNlIEF1dGhF cnJvcigKICAgICAgICAgICAgICAgICAgICAiWW91ciBBdXBob25pYyBsb2dpbiBpcyBubyBsb25n ZXIgdmFsaWQuIFBsZWFzZSBsb2cgaW4gYWdhaW4uIiwKICAgICAgICAgICAgICAgICAgICBzdGF0 dXM9ZXhjLmNvZGUsCiAgICAgICAgICAgICAgICAgICAgYm9keT1ib2R5LAogICAgICAgICAgICAg ICAgKSBmcm9tIGV4YwogICAgICAgICAgICByYWlzZSBBcGlFcnJvcigKICAgICAgICAgICAgICAg IGYiRG93bmxvYWRpbmcgdGhlIHByb2Nlc3NlZCBhdWRpbyBmYWlsZWQgKEhUVFAge2V4Yy5jb2Rl fSkuIHtET1dOTE9BRF9ISU5UfSIsCiAgICAgICAgICAgICAgICBzdGF0dXM9ZXhjLmNvZGUsCiAg ICAgICAgICAgICAgICBib2R5PWJvZHksCiAgICAgICAgICAgICkgZnJvbSBleGMKICAgICAgICBl eGNlcHQgKHVybGxpYi5lcnJvci5VUkxFcnJvciwgVGltZW91dEVycm9yLCBDb25uZWN0aW9uRXJy b3IpIGFzIGV4YzoKICAgICAgICAgICAgcGFydGlhbC51bmxpbmsobWlzc2luZ19vaz1UcnVlKQog ICAgICAgICAgICByYWlzZSBOZXR3b3JrRXJyb3IoCiAgICAgICAgICAgICAgICAiVGhlIGRvd25s b2FkIGZyb20gQXVwaG9uaWMgd2FzIGludGVycnVwdGVkLiBQbGVhc2UgY2hlY2sgeW91ciBpbnRl cm5ldCAiCiAgICAgICAgICAgICAgICBmImNvbm5lY3Rpb24uIHtET1dOTE9BRF9ISU5UfSIsCiAg ICAgICAgICAgICAgICBib2R5PXJlcHIoZXhjKSwKICAgICAgICAgICAgKSBmcm9tIGV4YwogICAg ICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uOgogICAgICAgICAgICBwYXJ0aWFsLnVubGluayhtaXNz aW5nX29rPVRydWUpCiAgICAgICAgICAgIHJhaXNlCiAgICAgICAgaWYgb3V0cHV0LnNpemUgYW5k IGRvbmUgIT0gb3V0cHV0LnNpemU6CiAgICAgICAgICAgIHBhcnRpYWwudW5saW5rKG1pc3Npbmdf b2s9VHJ1ZSkKICAgICAgICAgICAgcmFpc2UgQXBpRXJyb3IoCiAgICAgICAgICAgICAgICBmIlRo ZSBkb3dubG9hZGVkIGZpbGUgaXMgaW5jb21wbGV0ZSAoe2RvbmV9IG9mIHtvdXRwdXQuc2l6ZX0g Ynl0ZXMpLiAiCiAgICAgICAgICAgICAgICArIERPV05MT0FEX0hJTlQKICAgICAgICAgICAgKQog ICAgICAgIGlmIG91dHB1dC5jaGVja3N1bSBhbmQgZGlnZXN0LmhleGRpZ2VzdCgpICE9IG91dHB1 dC5jaGVja3N1bS5sb3dlcigpOgogICAgICAgICAgICBwYXJ0aWFsLnVubGluayhtaXNzaW5nX29r PVRydWUpCiAgICAgICAgICAgIHJhaXNlIEFwaUVycm9yKGYiVGhlIGRvd25sb2FkZWQgZmlsZSBp cyBkYW1hZ2VkIChjaGVja3N1bSBtaXNtYXRjaCkuIHtET1dOTE9BRF9ISU5UfSIpCiAgICAgICAg cGFydGlhbC5yZXBsYWNlKHRhcmdldCkKCiAgICBkZWYgX3Byb2R1Y3Rpb24oc2VsZiwgZGF0YTog QW55KSAtPiBQcm9kdWN0aW9uOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGEsIGRpY3Qp IG9yIG5vdCBkYXRhLmdldCgidXVpZCIpOgogICAgICAgICAgICByYWlzZSBBcGlFcnJvcigiQXVw aG9uaWMgc2VudCBhbiB1bmV4cGVjdGVkIGFuc3dlciBmb3IgdGhlIHByb2R1Y3Rpb24uIikKICAg ICAgICByZXR1cm4gUHJvZHVjdGlvbi5mcm9tX2FwaShkYXRhKQoKCmRlZiBfcmVhZF9lcnJvcl9i b2R5KGV4YzogdXJsbGliLmVycm9yLkhUVFBFcnJvcikgLT4gc3RyOgogICAgdHJ5OgogICAgICAg IHJldHVybiBleGMucmVhZCgpLmRlY29kZSgidXRmLTgiLCBlcnJvcnM9InJlcGxhY2UiKQogICAg ZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4gIiIKUEsDBBQAAAAAABRbal13w78bWRAA AFkQAAAYAAAAYXVwaG9uaWNfcmVzb2x2ZS9hdXRoLnB5IiIiTG9naW4gd2l0aCBhbiBBdXBob25p YyBBUEkga2V5LCBzdG9yaW5nIHRoZSBrZXksIGFuZCBsb2dvdXQuCgpVc2VycyBjcmVhdGUgdGhl IGtleSBpbiB0aGVpciBBdXBob25pYyBhY2NvdW50IHNldHRpbmdzIChgYGxpbmtzLkFQSV9LRVlf VVJMYGApIGFuZApwYXN0ZSBpdCBpbnRvIHRoZSBsb2dpbiB3aW5kb3cuIEl0J3MgY2hlY2tlZCBi eSBsb2FkaW5nIHRoZSBhY2NvdW50LCB0aGVuIHNhdmVkIGluIHRoZQpzeXN0ZW0ga2V5cmluZyB3 aGVuICJSZW1lbWJlciBtZSIgaXMgY2hlY2tlZCwgb3RoZXJ3aXNlIGtlcHQgaW4gbWVtb3J5IGZv ciB0aGlzIHNlc3Npb24Kb25seS4gSXQncyBuZXZlciB3cml0dGVuIHRvIGEgcGxhaW4gZmlsZTog d2l0aG91dCBhIGtleXJpbmcsIGl0IGlzbid0IHNhdmVkIGF0IGFsbC4KIiIiCgpmcm9tIF9fZnV0 dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgpmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgQ2Fs bGFibGUKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCgpmcm9tIC4gaW1wb3J0IGxv Zwpmcm9tIC5hdXBob25pY19hcGkgaW1wb3J0IEFjY291bnQsIEF1cGhvbmljQ2xpZW50LCBBdXRo RXJyb3IKZnJvbSAuY3JlZGVudGlhbHMgaW1wb3J0IENyZWRlbnRpYWxTdG9yZUVycm9yLCBLZXly aW5nU3RvcmUKClRPS0VOX0FDQ09VTlQgPSAiYXBpLWtleSIKIyBFYXJsaWVyIHRlc3QgYnVpbGRz IGxvZ2dlZCBpbiB3aXRoIGVtYWlsIGFuZCBwYXNzd29yZCBhbmQgc3RvcmVkIGFuIE9BdXRoIHRv a2VuIGhlcmUuCk9MRF9UT0tFTl9BQ0NPVU5UID0gIm9hdXRoLXRva2VuIgoKTUFMRk9STUVEX0tF WSA9ICgKICAgICJUaGF0IGRvZXNuJ3QgbG9vayBsaWtlIGFuIEF1cGhvbmljIEFQSSBrZXkuIENv cHkgaXQgZnJvbSB5b3VyIEF1cGhvbmljIGFjY291bnQgIgogICAgInNldHRpbmdzIGFuZCBwYXN0 ZSBpdCBhZ2Fpbi4iCikKSU5WQUxJRF9LRVkgPSAoCiAgICAiQXVwaG9uaWMgZGlkbid0IGFjY2Vw dCB0aGlzIEFQSSBrZXkuIENoZWNrIHRoYXQgeW91IGNvcGllZCBhbGwgb2YgaXQsIG9yIGNyZWF0 ZSBhICIKICAgICJuZXcgb25lIGluIHlvdXIgQXVwaG9uaWMgYWNjb3VudCBzZXR0aW5ncy4iCikK U0FWRURfS0VZX0lOVkFMSUQgPSAoCiAgICAiWW91ciBzYXZlZCBBUEkga2V5IGRvZXNuJ3Qgd29y ayBhbnltb3JlIChpdCBtYXkgaGF2ZSBiZWVuIHJlc2V0KS4gUGxlYXNlIHBhc3RlICIKICAgICJ5 b3VyIGN1cnJlbnQgQVBJIGtleS4iCikKCgpkZWYgY2xlYW5fYXBpX2tleSh0ZXh0OiBzdHIpIC0+ IHN0ciB8IE5vbmU6CiAgICAiIiJUaGUgcGFzdGVkIGtleSB3aXRob3V0IHN1cnJvdW5kaW5nIHdo aXRlc3BhY2UsIG9yIGBgTm9uZWBgIGlmIGl0IGNhbid0IGJlIGEga2V5LgoKICAgIFRoZSBrZXkg Z29lcyBpbnRvIGFuIEhUVFAgaGVhZGVyLCBzbyBvbmx5IHZpc2libGUgQVNDSUkgY2hhcmFjdGVy cyBhcmUgYWNjZXB0ZWQuCiAgICAiIiIKICAgIGtleSA9IHRleHQuc3RyaXAoKQogICAgaWYgbm90 IDggPD0gbGVuKGtleSkgPD0gMjU2IG9yIG5vdCBhbGwoIiEiIDw9IGMgPD0gIn4iIGZvciBjIGlu IGtleSk6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHJldHVybiBrZXkKCgpAZGF0YWNsYXNzCmNs YXNzIFNlc3Npb246CiAgICBjbGllbnQ6IEF1cGhvbmljQ2xpZW50CiAgICBhY2NvdW50OiBBY2Nv dW50CiAgICByZW1lbWJlcmVkOiBib29sCgoKY2xhc3MgQXV0aE1hbmFnZXI6CiAgICBkZWYgX19p bml0X18oCiAgICAgICAgc2VsZiwKICAgICAgICBzdG9yZTogS2V5cmluZ1N0b3JlLAogICAgICAg IGNsaWVudF9mYWN0b3J5OiBDYWxsYWJsZVtbc3RyIHwgTm9uZV0sIEF1cGhvbmljQ2xpZW50XSA9 IEF1cGhvbmljQ2xpZW50LAogICAgKSAtPiBOb25lOgogICAgICAgIHNlbGYuc3RvcmUgPSBzdG9y ZQogICAgICAgIHNlbGYuY2xpZW50X2ZhY3RvcnkgPSBjbGllbnRfZmFjdG9yeQoKICAgIGRlZiBy ZXN0b3JlKHNlbGYpIC0+IFNlc3Npb24gfCBOb25lOgogICAgICAgICIiIlJlc3VtZSBhIHJlbWVt YmVyZWQgbG9naW4uIFJldHVybnMgYGBOb25lYGAgaWYgdGhlcmUgaXMgbm9uZS4KCiAgICAgICAg QSBzYXZlZCBrZXkgQXVwaG9uaWMgcmVqZWN0cyBpcyBkZWxldGVkIGFuZCByYWlzZXMgYGBBdXRo RXJyb3JgYC4gTmV0d29yayBlcnJvcnMKICAgICAgICBwcm9wYWdhdGUsIHNvIHRoZSBVSSBjYW4g c2F5ICJvZmZsaW5lIiB3aXRob3V0IGZvcmdldHRpbmcgdGhlIHNhdmVkIGtleS4KICAgICAgICAi IiIKICAgICAgICBzZWxmLnN0b3JlLmRlbGV0ZV9vbGRfZmlsZSgpCiAgICAgICAgc2VsZi5zdG9y ZS5kZWxldGUoT0xEX1RPS0VOX0FDQ09VTlQpCiAgICAgICAga2V5ID0gc2VsZi5zdG9yZS5nZXQo VE9LRU5fQUNDT1VOVCkKICAgICAgICBpZiBub3Qga2V5OgogICAgICAgICAgICByZXR1cm4gTm9u ZQogICAgICAgIGNsaWVudCA9IHNlbGYuY2xpZW50X2ZhY3Rvcnkoa2V5KQogICAgICAgIHRyeToK ICAgICAgICAgICAgYWNjb3VudCA9IGNsaWVudC5nZXRfYWNjb3VudCgpCiAgICAgICAgZXhjZXB0 IEF1dGhFcnJvciBhcyBleGM6CiAgICAgICAgICAgIGxvZy5pbmZvKCJBdXBob25pYyByZWplY3Rl ZCB0aGUgc2F2ZWQgQVBJIGtleTsgaXQgd2FzIGRlbGV0ZWQuIikKICAgICAgICAgICAgc2VsZi5z dG9yZS5kZWxldGUoVE9LRU5fQUNDT1VOVCkKICAgICAgICAgICAgcmFpc2UgQXV0aEVycm9yKFNB VkVEX0tFWV9JTlZBTElELCBzdGF0dXM9ZXhjLnN0YXR1cywgYm9keT1leGMuYm9keSkgZnJvbSBl eGMKICAgICAgICByZXR1cm4gU2Vzc2lvbihjbGllbnQ9Y2xpZW50LCBhY2NvdW50PWFjY291bnQs IHJlbWVtYmVyZWQ9VHJ1ZSkKCiAgICBkZWYgbG9naW4oc2VsZiwgYXBpX2tleTogc3RyLCByZW1l bWJlcjogYm9vbCkgLT4gU2Vzc2lvbjoKICAgICAgICAiIiJDaGVjayB0aGUga2V5IGJ5IGxvYWRp bmcgdGhlIGFjY291bnQsIHRoZW4ga2VlcCBpdC4gUnVucyBpbiBhIHdvcmtlci4KCiAgICAgICAg YGBTZXNzaW9uLnJlbWVtYmVyZWRgYCBpcyBGYWxzZSBpZiB0aGUga2V5IGNvdWxkbid0IGJlIHNh dmVkOyBpdCB0aGVuIHdvcmtzIGZvcgogICAgICAgIHRoaXMgc2Vzc2lvbiBvbmx5LgogICAgICAg ICIiIgogICAgICAgIGtleSA9IGNsZWFuX2FwaV9rZXkoYXBpX2tleSkKICAgICAgICBpZiBrZXkg aXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgQXV0aEVycm9yKE1BTEZPUk1FRF9LRVkpCiAgICAg ICAgY2xpZW50ID0gc2VsZi5jbGllbnRfZmFjdG9yeShrZXkpCiAgICAgICAgdHJ5OgogICAgICAg ICAgICBhY2NvdW50ID0gY2xpZW50LmdldF9hY2NvdW50KCkKICAgICAgICBleGNlcHQgQXV0aEVy cm9yIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgQXV0aEVycm9yKElOVkFMSURfS0VZLCBzdGF0 dXM9ZXhjLnN0YXR1cywgYm9keT1leGMuYm9keSkgZnJvbSBleGMKICAgICAgICBzYXZlZCA9IEZh bHNlCiAgICAgICAgaWYgcmVtZW1iZXIgYW5kIHNlbGYuc3RvcmUuYXZhaWxhYmxlOgogICAgICAg ICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLnN0b3JlLnNldChUT0tFTl9BQ0NPVU5ULCBr ZXkpCiAgICAgICAgICAgICAgICBzYXZlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IENyZWRl bnRpYWxTdG9yZUVycm9yIGFzIGV4YzoKICAgICAgICAgICAgICAgIGxvZy5lcnJvcihmIkNvdWxk bid0IHNhdmUgdGhlIEFQSSBrZXkgaW4ge3NlbGYuc3RvcmUubmFtZX0uIiwgZXhjKQogICAgICAg IGlmIG5vdCBzYXZlZDoKICAgICAgICAgICAgc2VsZi5zdG9yZS5kZWxldGUoVE9LRU5fQUNDT1VO VCkKICAgICAgICBsb2cuaW5mbygKICAgICAgICAgICAgZiJMb2dnZWQgaW4gYXMge2FjY291bnQu bG9nX25hbWV9OyBBUEkga2V5ICIKICAgICAgICAgICAgZiJ7J3NhdmVkIGluICcgKyBzZWxmLnN0 b3JlLm5hbWUgaWYgc2F2ZWQgZWxzZSAna2VwdCBpbiBtZW1vcnkgb25seSd9LiIKICAgICAgICAp CiAgICAgICAgcmV0dXJuIFNlc3Npb24oY2xpZW50PWNsaWVudCwgYWNjb3VudD1hY2NvdW50LCBy ZW1lbWJlcmVkPXNhdmVkKQoKICAgIGRlZiBsb2dvdXQoc2VsZikgLT4gTm9uZToKICAgICAgICBz ZWxmLnN0b3JlLmRlbGV0ZShUT0tFTl9BQ0NPVU5UKQogICAgICAgIGxvZy5pbmZvKCJMb2dnZWQg b3V0OyB0aGUgc2F2ZWQgQVBJIGtleSB3YXMgZGVsZXRlZCBmcm9tIHRoaXMgY29tcHV0ZXIuIikK UEsDBBQAAAAAABRbal26M+IHrgoAAK4KAAAaAAAAYXVwaG9uaWNfcmVzb2x2ZS9jb21wYXQucHki IiJTdXBwb3J0ZWQgRGFWaW5jaSBSZXNvbHZlIGFuZCBQeXRob24gdmVyc2lvbnMgKHNpbmdsZSBz b3VyY2Ugb2YgdHJ1dGgpLgoKLSBSZXNvbHZlIFN0dWRpbyAyMS4xIGFuZCBuZXdlcjogUmVzb2x2 ZSdzIGJ1aWx0LWluIFB5dGhvbiAoMy4xNCBpbiAyMS4xKS4KLSBSZXNvbHZlIFN0dWRpbyAxOSwg MjAgYW5kIDIxLjA6IHRoZSB1c2VyJ3Mgb3duIFB5dGhvbiAzLjEwIG9yIG5ld2VyLgoKVGhlIHBs dWdpbiBjYW4ndCBjaG9vc2UgdGhlIGludGVycHJldGVyOiBSZXNvbHZlIGxvYWRzIFB5dGhvbiBi ZWZvcmUgYW55IG9mIG91cgpjb2RlIHJ1bnMuIE9uIDIxLjErIHdlIHRoZXJlZm9yZSBvbmx5IGRl dGVjdCBhbmQgcmVwb3J0IHdoZW4gUmVzb2x2ZSB1c2VzIGFub3RoZXIKUHl0aG9uIHRoYW4gaXRz IGJ1aWx0LWluIG9uZS4gS2VlcCBgYE1JTl9SRVNPTFZFYGAgaW4gc3luYyB3aXRoIGxhdW5jaGVy L0F1cGhvbmljLmx1YQooYSB0ZXN0IGNoZWNrcyB0aGlzKS4KIiIiCgpmcm9tIF9fZnV0dXJlX18g aW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzeXMKZnJvbSB0 eXBpbmcgaW1wb3J0IEFueQoKZnJvbSAuIGltcG9ydCBNSU5fUFlUSE9OCgpNSU5fUkVTT0xWRSA9 ICgxOSwgMCkKQlVJTFRJTl9QWVRIT05fU0lOQ0UgPSAoMjEsIDEpCgpfX2FsbF9fID0gWwogICAg IkJVSUxUSU5fUFlUSE9OX1NJTkNFIiwKICAgICJNSU5fUFlUSE9OIiwKICAgICJNSU5fUkVTT0xW RSIsCiAgICAiaXNfYnVpbHRpbl9weXRob24iLAogICAgInBhcnNlX3Jlc29sdmVfdmVyc2lvbiIs CiAgICAicHl0aG9uX3dhcm5pbmciLAogICAgInJlc29sdmVfdmVyc2lvbiIsCl0KCgpkZWYgcGFy c2VfcmVzb2x2ZV92ZXJzaW9uKHRleHQ6IHN0cikgLT4gdHVwbGVbaW50LCAuLi5dIHwgTm9uZToK ICAgICIiIlBhcnNlIGBgR2V0VmVyc2lvblN0cmluZygpYGAgb3V0cHV0IHN1Y2ggYXMgYGAiMjEu MS4xLjEwImBgIG9yIGBgIjIwLjIuMWIuNiJgYC4iIiIKICAgIHBhcnRzOiBsaXN0W2ludF0gPSBb XQogICAgZm9yIHNlZ21lbnQgaW4gc3RyKHRleHQpLnN0cmlwKCkuc3BsaXQoIi4iKToKICAgICAg ICBtYXRjaCA9IHJlLm1hdGNoKHIiXGQrIiwgc2VnbWVudCkKICAgICAgICBpZiBub3QgbWF0Y2g6 CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcGFydHMuYXBwZW5kKGludChtYXRjaC5ncm91cCgp KSkKICAgICAgICBpZiBtYXRjaC5ncm91cCgpICE9IHNlZ21lbnQ6ICAjIGEgc3VmZml4IGxpa2Ug IjFiIiBlbmRzIHRoZSBudW1lcmljIHBhcnQKICAgICAgICAgICAgYnJlYWsKICAgIHJldHVybiB0 dXBsZShwYXJ0cykgaWYgbGVuKHBhcnRzKSA+PSAyIGVsc2UgTm9uZQoKCmRlZiByZXNvbHZlX3Zl cnNpb24ocmVzb2x2ZTogQW55KSAtPiB0dXBsZVtpbnQsIC4uLl0gfCBOb25lOgogICAgaWYgcmVz b2x2ZSBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICB0cnk6CiAgICAgICAgcmV0dXJu IHBhcnNlX3Jlc29sdmVfdmVyc2lvbihyZXNvbHZlLkdldFZlcnNpb25TdHJpbmcoKSkKICAgIGV4 Y2VwdCBFeGNlcHRpb246ICAjIGRpYWdub3N0aWNzIG11c3QgbmV2ZXIgZmFpbAogICAgICAgIHJl dHVybiBOb25lCgoKZGVmIGlzX2J1aWx0aW5fcHl0aG9uKGV4ZWN1dGFibGU6IHN0ciB8IE5vbmUg PSBOb25lKSAtPiBib29sOgogICAgIiIiVHJ1ZSB3aGVuIHJ1bm5pbmcgaW5zaWRlIFJlc29sdmUn cyBlbWJlZGRlZCBQeXRob24uCgogICAgVGhlcmUsIGBgc3lzLmV4ZWN1dGFibGVgYCBpcyB0aGUg UmVzb2x2ZSBiaW5hcnkgcmF0aGVyIHRoYW4gYSBgYHB5dGhvbipgYCBwcm9ncmFtLgogICAgIiIi CiAgICBleGVjdXRhYmxlID0gc3lzLmV4ZWN1dGFibGUgaWYgZXhlY3V0YWJsZSBpcyBOb25lIGVs c2UgZXhlY3V0YWJsZQogICAgcmV0dXJuIG5vdCAoZXhlY3V0YWJsZSBhbmQgInB5dGhvbiIgaW4g b3MucGF0aC5iYXNlbmFtZShleGVjdXRhYmxlKS5sb3dlcigpKQoKCmRlZiBweXRob25fd2Fybmlu ZyhyZXNvbHZlOiBBbnksIGV4ZWN1dGFibGU6IHN0ciB8IE5vbmUgPSBOb25lKSAtPiBzdHIgfCBO b25lOgogICAgIiIiQSB3YXJuaW5nIHdoZW4gUmVzb2x2ZSAyMS4xKyBydW5zIGFub3RoZXIgUHl0 aG9uIHRoYW4gaXRzIGJ1aWx0LWluIG9uZS4iIiIKICAgIHZlcnNpb24gPSByZXNvbHZlX3ZlcnNp b24ocmVzb2x2ZSkKICAgIGlmIHZlcnNpb24gaXMgTm9uZSBvciB2ZXJzaW9uWzoyXSA8IEJVSUxU SU5fUFlUSE9OX1NJTkNFOgogICAgICAgIHJldHVybiBOb25lCiAgICBpZiBpc19idWlsdGluX3B5 dGhvbihleGVjdXRhYmxlKToKICAgICAgICByZXR1cm4gTm9uZQogICAgdXNlZCA9IHN5cy5leGVj dXRhYmxlIGlmIGV4ZWN1dGFibGUgaXMgTm9uZSBlbHNlIGV4ZWN1dGFibGUKICAgIHJldHVybiAo CiAgICAgICAgZiJEYVZpbmNpIFJlc29sdmUge3ZlcnNpb25bMF19Lnt2ZXJzaW9uWzFdfSBpbmNs dWRlcyBpdHMgb3duIFB5dGhvbiwgYnV0IGl0IGlzICIKICAgICAgICBmInVzaW5nIHt1c2VkfS4g QXVwaG9uaWMgaXMgdGVzdGVkIHdpdGggUmVzb2x2ZSdzIGJ1aWx0LWluIFB5dGhvbi4gSWYgeW91 IHJ1biAiCiAgICAgICAgImludG8gcHJvYmxlbXMsIHJlbW92ZSB0aGUgUFlUSE9OSE9NRSBhbmQg UFlUSE9OM0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNvICIKICAgICAgICAiUmVzb2x2ZSB1 c2VzIGl0cyBidWlsdC1pbiBQeXRob24sIHRoZW4gcmVzdGFydCBSZXNvbHZlLiIKICAgICkKUEsD BBQAAAAAABRbal2I29KRTA0AAEwNAAAaAAAAYXVwaG9uaWNfcmVzb2x2ZS9jb25maWcucHkiIiJT ZXR0aW5ncyBmaWxlIGxvY2F0aW9uIGFuZCBsb2FkL3NhdmUuCgpTZXR0aW5ncyBsaXZlIG91dHNp ZGUgUmVzb2x2ZSdzIFNjcmlwdHMgZm9sZGVyLCBzbyB1cGRhdGluZyB0aGUgcGx1Z2luIG5ldmVy Cmxvc2VzIHRoZW06CgotIFdpbmRvd3M6IGBgJUFQUERBVEElXFxBdXBob25pY1Jlc29sdmVcXGBg Ci0gbWFjT1M6IGBgfi9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvQXVwaG9uaWNSZXNvbHZl L2BgCi0gTGludXg6IGBgJFhER19DT05GSUdfSE9NRS9hdXBob25pYy1yZXNvbHZlL2BgIChkZWZh dWx0IGBgfi8uY29uZmlnL2F1cGhvbmljLXJlc29sdmUvYGApCiIiIgoKZnJvbSBfX2Z1dHVyZV9f IGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IGpzb24KaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1w b3J0IHRlbXBmaWxlCmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGFzZGljdCwgZGF0YWNsYXNzLCBm aWVsZCwgZmllbGRzCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIHR5cGluZyBpbXBvcnQg QW55Cgpmcm9tIC4gaW1wb3J0IGxvZwoKU0VUVElOR1NfRklMRSA9ICJzZXR0aW5ncy5qc29uIgoK CmRlZiBjb25maWdfZGlyKHBsYXRmb3JtOiBzdHIgPSBzeXMucGxhdGZvcm0sIGVudjogZGljdFtz dHIsIHN0cl0gfCBOb25lID0gTm9uZSkgLT4gUGF0aDoKICAgICIiIlJldHVybiB0aGUgcGVyLXVz ZXIgc2V0dGluZ3MgZm9sZGVyIGZvciBgYHBsYXRmb3JtYGAgKG5vdCBjcmVhdGVkKS4iIiIKICAg IGVudiA9IGRpY3Qob3MuZW52aXJvbikgaWYgZW52IGlzIE5vbmUgZWxzZSBlbnYKICAgIGhvbWUg PSBQYXRoKGVudi5nZXQoIkhPTUUiKSBvciBlbnYuZ2V0KCJVU0VSUFJPRklMRSIpIG9yIFBhdGgu aG9tZSgpKQogICAgaWYgcGxhdGZvcm0gPT0gIndpbjMyIjoKICAgICAgICBhcHBkYXRhID0gZW52 LmdldCgiQVBQREFUQSIpCiAgICAgICAgYmFzZSA9IFBhdGgoYXBwZGF0YSkgaWYgYXBwZGF0YSBl bHNlIGhvbWUgLyAiQXBwRGF0YSIgLyAiUm9hbWluZyIKICAgICAgICByZXR1cm4gYmFzZSAvICJB dXBob25pY1Jlc29sdmUiCiAgICBpZiBwbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICByZXR1 cm4gaG9tZSAvICJMaWJyYXJ5IiAvICJBcHBsaWNhdGlvbiBTdXBwb3J0IiAvICJBdXBob25pY1Jl c29sdmUiCiAgICB4ZGcgPSBlbnYuZ2V0KCJYREdfQ09ORklHX0hPTUUiKQogICAgYmFzZSA9IFBh dGgoeGRnKSBpZiB4ZGcgZWxzZSBob21lIC8gIi5jb25maWciCiAgICByZXR1cm4gYmFzZSAvICJh dXBob25pYy1yZXNvbHZlIgoKCkBkYXRhY2xhc3MKY2xhc3MgU2V0dGluZ3M6CiAgICAiIiJFdmVy eXRoaW5nIHRoZSBwbHVnaW4gcmVtZW1iZXJzIGJldHdlZW4gcnVucy4gTmV2ZXIgaG9sZHMgc2Vj cmV0cy4iIiIKCiAgICByZW1lbWJlcl9tZTogYm9vbCA9IFRydWUKICAgIGxhc3RfcHJlc2V0X3V1 aWQ6IHN0ciA9ICIiCiAgICBtdXRlX29yaWdpbmFsOiBib29sID0gRmFsc2UKICAgIGZvbGxvd190 aW1lbGluZV9zZWxlY3Rpb246IGJvb2wgPSBUcnVlCiAgICB3aW5kb3dfcG9zaXRpb246IGxpc3Rb aW50XSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQoKICAgIEBjbGFzc21ldGhvZAogICAg ZGVmIGZyb21fZGljdChjbHMsIGRhdGE6IGRpY3Rbc3RyLCBBbnldKSAtPiBTZXR0aW5nczoKICAg ICAgICAiIiJCdWlsZCBzZXR0aW5ncyBmcm9tIEpTT04sIGlnbm9yaW5nIHVua25vd24ga2V5cyBh bmQgd3JvbmdseSB0eXBlZCB2YWx1ZXMuIiIiCiAgICAgICAgZGVmYXVsdHMgPSBjbHMoKQogICAg ICAgIHZhbHVlczogZGljdFtzdHIsIEFueV0gPSB7fQogICAgICAgIGZvciBmIGluIGZpZWxkcyhj bHMpOgogICAgICAgICAgICBpZiBmLm5hbWUgaW4gZGF0YSBhbmQgaXNpbnN0YW5jZShkYXRhW2Yu bmFtZV0sIHR5cGUoZ2V0YXR0cihkZWZhdWx0cywgZi5uYW1lKSkpOgogICAgICAgICAgICAgICAg dmFsdWVzW2YubmFtZV0gPSBkYXRhW2YubmFtZV0KICAgICAgICByZXR1cm4gY2xzKCoqdmFsdWVz KQoKCmRlZiB3cml0ZV9wcml2YXRlX2ZpbGUocGF0aDogUGF0aCwgdGV4dDogc3RyKSAtPiBOb25l OgogICAgIiIiQXRvbWljYWxseSB3cml0ZSBgYHRleHRgYCB0byBgYHBhdGhgYCwgcmVhZGFibGUg b25seSBieSB0aGUgY3VycmVudCB1c2VyLiIiIgogICAgcGF0aC5wYXJlbnQubWtkaXIocGFyZW50 cz1UcnVlLCBleGlzdF9vaz1UcnVlKQogICAgZmQsIHRtcCA9IHRlbXBmaWxlLm1rc3RlbXAoZGly PXBhdGgucGFyZW50LCBwcmVmaXg9ZiIue3BhdGgubmFtZX0uIiwgc3VmZml4PSIudG1wIikKICAg IHRyeToKICAgICAgICB3aXRoIG9zLmZkb3BlbihmZCwgInciLCBlbmNvZGluZz0idXRmLTgiKSBh cyBoYW5kbGU6CiAgICAgICAgICAgIGhhbmRsZS53cml0ZSh0ZXh0KQogICAgICAgIGlmIG9zLm5h bWUgIT0gIm50IjoKICAgICAgICAgICAgb3MuY2htb2QodG1wLCAwbzYwMCkKICAgICAgICBvcy5y ZXBsYWNlKHRtcCwgcGF0aCkKICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uOgogICAgICAgIFBhdGgo dG1wKS51bmxpbmsobWlzc2luZ19vaz1UcnVlKQogICAgICAgIHJhaXNlCgoKY2xhc3MgU2V0dGlu Z3NTdG9yZToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXJlY3Rvcnk6IFBhdGggfCBOb25lID0g Tm9uZSkgLT4gTm9uZToKICAgICAgICBzZWxmLmRpcmVjdG9yeSA9IGRpcmVjdG9yeSBvciBjb25m aWdfZGlyKCkKICAgICAgICBzZWxmLnBhdGggPSBzZWxmLmRpcmVjdG9yeSAvIFNFVFRJTkdTX0ZJ TEUKCiAgICBkZWYgbG9hZChzZWxmKSAtPiBTZXR0aW5nczoKICAgICAgICB0cnk6CiAgICAgICAg ICAgIGRhdGEgPSBqc29uLmxvYWRzKHNlbGYucGF0aC5yZWFkX3RleHQoZW5jb2Rpbmc9InV0Zi04 IikpCiAgICAgICAgZXhjZXB0IEZpbGVOb3RGb3VuZEVycm9yOgogICAgICAgICAgICByZXR1cm4g U2V0dGluZ3MoKQogICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgVmFsdWVFcnJvcikgYXMgZXhjOgog ICAgICAgICAgICBsb2cuZXJyb3IoZiJDb3VsZG4ndCByZWFkIHNldHRpbmdzIGZyb20ge3NlbGYu cGF0aH0sIHVzaW5nIGRlZmF1bHRzLiIsIGV4YykKICAgICAgICAgICAgcmV0dXJuIFNldHRpbmdz KCkKICAgICAgICByZXR1cm4gU2V0dGluZ3MuZnJvbV9kaWN0KGRhdGEgaWYgaXNpbnN0YW5jZShk YXRhLCBkaWN0KSBlbHNlIHt9KQoKICAgIGRlZiBzYXZlKHNlbGYsIHNldHRpbmdzOiBTZXR0aW5n cykgLT4gTm9uZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdyaXRlX3ByaXZhdGVfZmlsZShz ZWxmLnBhdGgsIGpzb24uZHVtcHMoYXNkaWN0KHNldHRpbmdzKSwgaW5kZW50PTIpKQogICAgICAg IGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKICAgICAgICAgICAgbG9nLmVycm9yKGYiQ291bGRuJ3Qg c2F2ZSBzZXR0aW5ncyB0byB7c2VsZi5wYXRofS4iLCBleGMpClBLAwQUAAAAAAAUW2pdmGEc5bAM AACwDAAAKAAAAGF1cGhvbmljX3Jlc29sdmUvY3JlZGVudGlhbHMvX19pbml0X18ucHkiIiJPUyBj cmVkZW50aWFsIHN0b3JlcyBmb3IgdGhlIEF1cGhvbmljIEFQSSBrZXkgKHN0YW5kYXJkIGxpYnJh cnkgb25seSkuCgotIG1hY09TOiB0aGUgYGBzZWN1cml0eWBgIENMSSAobG9naW4ga2V5Y2hhaW4p Ci0gV2luZG93czogQ3JlZGVudGlhbCBNYW5hZ2VyIHZpYSBgYGN0eXBlc2BgCi0gTGludXg6IGBg c2VjcmV0LXRvb2xgYCAobGlic2VjcmV0KSwgaWYgaW5zdGFsbGVkCgpXaXRob3V0IG9uZSBvZiB0 aGVzZSwgdGhlIGtleSBpcyBuZXZlciBzYXZlZDogaXQncyBvbmx5IGtlcHQgaW4gbWVtb3J5LiBT ZWNyZXRzIGFyZQpwYXNzZWQgdG8gaGVscGVyIHByb2dyYW1zIHZpYSBzdGRpbiwgbmV2ZXIgb24g dGhlIGNvbW1hbmQgbGluZS4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25z CgppbXBvcnQgc3lzCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAoKZnJvbSAuLiBpbXBvcnQgbG9n CmZyb20gLmJhc2UgaW1wb3J0IENyZWRlbnRpYWxTdG9yZSwgQ3JlZGVudGlhbFN0b3JlRXJyb3IK ClNFUlZJQ0UgPSAiQXVwaG9uaWNSZXNvbHZlIgoKIyBUaGUgdW5lbmNyeXB0ZWQgZmFsbGJhY2sg ZmlsZSBvZiBlYXJsaWVyIHRlc3QgYnVpbGRzLCBpbiB0aGUgc2V0dGluZ3MgZm9sZGVyLgpPTERf UExBSU5URVhUX0ZJTEUgPSAiY3JlZGVudGlhbHMuanNvbiIKCl9fYWxsX18gPSBbCiAgICAiT0xE X1BMQUlOVEVYVF9GSUxFIiwKICAgICJTRVJWSUNFIiwKICAgICJDcmVkZW50aWFsU3RvcmUiLAog ICAgIkNyZWRlbnRpYWxTdG9yZUVycm9yIiwKICAgICJLZXlyaW5nU3RvcmUiLAogICAgImRlZmF1 bHRfc3RvcmUiLAogICAgInBsYXRmb3JtX3N0b3JlIiwKXQoKCmRlZiBwbGF0Zm9ybV9zdG9yZShw bGF0Zm9ybTogc3RyID0gc3lzLnBsYXRmb3JtKSAtPiBDcmVkZW50aWFsU3RvcmUgfCBOb25lOgog ICAgIiIiVGhlIE9TIGNyZWRlbnRpYWwgc3RvcmUgZm9yIGBgcGxhdGZvcm1gYCwgb3IgYGBOb25l YGAgaWYgaXQgaXNuJ3QgYXZhaWxhYmxlLiIiIgogICAgaWYgcGxhdGZvcm0gPT0gImRhcndpbiI6 CiAgICAgICAgZnJvbSAubWFjb3MgaW1wb3J0IE1hY0tleWNoYWluU3RvcmUKCiAgICAgICAgc3Rv cmU6IENyZWRlbnRpYWxTdG9yZSA9IE1hY0tleWNoYWluU3RvcmUoU0VSVklDRSkKICAgIGVsaWYg cGxhdGZvcm0gPT0gIndpbjMyIjoKICAgICAgICBmcm9tIC53aW5kb3dzIGltcG9ydCBXaW5kb3dz Q3JlZGVudGlhbFN0b3JlCgogICAgICAgIHN0b3JlID0gV2luZG93c0NyZWRlbnRpYWxTdG9yZShT RVJWSUNFKQogICAgZWxzZToKICAgICAgICBmcm9tIC5saW51eCBpbXBvcnQgU2VjcmV0VG9vbFN0 b3JlCgogICAgICAgIHN0b3JlID0gU2VjcmV0VG9vbFN0b3JlKFNFUlZJQ0UpCiAgICByZXR1cm4g c3RvcmUgaWYgc3RvcmUuYXZhaWxhYmxlKCkgZWxzZSBOb25lCgoKY2xhc3MgS2V5cmluZ1N0b3Jl OgogICAgIiIiVGhlIE9TIGNyZWRlbnRpYWwgc3RvcmUsIGlmIHRoZXJlIGlzIG9uZS4gTmV2ZXIg d3JpdGVzIGEgc2VjcmV0IHRvIGEgcGxhaW4gZmlsZS4iIiIKCiAgICBkZWYgX19pbml0X18oc2Vs ZiwgcHJpbWFyeTogQ3JlZGVudGlhbFN0b3JlIHwgTm9uZSwgb2xkX2ZpbGU6IFBhdGggfCBOb25l ID0gTm9uZSkgLT4gTm9uZToKICAgICAgICBzZWxmLnByaW1hcnkgPSBwcmltYXJ5CiAgICAgICAg c2VsZi5hdmFpbGFibGUgPSBwcmltYXJ5IGlzIG5vdCBOb25lCiAgICAgICAgc2VsZi5uYW1lID0g cHJpbWFyeS5uYW1lIGlmIHByaW1hcnkgZWxzZSAibm8gc3lzdGVtIGtleXJpbmciCiAgICAgICAg c2VsZi5vbGRfZmlsZSA9IG9sZF9maWxlCgogICAgZGVmIGdldChzZWxmLCBhY2NvdW50OiBzdHIp IC0+IHN0ciB8IE5vbmU6CiAgICAgICAgaWYgc2VsZi5wcmltYXJ5IGlzIE5vbmU6CiAgICAgICAg ICAgIHJldHVybiBOb25lCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5wcmlt YXJ5LmdldChhY2NvdW50KQogICAgICAgIGV4Y2VwdCBDcmVkZW50aWFsU3RvcmVFcnJvciBhcyBl eGM6CiAgICAgICAgICAgIGxvZy5lcnJvcihmIkNvdWxkbid0IHJlYWQgZnJvbSB7c2VsZi5wcmlt YXJ5Lm5hbWV9LiIsIGV4YykKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgc2V0KHNl bGYsIGFjY291bnQ6IHN0ciwgc2VjcmV0OiBzdHIpIC0+IE5vbmU6CiAgICAgICAgIiIiU2F2ZSBg YHNlY3JldGBgOyByYWlzZXMgYGBDcmVkZW50aWFsU3RvcmVFcnJvcmBgIGlmIGl0IGNhbid0IGJl IHNhdmVkLiIiIgogICAgICAgIGlmIHNlbGYucHJpbWFyeSBpcyBOb25lOgogICAgICAgICAgICBy YWlzZSBDcmVkZW50aWFsU3RvcmVFcnJvcigibm8gc3lzdGVtIGtleXJpbmciKQogICAgICAgIHNl bGYucHJpbWFyeS5zZXQoYWNjb3VudCwgc2VjcmV0KQoKICAgIGRlZiBkZWxldGUoc2VsZiwgYWNj b3VudDogc3RyKSAtPiBOb25lOgogICAgICAgIGlmIHNlbGYucHJpbWFyeSBpcyBub3QgTm9uZToK ICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5wcmltYXJ5LmRlbGV0ZShhY2Nv dW50KQogICAgICAgICAgICBleGNlcHQgQ3JlZGVudGlhbFN0b3JlRXJyb3IgYXMgZXhjOgogICAg ICAgICAgICAgICAgbG9nLmVycm9yKGYiQ291bGRuJ3QgZGVsZXRlIGZyb20ge3NlbGYucHJpbWFy eS5uYW1lfS4iLCBleGMpCgogICAgZGVmIGRlbGV0ZV9vbGRfZmlsZShzZWxmKSAtPiBOb25lOgog ICAgICAgICIiIkRlbGV0ZSB0aGUgdW5lbmNyeXB0ZWQgbG9naW4gZmlsZSBlYXJsaWVyIHRlc3Qg YnVpbGRzIG1heSBoYXZlIHdyaXR0ZW4uIiIiCiAgICAgICAgaWYgc2VsZi5vbGRfZmlsZSBpcyBO b25lIG9yIG5vdCBzZWxmLm9sZF9maWxlLmV4aXN0cygpOgogICAgICAgICAgICByZXR1cm4KICAg ICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYub2xkX2ZpbGUudW5saW5rKCkKICAgICAgICAgICAg bG9nLmluZm8oZiJEZWxldGVkIHRoZSB1bmVuY3J5cHRlZCBsb2dpbiBvZiBhbiBlYXJsaWVyIHZl cnNpb246IHtzZWxmLm9sZF9maWxlfSIpCiAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgog ICAgICAgICAgICBsb2cuZXJyb3IoZiJDb3VsZG4ndCBkZWxldGUge3NlbGYub2xkX2ZpbGV9OyBw bGVhc2UgZGVsZXRlIGl0IHlvdXJzZWxmLiIsIGV4YykKCgpkZWYgZGVmYXVsdF9zdG9yZShjb25m aWdfZGlyOiBQYXRoKSAtPiBLZXlyaW5nU3RvcmU6CiAgICByZXR1cm4gS2V5cmluZ1N0b3JlKHBs YXRmb3JtX3N0b3JlKCksIGNvbmZpZ19kaXIgLyBPTERfUExBSU5URVhUX0ZJTEUpClBLAwQUAAAA AAAUW2pdg6Zsq9EDAADRAwAAKAAAAGF1cGhvbmljX3Jlc29sdmUvY3JlZGVudGlhbHMvX3Byb2Nl c3MucHkiIiJSdW4gY3JlZGVudGlhbCBoZWxwZXIgcHJvZ3JhbXMgd2l0aCB0aGUgc2VjcmV0IG9u IHN0ZGluLiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IHN1 YnByb2Nlc3MKCmZyb20gLmJhc2UgaW1wb3J0IENyZWRlbnRpYWxTdG9yZUVycm9yCgpUSU1FT1VU X1NFQ09ORFMgPSA2MCAgIyB0aGUgT1MgbWF5IHNob3cgYW4gdW5sb2NrIHByb21wdAoKCmRlZiBy dW4oYXJnczogbGlzdFtzdHJdLCBzdGRpbjogc3RyID0gIiIpIC0+IHN1YnByb2Nlc3MuQ29tcGxl dGVkUHJvY2Vzc1tzdHJdOgogICAgdHJ5OgogICAgICAgIHJldHVybiBzdWJwcm9jZXNzLnJ1bigK ICAgICAgICAgICAgYXJncywKICAgICAgICAgICAgaW5wdXQ9c3RkaW4sCiAgICAgICAgICAgIGNh cHR1cmVfb3V0cHV0PVRydWUsCiAgICAgICAgICAgIHRleHQ9VHJ1ZSwKICAgICAgICAgICAgZW5j b2Rpbmc9InV0Zi04IiwKICAgICAgICAgICAgdGltZW91dD1USU1FT1VUX1NFQ09ORFMsCiAgICAg ICAgICAgIGNoZWNrPUZhbHNlLAogICAgICAgICkKICAgIGV4Y2VwdCAoT1NFcnJvciwgc3VicHJv Y2Vzcy5TdWJwcm9jZXNzRXJyb3IpIGFzIGV4YzoKICAgICAgICByYWlzZSBDcmVkZW50aWFsU3Rv cmVFcnJvcihmInthcmdzWzBdfSBmYWlsZWQ6IHtleGMhcn0iKSBmcm9tIGV4YwoKCmRlZiB3aXRo b3V0X3NlY3JldChvdXRwdXQ6IHN0ciwgc2VjcmV0OiBzdHIpIC0+IHN0cjoKICAgICIiIkEgaGVs cGVyJ3MgZXJyb3Igb3V0cHV0IGZvciB0aGUgQ29uc29sZSwgd2l0aCB0aGUgc2VjcmV0IGJsYW5r ZWQgb3V0IGluIGNhc2UgdGhlCiAgICBoZWxwZXIgZWNob2VzIGl0cyBpbnB1dCAoYGBzZWN1cml0 eSAtaWBgIGNhbiByZXBlYXQgdGhlIGZhaWxpbmcgY29tbWFuZCkuIiIiCiAgICByZXR1cm4gb3V0 cHV0LnN0cmlwKCkucmVwbGFjZShzZWNyZXQsICI8c2VjcmV0PiIpIGlmIHNlY3JldCBlbHNlIG91 dHB1dC5zdHJpcCgpClBLAwQUAAAAAAAUW2pdoOdp+OkBAADpAQAAJAAAAGF1cGhvbmljX3Jlc29s dmUvY3JlZGVudGlhbHMvYmFzZS5weSIiIkNvbW1vbiBpbnRlcmZhY2Ugb2YgdGhlIGNyZWRlbnRp YWwgc3RvcmVzLiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKZnJvbSB0 eXBpbmcgaW1wb3J0IFByb3RvY29sCgoKY2xhc3MgQ3JlZGVudGlhbFN0b3JlRXJyb3IoRXhjZXB0 aW9uKToKICAgICIiIkEgY3JlZGVudGlhbCBzdG9yZSBvcGVyYXRpb24gZmFpbGVkIChkZXRhaWxz IGZvciB0aGUgY29uc29sZSwgbm90IHRoZSB1c2VyKS4iIiIKCgpjbGFzcyBDcmVkZW50aWFsU3Rv cmUoUHJvdG9jb2wpOgogICAgbmFtZTogc3RyCgogICAgZGVmIGF2YWlsYWJsZShzZWxmKSAtPiBi b29sOiAuLi4KCiAgICBkZWYgZ2V0KHNlbGYsIGFjY291bnQ6IHN0cikgLT4gc3RyIHwgTm9uZTog Li4uCgogICAgZGVmIHNldChzZWxmLCBhY2NvdW50OiBzdHIsIHNlY3JldDogc3RyKSAtPiBOb25l OiAuLi4KCiAgICBkZWYgZGVsZXRlKHNlbGYsIGFjY291bnQ6IHN0cikgLT4gTm9uZTogLi4uClBL AwQUAAAAAAAUW2pdo7szsUIHAABCBwAAJQAAAGF1cGhvbmljX3Jlc29sdmUvY3JlZGVudGlhbHMv bGludXgucHkiIiJMaW51eCBTZWNyZXQgU2VydmljZSAoR05PTUUgS2V5cmluZywgS1dhbGxldCwg Li4uKSB2aWEgYGBzZWNyZXQtdG9vbGBgIChsaWJzZWNyZXQpLiIiIgoKZnJvbSBfX2Z1dHVyZV9f IGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IHNodXRpbAoKZnJvbSAuIGltcG9ydCBfcHJvY2Vz cwpmcm9tIC5iYXNlIGltcG9ydCBDcmVkZW50aWFsU3RvcmVFcnJvcgoKCmNsYXNzIFNlY3JldFRv b2xTdG9yZToKICAgIG5hbWUgPSAidGhlIHN5c3RlbSBrZXlyaW5nIChsaWJzZWNyZXQpIgoKICAg IGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2aWNlOiBzdHIsIGV4ZWN1dGFibGU6IHN0ciB8IE5vbmUg PSBOb25lKSAtPiBOb25lOgogICAgICAgIHNlbGYuc2VydmljZSA9IHNlcnZpY2UKICAgICAgICBz ZWxmLmV4ZWN1dGFibGUgPSBleGVjdXRhYmxlIG9yIHNodXRpbC53aGljaCgic2VjcmV0LXRvb2wi KSBvciAiIgoKICAgIGRlZiBhdmFpbGFibGUoc2VsZikgLT4gYm9vbDoKICAgICAgICByZXR1cm4g Ym9vbChzZWxmLmV4ZWN1dGFibGUpCgogICAgZGVmIF9hdHRycyhzZWxmLCBhY2NvdW50OiBzdHIp IC0+IGxpc3Rbc3RyXToKICAgICAgICByZXR1cm4gWyJzZXJ2aWNlIiwgc2VsZi5zZXJ2aWNlLCAi YWNjb3VudCIsIGFjY291bnRdCgogICAgZGVmIGdldChzZWxmLCBhY2NvdW50OiBzdHIpIC0+IHN0 ciB8IE5vbmU6CiAgICAgICAgcmVzdWx0ID0gX3Byb2Nlc3MucnVuKFtzZWxmLmV4ZWN1dGFibGUs ICJsb29rdXAiLCAqc2VsZi5fYXR0cnMoYWNjb3VudCldKQogICAgICAgIGlmIHJlc3VsdC5yZXR1 cm5jb2RlICE9IDA6CiAgICAgICAgICAgICMgc2VjcmV0LXRvb2wgZXhpdHMgd2l0aCAxIGJvdGgg Zm9yICJub3QgZm91bmQiIGFuZCBmb3IgZXJyb3JzOyBlcnJvcnMKICAgICAgICAgICAgIyBwcmlu dCB0byBzdGRlcnIuCiAgICAgICAgICAgIGlmIHJlc3VsdC5zdGRlcnIuc3RyaXAoKToKICAgICAg ICAgICAgICAgIHJhaXNlIENyZWRlbnRpYWxTdG9yZUVycm9yKGYic2VjcmV0LXRvb2wgbG9va3Vw OiB7cmVzdWx0LnN0ZGVyci5zdHJpcCgpfSIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAg ICAgcmV0dXJuIHJlc3VsdC5zdGRvdXQgb3IgTm9uZQoKICAgIGRlZiBzZXQoc2VsZiwgYWNjb3Vu dDogc3RyLCBzZWNyZXQ6IHN0cikgLT4gTm9uZToKICAgICAgICByZXN1bHQgPSBfcHJvY2Vzcy5y dW4oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0YWJsZSwKICAgICAg ICAgICAgICAgICJzdG9yZSIsCiAgICAgICAgICAgICAgICAiLS1sYWJlbD1BdXBob25pYyBmb3Ig RGFWaW5jaSBSZXNvbHZlIiwKICAgICAgICAgICAgICAgICpzZWxmLl9hdHRycyhhY2NvdW50KSwK ICAgICAgICAgICAgXSwKICAgICAgICAgICAgc3RkaW49c2VjcmV0LAogICAgICAgICkKICAgICAg ICBpZiByZXN1bHQucmV0dXJuY29kZSAhPSAwOgogICAgICAgICAgICBzdGRlcnIgPSBfcHJvY2Vz cy53aXRob3V0X3NlY3JldChyZXN1bHQuc3RkZXJyLCBzZWNyZXQpCiAgICAgICAgICAgIHJhaXNl IENyZWRlbnRpYWxTdG9yZUVycm9yKGYic2VjcmV0LXRvb2wgc3RvcmU6IHtzdGRlcnJ9IikKCiAg ICBkZWYgZGVsZXRlKHNlbGYsIGFjY291bnQ6IHN0cikgLT4gTm9uZToKICAgICAgICByZXN1bHQg PSBfcHJvY2Vzcy5ydW4oW3NlbGYuZXhlY3V0YWJsZSwgImNsZWFyIiwgKnNlbGYuX2F0dHJzKGFj Y291bnQpXSkKICAgICAgICBpZiByZXN1bHQucmV0dXJuY29kZSAhPSAwIGFuZCByZXN1bHQuc3Rk ZXJyLnN0cmlwKCk6CiAgICAgICAgICAgIHJhaXNlIENyZWRlbnRpYWxTdG9yZUVycm9yKGYic2Vj cmV0LXRvb2wgY2xlYXI6IHtyZXN1bHQuc3RkZXJyLnN0cmlwKCl9IikKUEsDBBQAAAAAABRbal1e Ia+o8ggAAPIIAAAlAAAAYXVwaG9uaWNfcmVzb2x2ZS9jcmVkZW50aWFscy9tYWNvcy5weSIiIm1h Y09TIGxvZ2luIGtleWNoYWluIHZpYSB0aGUgYGBzZWN1cml0eWBgIGNvbW1hbmQtbGluZSB0b29s LiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IG9zCmltcG9y dCByZQoKZnJvbSAuIGltcG9ydCBfcHJvY2Vzcwpmcm9tIC5iYXNlIGltcG9ydCBDcmVkZW50aWFs U3RvcmVFcnJvcgoKU0VDVVJJVFkgPSAiL3Vzci9iaW4vc2VjdXJpdHkiCl9JVEVNX05PVF9GT1VO RCA9IDQ0CiMgQ2hhcmFjdGVycyB0aGF0IGNhbiBiZSBwYXNzZWQgaW5zaWRlIGEgcXVvdGVkIGBg c2VjdXJpdHkgLWlgYCBjb21tYW5kLgpfU0FGRSA9IHJlLmNvbXBpbGUociJeW0EtWmEtejAtOS5f fisvPTpALV0rJCIpCgoKY2xhc3MgTWFjS2V5Y2hhaW5TdG9yZToKICAgIG5hbWUgPSAidGhlIG1h Y09TIGtleWNoYWluIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2aWNlOiBzdHIsIGV4ZWN1 dGFibGU6IHN0ciA9IFNFQ1VSSVRZKSAtPiBOb25lOgogICAgICAgIHNlbGYuc2VydmljZSA9IHNl cnZpY2UKICAgICAgICBzZWxmLmV4ZWN1dGFibGUgPSBleGVjdXRhYmxlCgogICAgZGVmIGF2YWls YWJsZShzZWxmKSAtPiBib29sOgogICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhzZWxmLmV4 ZWN1dGFibGUpCgogICAgZGVmIGdldChzZWxmLCBhY2NvdW50OiBzdHIpIC0+IHN0ciB8IE5vbmU6 CiAgICAgICAgcmVzdWx0ID0gX3Byb2Nlc3MucnVuKAogICAgICAgICAgICBbc2VsZi5leGVjdXRh YmxlLCAiZmluZC1nZW5lcmljLXBhc3N3b3JkIiwgIi1zIiwgc2VsZi5zZXJ2aWNlLCAiLWEiLCBh Y2NvdW50LCAiLXciXQogICAgICAgICkKICAgICAgICBpZiByZXN1bHQucmV0dXJuY29kZSA9PSBf SVRFTV9OT1RfRk9VTkQ6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgaWYgcmVzdWx0 LnJldHVybmNvZGUgIT0gMDoKICAgICAgICAgICAgcmFpc2UgQ3JlZGVudGlhbFN0b3JlRXJyb3Io ZiJzZWN1cml0eSBmaW5kLWdlbmVyaWMtcGFzc3dvcmQ6IHtyZXN1bHQuc3RkZXJyLnN0cmlwKCl9 IikKICAgICAgICByZXR1cm4gcmVzdWx0LnN0ZG91dC5yc3RyaXAoIlxuIikKCiAgICBkZWYgc2V0 KHNlbGYsIGFjY291bnQ6IHN0ciwgc2VjcmV0OiBzdHIpIC0+IE5vbmU6CiAgICAgICAgIyAiYWRk LWdlbmVyaWMtcGFzc3dvcmQgLXcgPHNlY3JldD4iIHdvdWxkIHB1dCB0aGUgc2VjcmV0IG9uIHRo ZSBjb21tYW5kIGxpbmUsCiAgICAgICAgIyB2aXNpYmxlIHRvIG90aGVyIHByb2Nlc3Nlcy4gInNl Y3VyaXR5IC1pIiByZWFkcyB0aGUgY29tbWFuZCBmcm9tIHN0ZGluIGluc3RlYWQuCiAgICAgICAg Zm9yIHZhbHVlIGluIChzZWxmLnNlcnZpY2UsIGFjY291bnQsIHNlY3JldCk6CiAgICAgICAgICAg IGlmIG5vdCBfU0FGRS5tYXRjaCh2YWx1ZSk6CiAgICAgICAgICAgICAgICByYWlzZSBDcmVkZW50 aWFsU3RvcmVFcnJvcigidmFsdWUgY29udGFpbnMgY2hhcmFjdGVycyBzZWN1cml0eSAtaSBjYW4n dCB0YWtlIikKICAgICAgICBjb21tYW5kID0gKAogICAgICAgICAgICBmJ2FkZC1nZW5lcmljLXBh c3N3b3JkIC1VIC1zICJ7c2VsZi5zZXJ2aWNlfSIgLWEgInthY2NvdW50fSIgJwogICAgICAgICAg ICBmJy1sICJBdXBob25pYyBmb3IgRGFWaW5jaSBSZXNvbHZlIiAtdyAie3NlY3JldH0iXG4nCiAg ICAgICAgKQogICAgICAgIHJlc3VsdCA9IF9wcm9jZXNzLnJ1bihbc2VsZi5leGVjdXRhYmxlLCAi LWkiXSwgc3RkaW49Y29tbWFuZCkKICAgICAgICBpZiByZXN1bHQucmV0dXJuY29kZSAhPSAwIG9y IHNlbGYuZ2V0KGFjY291bnQpICE9IHNlY3JldDoKICAgICAgICAgICAgc3RkZXJyID0gX3Byb2Nl c3Mud2l0aG91dF9zZWNyZXQocmVzdWx0LnN0ZGVyciwgc2VjcmV0KQogICAgICAgICAgICByYWlz ZSBDcmVkZW50aWFsU3RvcmVFcnJvcihmInNlY3VyaXR5IGFkZC1nZW5lcmljLXBhc3N3b3JkOiB7 c3RkZXJyfSIpCgogICAgZGVmIGRlbGV0ZShzZWxmLCBhY2NvdW50OiBzdHIpIC0+IE5vbmU6CiAg ICAgICAgcmVzdWx0ID0gX3Byb2Nlc3MucnVuKAogICAgICAgICAgICBbc2VsZi5leGVjdXRhYmxl LCAiZGVsZXRlLWdlbmVyaWMtcGFzc3dvcmQiLCAiLXMiLCBzZWxmLnNlcnZpY2UsICItYSIsIGFj Y291bnRdCiAgICAgICAgKQogICAgICAgIGlmIHJlc3VsdC5yZXR1cm5jb2RlIG5vdCBpbiAoMCwg X0lURU1fTk9UX0ZPVU5EKToKICAgICAgICAgICAgcmFpc2UgQ3JlZGVudGlhbFN0b3JlRXJyb3Io ZiJzZWN1cml0eSBkZWxldGUtZ2VuZXJpYy1wYXNzd29yZDoge3Jlc3VsdC5zdGRlcnIuc3RyaXAo KX0iKQpQSwMEFAAAAAAAFFtqXT+JC1QzDQAAMw0AACcAAABhdXBob25pY19yZXNvbHZlL2NyZWRl bnRpYWxzL3dpbmRvd3MucHkiIiJXaW5kb3dzIENyZWRlbnRpYWwgTWFuYWdlciB2aWEgYGBjdHlw ZXNgYCAoQ3JlZFdyaXRlVyAvIENyZWRSZWFkVyAvIENyZWREZWxldGVXKS4iIiIKCmZyb20gX19m dXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCmltcG9ydCBjdHlwZXMKZnJvbSBjdHlwZXMgaW1w b3J0IHdpbnR5cGVzCmZyb20gdHlwaW5nIGltcG9ydCBBbnkKCmZyb20gLmJhc2UgaW1wb3J0IENy ZWRlbnRpYWxTdG9yZUVycm9yCgpDUkVEX1RZUEVfR0VORVJJQyA9IDEKQ1JFRF9QRVJTSVNUX0xP Q0FMX01BQ0hJTkUgPSAyCkVSUk9SX05PVF9GT1VORCA9IDExNjgKCgpjbGFzcyBDUkVERU5USUFM VyhjdHlwZXMuU3RydWN0dXJlKToKICAgIF9maWVsZHNfID0gWwogICAgICAgICgiRmxhZ3MiLCB3 aW50eXBlcy5EV09SRCksCiAgICAgICAgKCJUeXBlIiwgd2ludHlwZXMuRFdPUkQpLAogICAgICAg ICgiVGFyZ2V0TmFtZSIsIHdpbnR5cGVzLkxQV1NUUiksCiAgICAgICAgKCJDb21tZW50Iiwgd2lu dHlwZXMuTFBXU1RSKSwKICAgICAgICAoIkxhc3RXcml0dGVuIiwgd2ludHlwZXMuRklMRVRJTUUp LAogICAgICAgICgiQ3JlZGVudGlhbEJsb2JTaXplIiwgd2ludHlwZXMuRFdPUkQpLAogICAgICAg ICgiQ3JlZGVudGlhbEJsb2IiLCBjdHlwZXMuUE9JTlRFUihjdHlwZXMuY191Ynl0ZSkpLAogICAg ICAgICgiUGVyc2lzdCIsIHdpbnR5cGVzLkRXT1JEKSwKICAgICAgICAoIkF0dHJpYnV0ZUNvdW50 Iiwgd2ludHlwZXMuRFdPUkQpLAogICAgICAgICgiQXR0cmlidXRlcyIsIGN0eXBlcy5jX3ZvaWRf cCksCiAgICAgICAgKCJUYXJnZXRBbGlhcyIsIHdpbnR5cGVzLkxQV1NUUiksCiAgICAgICAgKCJV c2VyTmFtZSIsIHdpbnR5cGVzLkxQV1NUUiksCiAgICBdCgoKZGVmIF9sb2FkX2FkdmFwaTMyKCkg LT4gQW55OgogICAgcmV0dXJuIGN0eXBlcy5XaW5ETEwoImFkdmFwaTMyIiwgdXNlX2xhc3RfZXJy b3I9VHJ1ZSkgICMgdHlwZTogaWdub3JlW2F0dHItZGVmaW5lZCx1bnVzZWQtaWdub3JlXQoKCmNs YXNzIFdpbmRvd3NDcmVkZW50aWFsU3RvcmU6CiAgICBuYW1lID0gIldpbmRvd3MgQ3JlZGVudGlh bCBNYW5hZ2VyIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2aWNlOiBzdHIsIGFkdmFwaTMy OiBBbnkgPSBOb25lLCBnZXRfbGFzdF9lcnJvcjogQW55ID0gTm9uZSkgLT4gTm9uZToKICAgICAg ICBzZWxmLnNlcnZpY2UgPSBzZXJ2aWNlCiAgICAgICAgc2VsZi5fYWR2YXBpMzIgPSBhZHZhcGkz MgogICAgICAgIHNlbGYuX2dldF9sYXN0X2Vycm9yID0gZ2V0X2xhc3RfZXJyb3Igb3IgZ2V0YXR0 cihjdHlwZXMsICJnZXRfbGFzdF9lcnJvciIsIGxhbWJkYTogMCkKCiAgICBAcHJvcGVydHkKICAg IGRlZiBhZHZhcGkzMihzZWxmKSAtPiBBbnk6CiAgICAgICAgaWYgc2VsZi5fYWR2YXBpMzIgaXMg Tm9uZToKICAgICAgICAgICAgc2VsZi5fYWR2YXBpMzIgPSBfbG9hZF9hZHZhcGkzMigpCiAgICAg ICAgcmV0dXJuIHNlbGYuX2FkdmFwaTMyCgogICAgZGVmIGF2YWlsYWJsZShzZWxmKSAtPiBib29s OgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuYWR2YXBpMzIgaXMgbm90IE5v bmUKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICAgICAg cmV0dXJuIEZhbHNlCgogICAgZGVmIF90YXJnZXQoc2VsZiwgYWNjb3VudDogc3RyKSAtPiBzdHI6 CiAgICAgICAgcmV0dXJuIGYie3NlbGYuc2VydmljZX0ve2FjY291bnR9IgoKICAgIGRlZiBnZXQo c2VsZiwgYWNjb3VudDogc3RyKSAtPiBzdHIgfCBOb25lOgogICAgICAgIHBjcmVkID0gY3R5cGVz LlBPSU5URVIoQ1JFREVOVElBTFcpKCkKICAgICAgICBpZiBub3Qgc2VsZi5hZHZhcGkzMi5DcmVk UmVhZFcoCiAgICAgICAgICAgIHNlbGYuX3RhcmdldChhY2NvdW50KSwgQ1JFRF9UWVBFX0dFTkVS SUMsIDAsIGN0eXBlcy5ieXJlZihwY3JlZCkKICAgICAgICApOgogICAgICAgICAgICBlcnJvciA9 IHNlbGYuX2dldF9sYXN0X2Vycm9yKCkKICAgICAgICAgICAgaWYgZXJyb3IgPT0gRVJST1JfTk9U X0ZPVU5EOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgcmFpc2UgQ3Jl ZGVudGlhbFN0b3JlRXJyb3IoZiJDcmVkUmVhZFcgZmFpbGVkIHdpdGggZXJyb3Ige2Vycm9yfSIp CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjcmVkID0gcGNyZWQuY29udGVudHMKICAgICAgICAg ICAgYmxvYiA9IGN0eXBlcy5zdHJpbmdfYXQoY3JlZC5DcmVkZW50aWFsQmxvYiwgY3JlZC5DcmVk ZW50aWFsQmxvYlNpemUpCiAgICAgICAgICAgIHJldHVybiBibG9iLmRlY29kZSgidXRmLTgiKQog ICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuYWR2YXBpMzIuQ3JlZEZyZWUocGNyZWQp CgogICAgZGVmIHNldChzZWxmLCBhY2NvdW50OiBzdHIsIHNlY3JldDogc3RyKSAtPiBOb25lOgog ICAgICAgIGJsb2IgPSBzZWNyZXQuZW5jb2RlKCJ1dGYtOCIpCiAgICAgICAgYnVmZmVyID0gKGN0 eXBlcy5jX3VieXRlICogbGVuKGJsb2IpKS5mcm9tX2J1ZmZlcl9jb3B5KGJsb2IpCiAgICAgICAg Y3JlZCA9IENSRURFTlRJQUxXKCkKICAgICAgICBjcmVkLlR5cGUgPSBDUkVEX1RZUEVfR0VORVJJ QwogICAgICAgIGNyZWQuVGFyZ2V0TmFtZSA9IHNlbGYuX3RhcmdldChhY2NvdW50KQogICAgICAg IGNyZWQuQ3JlZGVudGlhbEJsb2JTaXplID0gbGVuKGJsb2IpCiAgICAgICAgY3JlZC5DcmVkZW50 aWFsQmxvYiA9IGN0eXBlcy5jYXN0KGJ1ZmZlciwgY3R5cGVzLlBPSU5URVIoY3R5cGVzLmNfdWJ5 dGUpKQogICAgICAgIGNyZWQuUGVyc2lzdCA9IENSRURfUEVSU0lTVF9MT0NBTF9NQUNISU5FCiAg ICAgICAgY3JlZC5Vc2VyTmFtZSA9IGFjY291bnQKICAgICAgICBjcmVkLkNvbW1lbnQgPSAiQXVw aG9uaWMgZm9yIERhVmluY2kgUmVzb2x2ZSIKICAgICAgICBpZiBub3Qgc2VsZi5hZHZhcGkzMi5D cmVkV3JpdGVXKGN0eXBlcy5ieXJlZihjcmVkKSwgMCk6CiAgICAgICAgICAgIHJhaXNlIENyZWRl bnRpYWxTdG9yZUVycm9yKGYiQ3JlZFdyaXRlVyBmYWlsZWQgd2l0aCBlcnJvciB7c2VsZi5fZ2V0 X2xhc3RfZXJyb3IoKX0iKQoKICAgIGRlZiBkZWxldGUoc2VsZiwgYWNjb3VudDogc3RyKSAtPiBO b25lOgogICAgICAgIGlmIG5vdCBzZWxmLmFkdmFwaTMyLkNyZWREZWxldGVXKHNlbGYuX3Rhcmdl dChhY2NvdW50KSwgQ1JFRF9UWVBFX0dFTkVSSUMsIDApOgogICAgICAgICAgICBlcnJvciA9IHNl bGYuX2dldF9sYXN0X2Vycm9yKCkKICAgICAgICAgICAgaWYgZXJyb3IgIT0gRVJST1JfTk9UX0ZP VU5EOgogICAgICAgICAgICAgICAgcmFpc2UgQ3JlZGVudGlhbFN0b3JlRXJyb3IoZiJDcmVkRGVs ZXRlVyBmYWlsZWQgd2l0aCBlcnJvciB7ZXJyb3J9IikKUEsDBBQAAAAAABRbal1Fjdk8BQQAAAUE AAAbAAAAYXVwaG9uaWNfcmVzb2x2ZS9jcmVkaXRzLnB5IiIiQXVwaG9uaWMgY3JlZGl0czogZXN0 aW1hdGVzIGFuZCBmb3JtYXR0aW5nLgoKQXVwaG9uaWMgYmlsbHMgcHJvY2Vzc2luZyB0aW1lIGJ5 IHRoZSBpbnB1dCBkdXJhdGlvbiwgaW4gbWlsbGlzZWNvbmRzLCB3aXRoIGEKbWluaW11bSBvZiAz IG1pbnV0ZXMgcGVyIHByb2R1Y3Rpb247IGNyZWRpdHMgYXJlIGNvdW50ZWQgaW4gaG91cnMKKGh0 dHBzOi8vYXVwaG9uaWMuY29tL2hlbHAvd2ViL3ByaWNpbmdfZmFxLmh0bWwpLgoiIiIKCmZyb20g X19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCmltcG9ydCBtYXRoCgpNSU5JTVVNX1NFQ09O RFMgPSAxODAuMAoKCmRlZiBlc3RpbWF0ZV9ob3VycyhkdXJhdGlvbl9zZWNvbmRzOiBmbG9hdCkg LT4gZmxvYXQ6CiAgICAiIiJDcmVkaXRzIChpbiBob3VycykgYSBwcm9kdWN0aW9uIG9mIGBgZHVy YXRpb25fc2Vjb25kc2BgIHdpbGwgdXNlLiIiIgogICAgaWYgZHVyYXRpb25fc2Vjb25kcyA8PSAw OgogICAgICAgIHJldHVybiAwLjAKICAgIHJldHVybiBtYXgoZHVyYXRpb25fc2Vjb25kcywgTUlO SU1VTV9TRUNPTkRTKSAvIDM2MDAuMAoKCmRlZiBmb3JtYXRfaG91cnMoaG91cnM6IGZsb2F0LCAq LCByb3VuZF91cDogYm9vbCA9IEZhbHNlKSAtPiBzdHI6CiAgICAiIiJGb3JtYXQgY3JlZGl0cyBh cyBgYDJoIDA1bWBgLCBgYDQ1bWBgIG9yIGBgMG1gYC4KCiAgICBSZW1haW5pbmcgY3JlZGl0cyBy b3VuZCBkb3duOyBlc3RpbWF0ZXMgdXNlIGBgcm91bmRfdXBgYCBzbyB0aGV5IG5ldmVyIGxvb2sK ICAgIGNoZWFwZXIgdGhhbiB0aGV5IGFyZS4KICAgICIiIgogICAgZXhhY3QgPSBtYXgoMC4wLCBo b3VycykgKiA2MAogICAgbWludXRlcyA9IG1hdGguY2VpbChleGFjdCAtIDFlLTkpIGlmIHJvdW5k X3VwIGVsc2UgbWF0aC5mbG9vcihleGFjdCArIDFlLTkpCiAgICB3aG9sZV9ob3VycywgcmVzdCA9 IGRpdm1vZChtaW51dGVzLCA2MCkKICAgIHJldHVybiBmInt3aG9sZV9ob3Vyc31oIHtyZXN0OjAy ZH1tIiBpZiB3aG9sZV9ob3VycyBlbHNlIGYie3Jlc3R9bSIKUEsDBBQAAAAAABRbal1vnSB93DkA ANw5AAAaAAAAYXVwaG9uaWNfcmVzb2x2ZS9pbnNlcnQucHkiIiJQdXQgdGhlIHByb2Nlc3NlZCBh dWRpbyBiYWNrIG9uIHRoZSB0aW1lbGluZSwgaW4gc3luYyB3aXRoIHRoZSBzb3VyY2UgKFVJIHRo cmVhZCBvbmx5KS4KCk1lYXN1cmVkIGluIFJlc29sdmUgMjEuMS4xIChgYHRvb2xzL3Jlc29sdmVf aW5zZXJ0X3Byb2JlLnB5YGApOgoKLSBgYE1lZGlhUG9vbC5BZGRTdWJGb2xkZXJgYCBtYWtlcyB0 aGUgbmV3IGJpbiB0aGUgY3VycmVudCBvbmUsIGFuZCBgYEltcG9ydE1lZGlhYGAKICBpbXBvcnRz IGludG8gdGhlIGN1cnJlbnQgYmluLCBzbyB0aGUgdXNlcidzIGJpbiBpcyByZXN0b3JlZCBhZnRl cndhcmRzLgotIGBgVGltZWxpbmUuQWRkVHJhY2soImF1ZGlvIiwgeyJhdWRpb1R5cGUiOiAuLi4s ICJpbmRleCI6IG59KWBgIGluc2VydHMgYXQgcG9zaXRpb24gbjsKICB0aGUgdHJhY2tzIGJlbG93 IG1vdmUgZG93biBieSBvbmUgKGFuZCB0aGVpciBkZWZhdWx0IG5hbWVzIGZvbGxvdyB0aGVpciBw b3NpdGlvbikuCi0gYGBNZWRpYVBvb2wuQXBwZW5kVG9UaW1lbGluZWBgIHdpdGggYGByZWNvcmRG cmFtZWBgIHBsYWNlcyB0aGUgY2xpcCBleGFjdGx5IHRoZXJlOwogIGBgZW5kRnJhbWVgYCBpcyBl eGNsdXNpdmUgKDAuLjQ4IHBsYWNlcyA0OCBmcmFtZXMpLCBhbmQgYGBtZWRpYVR5cGU6IDJgYCBh ZGRzIGF1ZGlvIG9ubHkuCi0gVGhlcmUgaXMgbm8gdHJhY2sgb3IgY2xpcCAqbXV0ZSogQVBJLCBv bmx5IGBgU2V0VHJhY2tFbmFibGVgYCBhbmQgYGBTZXRDbGlwRW5hYmxlZGBgLgoiIiIKCmZyb20g X19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCmZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9y dCBDYWxsYWJsZQpmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MsIGZpZWxkCmZyb20g ZnJhY3Rpb25zIGltcG9ydCBGcmFjdGlvbgpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKZnJvbSB0 eXBpbmcgaW1wb3J0IEFueQoKZnJvbSAuIGltcG9ydCBsb2cKZnJvbSAuYXVkaW9maWxlIGltcG9y dCBBdWRpb0ZpbGVFcnJvciwgcmVhZF9hdWRpb19pbmZvCmZyb20gLnJlc29sdmVfaW8gaW1wb3J0 IE5vVGltZWxpbmVFcnJvciwgX2NhbGwsIGN1cnJlbnRfdGltZWxpbmUKZnJvbSAuc2VsZWN0aW9u IGltcG9ydCBUcmFja1BhcnQKZnJvbSAudGltaW5nIGltcG9ydCBGcmFtZVJhdGUsIFJhbmdlCgpC SU5fTkFNRSA9ICJBdXBob25pYyIKVFJBQ0tfU1VGRklYID0gIiAoQXVwaG9uaWMpIgpNSVhfVFJB Q0tfTkFNRSA9ICJBdXBob25pYyBtaXgiICAjIGZvciBhIG1peGRvd24gb2Ygc2V2ZXJhbCB0cmFj a3MKQVVESU9fT05MWSA9IDIgICMgQXBwZW5kVG9UaW1lbGluZSBtZWRpYVR5cGUKCgpjbGFzcyBJ bnNlcnRFcnJvcihFeGNlcHRpb24pOgogICAgIiIiVGhlIGF1ZGlvIGNvdWxkbid0IGJlIHB1dCBv biB0aGUgdGltZWxpbmUuIGBgc3RyKGV4YylgYCBpcyBhIHVzZXItZmFjaW5nIHNlbnRlbmNlLiIi IgoKCkBkYXRhY2xhc3MoZnJvemVuPVRydWUpCmNsYXNzIEluc2VydFJlcXVlc3Q6CiAgICB0aW1l bGluZV9pZDogc3RyCiAgICB0aW1lbGluZV9uYW1lOiBzdHIKICAgIHBhcnRzOiB0dXBsZVtUcmFj a1BhcnQsIC4uLl0gICMgd2hhdCB3YXMgcHJvY2Vzc2VkLCBwZXIgc291cmNlIHRyYWNrCiAgICBm cmFtZXM6IFJhbmdlCiAgICByYXRlOiBGcmFtZVJhdGUKICAgIGRpc2FibGVfb3JpZ2luYWw6IGJv b2wKICAgIHRyYWNrX25hbWU6IHN0ciA9ICIiICAjIHRoZSBuZXcgdHJhY2sncyBuYW1lICh0aGUg cHJvZHVjdGlvbiB0aXRsZSkKICAgICMgQSBmcmVlIGFjY291bnQ6IEF1cGhvbmljIGFkZHMgaXRz IGppbmdsZSwgc28gYSBsb25nZXIgcmVzdWx0IGlzIGV4cGVjdGVkLgogICAgamluZ2xlOiBib29s ID0gRmFsc2UKCgpAZGF0YWNsYXNzCmNsYXNzIEluc2VydFJlc3VsdDoKICAgIHRyYWNrX2luZGV4 OiBpbnQKICAgIHRyYWNrX25hbWU6IHN0cgogICAgYXRfYm90dG9tOiBib29sID0gRmFsc2UgICMg dGhlIHRyYWNrIGNvdWxkbid0IGJlIGluc2VydGVkIGJlbG93IHRoZSBzb3VyY2UKICAgIGRpc2Fi bGVkOiBzdHIgPSAiIiAgIyB3aGF0IHdhcyBkaXNhYmxlZCwgZS5nLiAidGhlIHRyYWNrIEExIOKA kyBEaWFsb2ciCiAgICB3YXJuaW5nczogbGlzdFtzdHJdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5 PWxpc3QpCiAgICBjbGlwOiB0dXBsZVtzdHIsIGludCwgaW50XSA9ICgiIiwgMCwgMCkgICMgdGhl IHBsYWNlZCBjbGlwOiBuYW1lLCBzdGFydCwgZW5kCgoKZGVmIF9pdGVtX3JhbmdlKGl0ZW06IEFu eSkgLT4gdHVwbGVbaW50LCBpbnRdOgogICAgcmV0dXJuIGludChfY2FsbChpdGVtLCAiR2V0U3Rh cnQiLCBkZWZhdWx0PTApKSwgaW50KF9jYWxsKGl0ZW0sICJHZXRFbmQiLCBkZWZhdWx0PTApKQoK CmRlZiBfaXRlbXModGltZWxpbmU6IEFueSwgaW5kZXg6IGludCkgLT4gbGlzdFtBbnldOgogICAg aXRlbXMgPSBfY2FsbCh0aW1lbGluZSwgIkdldEl0ZW1MaXN0SW5UcmFjayIsICJhdWRpbyIsIGlu ZGV4LCBkZWZhdWx0PVtdKSBvciBbXQogICAgcmV0dXJuIGxpc3QoaXRlbXMudmFsdWVzKCkgaWYg aXNpbnN0YW5jZShpdGVtcywgZGljdCkgZWxzZSBpdGVtcykKCgpkZWYgX2xheW91dCh0aW1lbGlu ZTogQW55KSAtPiBsaXN0W3R1cGxlW3N0ciwgdHVwbGVbdHVwbGVbaW50LCBpbnRdLCAuLi5dXV06 CiAgICAiIiJFYWNoIGF1ZGlvIHRyYWNrJ3MgY2hhbm5lbCBmb3JtYXQgYW5kIGNsaXAgcG9zaXRp b25zLCB0byBmaW5kIGEgbmV3IHRyYWNrLiIiIgogICAgY291bnQgPSBpbnQoX2NhbGwodGltZWxp bmUsICJHZXRUcmFja0NvdW50IiwgImF1ZGlvIiwgZGVmYXVsdD0wKSkKICAgIHJldHVybiBbCiAg ICAgICAgKAogICAgICAgICAgICBzdHIoX2NhbGwodGltZWxpbmUsICJHZXRUcmFja1N1YlR5cGUi LCAiYXVkaW8iLCBpLCBkZWZhdWx0PSIiKSksCiAgICAgICAgICAgIHR1cGxlKHNvcnRlZChfaXRl bV9yYW5nZShpdGVtKSBmb3IgaXRlbSBpbiBfaXRlbXModGltZWxpbmUsIGkpKSksCiAgICAgICAg KQogICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGNvdW50ICsgMSkKICAgIF0KCgpkZWYgX25ld190 cmFja19pbmRleChiZWZvcmU6IGxpc3RbQW55XSwgYWZ0ZXI6IGxpc3RbQW55XSwgd2FudGVkOiBp bnQpIC0+IGludCB8IE5vbmU6CiAgICAiIiJXaGVyZSBhbiBlbXB0eSB0cmFjayB3YXMgYWRkZWQs IHByZWZlcnJpbmcgYGB3YW50ZWRgYCB3aGVuIHNldmVyYWwgZml0LiIiIgogICAgaWYgbGVuKGFm dGVyKSAhPSBsZW4oYmVmb3JlKSArIDE6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGZpdHMgPSBb CiAgICAgICAgaQogICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihhZnRlcikgKyAxKQogICAg ICAgIGlmIG5vdCBhZnRlcltpIC0gMV1bMV0gYW5kIGFmdGVyWzogaSAtIDFdICsgYWZ0ZXJbaTpd ID09IGJlZm9yZQogICAgXQogICAgcmV0dXJuIHdhbnRlZCBpZiB3YW50ZWQgaW4gZml0cyBlbHNl IChmaXRzWy0xXSBpZiBmaXRzIGVsc2UgTm9uZSkKCgpkZWYgcHJvY2Vzc2VkX2ZyYW1lcygKICAg IHBhdGg6IFBhdGgsIHJhdGU6IEZyYW1lUmF0ZSwgZXhwZWN0ZWQ6IGludCwgamluZ2xlOiBib29s ID0gRmFsc2UKKSAtPiB0dXBsZVtpbnQsIHN0cl06CiAgICAiIiJgYChsZW5ndGggaW4gdGltZWxp bmUgZnJhbWVzLCB3YXJuaW5nKWBgIGZvciB0aGUgZG93bmxvYWRlZCBhdWRpby4KCiAgICBXaXRo IGBgamluZ2xlYGAgKGEgZnJlZSBhY2NvdW50KSwgYSBsb25nZXIgcmVzdWx0IGlzIGV4cGVjdGVk IGFuZCBub3QgcmVwb3J0ZWQuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBpbmZvID0gcmVhZF9h dWRpb19pbmZvKHBhdGgpCiAgICBleGNlcHQgKEF1ZGlvRmlsZUVycm9yLCBPU0Vycm9yKSBhcyBl eGM6CiAgICAgICAgbG9nLmRlYnVnKGYicHJvY2Vzc2VkIGZpbGUgbm90IHJlYWRhYmxlICh7ZXhj fSk7IGFzc3VtaW5nIHRoZSBleHBlY3RlZCBsZW5ndGgiKQogICAgICAgIHJldHVybiBleHBlY3Rl ZCwgIiIKICAgIHNlY29uZHMgPSBGcmFjdGlvbihpbmZvLmZyYW1lcywgaW5mby5zYW1wbGVfcmF0 ZSkgaWYgaW5mby5zYW1wbGVfcmF0ZSBlbHNlIEZyYWN0aW9uKDApCiAgICBmcmFtZXMgPSByb3Vu ZChzZWNvbmRzICogcmF0ZS5mcHMpCiAgICBkaWZmZXJlbmNlID0gc2Vjb25kcyAtIEZyYWN0aW9u KGV4cGVjdGVkKSAvIHJhdGUuZnBzCiAgICBsb2cuaW5mbyhmInByb2Nlc3NlZCBhdWRpbzoge2lu Zm8uZGVzY3JpYmUoKX0gPSB7ZnJhbWVzfSBmcmFtZXMgKGV4cGVjdGVkIHtleHBlY3RlZH0pIikK ICAgIGlmIGFicyhkaWZmZXJlbmNlKSAqIHJhdGUuZnBzIDw9IEZyYWN0aW9uKDEsIDIpOgogICAg ICAgIHJldHVybiBmcmFtZXMsICIiCiAgICBpZiBqaW5nbGUgYW5kIGRpZmZlcmVuY2UgPiAwOgog ICAgICAgIGxvZy5pbmZvKGYicHJvY2Vzc2VkIGF1ZGlvIGlzIHtmbG9hdChkaWZmZXJlbmNlKTou MmZ9IHMgbG9uZ2VyOiB0aGUgQXVwaG9uaWMgamluZ2xlIikKICAgICAgICByZXR1cm4gZnJhbWVz LCAiIgogICAgbG9uZ2VyID0gImxvbmdlciIgaWYgZGlmZmVyZW5jZSA+IDAgZWxzZSAic2hvcnRl ciIKICAgIHJldHVybiBmcmFtZXMsICgKICAgICAgICBmIlRoZSBwcm9jZXNzZWQgYXVkaW8gaXMg e2FicyhmbG9hdChkaWZmZXJlbmNlKSk6LjJmfSBzIHtsb25nZXJ9IHRoYW4gdGhlIG9yaWdpbmFs LCAiCiAgICAgICAgInNvIGl0IGlzbid0IGluIHN5bmMgZXZlcnl3aGVyZS4gRG9lcyB5b3VyIHBy ZXNldCBjdXQgc2lsZW5jZXMsIG9yIGFkZCBhbiBpbnRybyAiCiAgICAgICAgIm9yIG91dHJvPyIK ICAgICkKCgpjbGFzcyBfVW5kbzoKICAgICIiIlN0ZXBzIHRoYXQgcmV2ZXJzZSBhIHBhcnRseSBm aW5pc2hlZCBpbnNlcnRpb24sIHJ1biBuZXdlc3QgZmlyc3QuIiIiCgogICAgZGVmIF9faW5pdF9f KHNlbGYpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5zdGVwczogbGlzdFt0dXBsZVtzdHIsIENhbGxh YmxlW1tdLCBBbnldXV0gPSBbXQoKICAgIGRlZiBhZGQoc2VsZiwgbmFtZTogc3RyLCBzdGVwOiBD YWxsYWJsZVtbXSwgQW55XSkgLT4gTm9uZToKICAgICAgICBzZWxmLnN0ZXBzLmFwcGVuZCgobmFt ZSwgc3RlcCkpCgogICAgZGVmIHJ1bihzZWxmKSAtPiBOb25lOgogICAgICAgIGZvciBuYW1lLCBz dGVwIGluIHJldmVyc2VkKHNlbGYuc3RlcHMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAg ICAgICBvayA9IHN0ZXAoKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAg ICAgICAgICAgICAgIG9rID0gZXhjCiAgICAgICAgICAgIGxvZy5kZWJ1ZyhmInVuZG8ge25hbWV9 OiB7b2shcn0iKQogICAgICAgIHNlbGYuc3RlcHMuY2xlYXIoKQoKCmRlZiBpbnNlcnRfcHJvY2Vz c2VkX2F1ZGlvKHJlc29sdmU6IEFueSwgcGF0aDogUGF0aCwgcmVxdWVzdDogSW5zZXJ0UmVxdWVz dCkgLT4gSW5zZXJ0UmVzdWx0OgogICAgIiIiSW1wb3J0IGBgcGF0aGBgIGFuZCBwbGFjZSBpdCBv biBhIG5ldyB0cmFjayBiZWxvdyB0aGUgc291cmNlIHRyYWNrLCBpbiBzeW5jLgoKICAgIE9uIGZh aWx1cmUsIGV2ZXJ5dGhpbmcgdGhpcyBmdW5jdGlvbiBjaGFuZ2VkIGlzIHVuZG9uZSAodGhlIGRv d25sb2FkZWQgZmlsZSBzdGF5cykKICAgIGFuZCBJbnNlcnRFcnJvciBpcyByYWlzZWQuIERpc2Fi bGluZyB0aGUgb3JpZ2luYWwgYXVkaW8gaGFwcGVucyBsYXN0OyBwcm9ibGVtcwogICAgdGhlcmUg b25seSBhZGQgd2FybmluZ3MuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBwcm9qZWN0LCB0aW1l bGluZSA9IGN1cnJlbnRfdGltZWxpbmUocmVzb2x2ZSkKICAgIGV4Y2VwdCBOb1RpbWVsaW5lRXJy b3IgYXMgZXhjOgogICAgICAgIHJhaXNlIEluc2VydEVycm9yKHN0cihleGMpKSBmcm9tIGV4Ywog ICAgdGltZWxpbmVfaWQgPSBzdHIoX2NhbGwodGltZWxpbmUsICJHZXRVbmlxdWVJZCIsIGRlZmF1 bHQ9IiIpIG9yICIiKQogICAgaWYgcmVxdWVzdC50aW1lbGluZV9pZCBhbmQgdGltZWxpbmVfaWQg IT0gcmVxdWVzdC50aW1lbGluZV9pZDoKICAgICAgICByYWlzZSBJbnNlcnRFcnJvcigKICAgICAg ICAgICAgZiJUaGUgdGltZWxpbmUg4oCce3JlcXVlc3QudGltZWxpbmVfbmFtZX3igJ0gaXNuJ3Qg b3BlbiBhbnltb3JlLCBzbyB0aGUgYXVkaW8gIgogICAgICAgICAgICAid2Fzbid0IGFkZGVkIHRv IGl0LiIKICAgICAgICApCiAgICBtZWRpYV9wb29sID0gX2NhbGwocHJvamVjdCwgIkdldE1lZGlh UG9vbCIpCiAgICBpZiBtZWRpYV9wb29sIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSW5zZXJ0RXJy b3IoIkRhVmluY2kgUmVzb2x2ZSdzIG1lZGlhIHBvb2wgaXNuJ3QgYXZhaWxhYmxlLiIpCgogICAg dW5kbyA9IF9VbmRvKCkKICAgIGN1cnJlbnRfZm9sZGVyID0gX2NhbGwobWVkaWFfcG9vbCwgIkdl dEN1cnJlbnRGb2xkZXIiKQogICAgdHJ5OgogICAgICAgIG1lZGlhID0gX2ltcG9ydChtZWRpYV9w b29sLCBwYXRoLCB1bmRvKQogICAgICAgIHJlc3VsdCA9IF9hZGRfdHJhY2sodGltZWxpbmUsIHJl cXVlc3QsIHVuZG8pCiAgICAgICAgZXhwZWN0ZWQgPSByZXF1ZXN0LmZyYW1lcy5mcmFtZXMKICAg ICAgICBmcmFtZXMsIGxlbmd0aF93YXJuaW5nID0gcHJvY2Vzc2VkX2ZyYW1lcyhwYXRoLCByZXF1 ZXN0LnJhdGUsIGV4cGVjdGVkLCByZXF1ZXN0LmppbmdsZSkKICAgICAgICBwbGFjZWQgPSBfcGxh Y2UobWVkaWFfcG9vbCwgbWVkaWEsIHJlc3VsdC50cmFja19pbmRleCwgcmVxdWVzdC5mcmFtZXMu c3RhcnQsIGZyYW1lcykKICAgICAgICB1bmRvLmFkZCgiZGVsZXRlIGNsaXAiLCBsYW1iZGE6IHRp bWVsaW5lLkRlbGV0ZUNsaXBzKFtwbGFjZWRdLCBGYWxzZSkpCiAgICAgICAgc3RhcnQsIGVuZCA9 IF9pdGVtX3JhbmdlKHBsYWNlZCkKICAgICAgICByZXN1bHQuY2xpcCA9IChzdHIoX2NhbGwocGxh Y2VkLCAiR2V0TmFtZSIsIGRlZmF1bHQ9IiIpIG9yICIiKSwgc3RhcnQsIGVuZCkKICAgICAgICB3 YW50ZWQgPSAocmVxdWVzdC5mcmFtZXMuc3RhcnQsIHJlcXVlc3QuZnJhbWVzLnN0YXJ0ICsgZnJh bWVzKQogICAgICAgIGxvZy5kZWJ1ZyhmInBsYWNlZCBhdCB7c3RhcnR9Li57ZW5kfSBvbiBBe3Jl c3VsdC50cmFja19pbmRleH0sIHdhbnRlZCB7d2FudGVkfSIpCiAgICAgICAgaWYgKHN0YXJ0LCBl bmQpICE9IHdhbnRlZDoKICAgICAgICAgICAgcmVzdWx0Lndhcm5pbmdzLmFwcGVuZCgKICAgICAg ICAgICAgICAgIGYiRGFWaW5jaSBSZXNvbHZlIHBsYWNlZCB0aGUgYXVkaW8gYXQgZnJhbWVzIHtz dGFydH3igJN7ZW5kfSBpbnN0ZWFkIG9mICIKICAgICAgICAgICAgICAgIGYie3dhbnRlZFswXX3i gJN7d2FudGVkWzFdfSwgc28gaXQgbWF5IGJlIG91dCBvZiBzeW5jLiBQbGVhc2UgY2hlY2sgaXQg b24gIgogICAgICAgICAgICAgICAgInRoZSB0aW1lbGluZS4iCiAgICAgICAgICAgICkKICAgICAg ICBpZiBsZW5ndGhfd2FybmluZzoKICAgICAgICAgICAgcmVzdWx0Lndhcm5pbmdzLmFwcGVuZChs ZW5ndGhfd2FybmluZykKICAgIGV4Y2VwdCBJbnNlcnRFcnJvcjoKICAgICAgICB1bmRvLnJ1bigp CiAgICAgICAgcmFpc2UKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgIHVuZG8u cnVuKCkKICAgICAgICBsb2cuZXJyb3IoIlB1dHRpbmcgdGhlIGF1ZGlvIG9uIHRoZSB0aW1lbGlu ZSBmYWlsZWQuIiwgZXhjKQogICAgICAgIHJhaXNlIEluc2VydEVycm9yKCJQdXR0aW5nIHRoZSBh dWRpbyBvbiB0aGUgdGltZWxpbmUgZmFpbGVkLiIpIGZyb20gZXhjCiAgICBmaW5hbGx5OgogICAg ICAgIGlmIGN1cnJlbnRfZm9sZGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBfY2FsbChtZWRp YV9wb29sLCAiU2V0Q3VycmVudEZvbGRlciIsIGN1cnJlbnRfZm9sZGVyKQogICAgaWYgcmVxdWVz dC5kaXNhYmxlX29yaWdpbmFsOgogICAgICAgIF9kaXNhYmxlX29yaWdpbmFsKHRpbWVsaW5lLCBy ZXF1ZXN0LCByZXN1bHQpCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIHJlbW92ZV9wcmV2aW91c19y ZXN1bHQocmVzb2x2ZTogQW55LCBwcmV2aW91czogSW5zZXJ0UmVzdWx0KSAtPiBpbnQgfCBOb25l OgogICAgIiIiRGVsZXRlIHRoZSB0cmFjayBhbiBlYXJsaWVyIHJlc3VsdCB3YXMgcHV0IG9uLCBp ZiBpdCdzIHN0aWxsIGFzIGl0IHdhczogc2FtZQogICAgbmFtZSwgYW5kIG9ubHkgdGhhdCBvbmUg Y2xpcCBhdCB0aGUgc2FtZSBwbGFjZS4gUmV0dXJucyBpdHMgaW5kZXgsIG9yIE5vbmUgd2hlbgog ICAgaXQncyBnb25lIG9yIHdhcyBjaGFuZ2VkICh0aGVuIGl0J3Mga2VwdCwgc28gbm8gZWRpdCBv ZiB0aGUgdXNlcidzIGlzIGxvc3QpLiIiIgogICAgdHJ5OgogICAgICAgIF8sIHRpbWVsaW5lID0g Y3VycmVudF90aW1lbGluZShyZXNvbHZlKQogICAgZXhjZXB0IE5vVGltZWxpbmVFcnJvcjoKICAg ICAgICByZXR1cm4gTm9uZQogICAgY291bnQgPSBpbnQoX2NhbGwodGltZWxpbmUsICJHZXRUcmFj a0NvdW50IiwgImF1ZGlvIiwgZGVmYXVsdD0wKSkKICAgIG5hbWUsIHN0YXJ0LCBlbmQgPSBwcmV2 aW91cy5jbGlwCiAgICBmb3IgaW5kZXggaW4gcmFuZ2UoMSwgY291bnQgKyAxKToKICAgICAgICBp ZiBzdHIoX2NhbGwodGltZWxpbmUsICJHZXRUcmFja05hbWUiLCAiYXVkaW8iLCBpbmRleCwgZGVm YXVsdD0iIikpICE9IHByZXZpb3VzLnRyYWNrX25hbWU6CiAgICAgICAgICAgIGNvbnRpbnVlCiAg ICAgICAgaXRlbXMgPSBfaXRlbXModGltZWxpbmUsIGluZGV4KQogICAgICAgIGlmIGxlbihpdGVt cykgIT0gMSBvciBfaXRlbV9yYW5nZShpdGVtc1swXSkgIT0gKHN0YXJ0LCBlbmQpOgogICAgICAg ICAgICBjb250aW51ZQogICAgICAgIGlmIHN0cihfY2FsbChpdGVtc1swXSwgIkdldE5hbWUiLCBk ZWZhdWx0PSIiKSBvciAiIikgIT0gbmFtZToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBp ZiBfY2FsbCh0aW1lbGluZSwgIkRlbGV0ZVRyYWNrIiwgImF1ZGlvIiwgaW5kZXgsIGRlZmF1bHQ9 RmFsc2UpOgogICAgICAgICAgICBsb2cuaW5mbyhmIlJlbW92ZWQgdGhlIHByZXZpb3VzIHJlc3Vs dCB0cmFjayBBe2luZGV4fSDigJMge3ByZXZpb3VzLnRyYWNrX25hbWV9IikKICAgICAgICAgICAg cmV0dXJuIGluZGV4CiAgICByZXR1cm4gTm9uZQoKCmRlZiBfaW1wb3J0KG1lZGlhX3Bvb2w6IEFu eSwgcGF0aDogUGF0aCwgdW5kbzogX1VuZG8pIC0+IEFueToKICAgIHJvb3QgPSBfY2FsbChtZWRp YV9wb29sLCAiR2V0Um9vdEZvbGRlciIpCiAgICBmb2xkZXJzID0gX2NhbGwocm9vdCwgIkdldFN1 YkZvbGRlckxpc3QiLCBkZWZhdWx0PVtdKSBvciBbXQogICAgZm9sZGVyID0gbmV4dCgoZiBmb3Ig ZiBpbiBmb2xkZXJzIGlmIF9jYWxsKGYsICJHZXROYW1lIikgPT0gQklOX05BTUUpLCBOb25lKQog ICAgaWYgZm9sZGVyIGlzIE5vbmU6CiAgICAgICAgZm9sZGVyID0gX2NhbGwobWVkaWFfcG9vbCwg IkFkZFN1YkZvbGRlciIsIHJvb3QsIEJJTl9OQU1FKQogICAgICAgIGlmIGZvbGRlciBpcyBOb25l OgogICAgICAgICAgICByYWlzZSBJbnNlcnRFcnJvcihmIkRhVmluY2kgUmVzb2x2ZSBjb3VsZG4n dCBjcmVhdGUgdGhlIOKAnHtCSU5fTkFNRX3igJ0gYmluLiIpCiAgICAgICAgdW5kby5hZGQoImRl bGV0ZSBiaW4iLCBsYW1iZGE6IG1lZGlhX3Bvb2wuRGVsZXRlRm9sZGVycyhbZm9sZGVyXSkpCiAg ICBfY2FsbChtZWRpYV9wb29sLCAiU2V0Q3VycmVudEZvbGRlciIsIGZvbGRlcikKICAgIGltcG9y dGVkID0gX2NhbGwobWVkaWFfcG9vbCwgIkltcG9ydE1lZGlhIiwgW3N0cihwYXRoKV0sIGRlZmF1 bHQ9W10pIG9yIFtdCiAgICBpZiBub3QgaXNpbnN0YW5jZShpbXBvcnRlZCwgbGlzdCkgb3Igbm90 IGltcG9ydGVkOgogICAgICAgIHJhaXNlIEluc2VydEVycm9yKCJEYVZpbmNpIFJlc29sdmUgY291 bGRuJ3QgaW1wb3J0IHRoZSBwcm9jZXNzZWQgYXVkaW8uIikKICAgIG1lZGlhID0gaW1wb3J0ZWRb MF0KICAgIHVuZG8uYWRkKCJkZWxldGUgbWVkaWEiLCBsYW1iZGE6IG1lZGlhX3Bvb2wuRGVsZXRl Q2xpcHMoW21lZGlhXSkpCiAgICByZXR1cm4gbWVkaWEKCgpkZWYgX2FkZF90cmFjayh0aW1lbGlu ZTogQW55LCByZXF1ZXN0OiBJbnNlcnRSZXF1ZXN0LCB1bmRvOiBfVW5kbykgLT4gSW5zZXJ0UmVz dWx0OgogICAgIiIiQSBuZXcgdHJhY2sgZGlyZWN0bHkgYmVsb3cgdGhlIChsb3dlc3QpIHNvdXJj ZSB0cmFjaywgaW4gdGhlIHNhbWUgY2hhbm5lbCBmb3JtYXQuIiIiCiAgICBzb3VyY2VzID0gc29y dGVkKHBhcnQudHJhY2sgZm9yIHBhcnQgaW4gcmVxdWVzdC5wYXJ0cykKICAgIGxvd2VzdCA9IHNv dXJjZXNbLTFdCiAgICBzdWJ0eXBlcyA9IHsKICAgICAgICBzdHIoX2NhbGwodGltZWxpbmUsICJH ZXRUcmFja1N1YlR5cGUiLCAiYXVkaW8iLCB0cmFjaywgZGVmYXVsdD0iIikgb3IgInN0ZXJlbyIp CiAgICAgICAgZm9yIHRyYWNrIGluIHNvdXJjZXMKICAgIH0KICAgIHN1YnR5cGUgPSBzdWJ0eXBl cy5wb3AoKSBpZiBsZW4oc3VidHlwZXMpID09IDEgZWxzZSAic3RlcmVvIiAgIyBhIG1peGRvd24g aXMgc3RlcmVvCiAgICBiZWZvcmUgPSBfbGF5b3V0KHRpbWVsaW5lKQogICAgd2FudGVkID0gbG93 ZXN0ICsgMQogICAgYWRkZWQgPSBfY2FsbCgKICAgICAgICB0aW1lbGluZSwgIkFkZFRyYWNrIiwg ImF1ZGlvIiwgeyJhdWRpb1R5cGUiOiBzdWJ0eXBlLCAiaW5kZXgiOiB3YW50ZWR9LCBkZWZhdWx0 PUZhbHNlCiAgICApCiAgICBsb2cuZGVidWcoZiJBZGRUcmFjayhhdWRpbywge3N1YnR5cGUhcn0s IGluZGV4IHt3YW50ZWR9KSAtPiB7YWRkZWQhcn0iKQogICAgaWYgbm90IGFkZGVkOiAgIyBvbGRl ciBSZXNvbHZlIHdpdGhvdXQgaW5zZXJ0IHBvc2l0aW9uczogYWRkIGF0IHRoZSBib3R0b20KICAg ICAgICBhZGRlZCA9IF9jYWxsKHRpbWVsaW5lLCAiQWRkVHJhY2siLCAiYXVkaW8iLCBzdWJ0eXBl LCBkZWZhdWx0PUZhbHNlKQogICAgICAgIGxvZy5kZWJ1ZyhmIkFkZFRyYWNrKGF1ZGlvLCB7c3Vi dHlwZSFyfSkgLT4ge2FkZGVkIXJ9IikKICAgIGluZGV4ID0gX25ld190cmFja19pbmRleChiZWZv cmUsIF9sYXlvdXQodGltZWxpbmUpLCB3YW50ZWQpIGlmIGFkZGVkIGVsc2UgTm9uZQogICAgaWYg aW5kZXggaXMgTm9uZToKICAgICAgICByYWlzZSBJbnNlcnRFcnJvcigiRGFWaW5jaSBSZXNvbHZl IGNvdWxkbid0IGFkZCBhbiBhdWRpbyB0cmFjay4iKQogICAgdW5kby5hZGQoImRlbGV0ZSB0cmFj ayIsIGxhbWJkYTogdGltZWxpbmUuRGVsZXRlVHJhY2soImF1ZGlvIiwgaW5kZXgpKQogICAgaWYg cmVxdWVzdC50cmFja19uYW1lLnN0cmlwKCk6CiAgICAgICAgbmFtZSA9IHJlcXVlc3QudHJhY2tf bmFtZS5zdHJpcCgpCiAgICBlbGlmIGxlbihzb3VyY2VzKSA9PSAxOgogICAgICAgIHNvdXJjZV9u YW1lID0gc3RyKF9jYWxsKHRpbWVsaW5lLCAiR2V0VHJhY2tOYW1lIiwgImF1ZGlvIiwgbG93ZXN0 LCBkZWZhdWx0PSIiKSBvciAiIikKICAgICAgICBuYW1lID0gZiJ7c291cmNlX25hbWUgb3IgZidB dWRpbyB7bG93ZXN0fSd9e1RSQUNLX1NVRkZJWH0iCiAgICBlbHNlOgogICAgICAgIG5hbWUgPSBN SVhfVFJBQ0tfTkFNRQogICAgaWYgbm90IF9jYWxsKHRpbWVsaW5lLCAiU2V0VHJhY2tOYW1lIiwg ImF1ZGlvIiwgaW5kZXgsIG5hbWUsIGRlZmF1bHQ9RmFsc2UpOgogICAgICAgIG5hbWUgPSBzdHIo X2NhbGwodGltZWxpbmUsICJHZXRUcmFja05hbWUiLCAiYXVkaW8iLCBpbmRleCwgZGVmYXVsdD0i Iikgb3IgbmFtZSkKICAgIHJldHVybiBJbnNlcnRSZXN1bHQodHJhY2tfaW5kZXg9aW5kZXgsIHRy YWNrX25hbWU9bmFtZSwgYXRfYm90dG9tPWluZGV4ICE9IHdhbnRlZCkKCgpkZWYgX3BsYWNlKG1l ZGlhX3Bvb2w6IEFueSwgbWVkaWE6IEFueSwgdHJhY2s6IGludCwgcmVjb3JkOiBpbnQsIGZyYW1l czogaW50KSAtPiBBbnk6CiAgICBjbGlwX2luZm8gPSB7CiAgICAgICAgIm1lZGlhUG9vbEl0ZW0i OiBtZWRpYSwKICAgICAgICAic3RhcnRGcmFtZSI6IDAsCiAgICAgICAgImVuZEZyYW1lIjogZnJh bWVzLCAgIyBleGNsdXNpdmUKICAgICAgICAidHJhY2tJbmRleCI6IHRyYWNrLAogICAgICAgICJy ZWNvcmRGcmFtZSI6IHJlY29yZCwKICAgICAgICAibWVkaWFUeXBlIjogQVVESU9fT05MWSwKICAg IH0KICAgIHBsYWNlZCA9IF9jYWxsKG1lZGlhX3Bvb2wsICJBcHBlbmRUb1RpbWVsaW5lIiwgW2Ns aXBfaW5mb10sIGRlZmF1bHQ9W10pIG9yIFtdCiAgICBpZiBub3QgaXNpbnN0YW5jZShwbGFjZWQs IGxpc3QpIG9yIG5vdCBwbGFjZWQgb3IgcGxhY2VkWzBdIGlzIE5vbmU6CiAgICAgICAgcmFpc2Ug SW5zZXJ0RXJyb3IoIkRhVmluY2kgUmVzb2x2ZSBjb3VsZG4ndCBwdXQgdGhlIHByb2Nlc3NlZCBh dWRpbyBvbiB0aGUgdGltZWxpbmUuIikKICAgIHJldHVybiBwbGFjZWRbMF0KCgpkZWYgX2Rpc2Fi bGVfb3JpZ2luYWwodGltZWxpbmU6IEFueSwgcmVxdWVzdDogSW5zZXJ0UmVxdWVzdCwgcmVzdWx0 OiBJbnNlcnRSZXN1bHQpIC0+IE5vbmU6CiAgICAiIiJEaXNhYmxlIHdoYXQgd2FzIHByb2Nlc3Nl ZCwgcGVyIHNvdXJjZSB0cmFjazogdGhlIHdob2xlIHRyYWNrLCB0aGUgcHJvY2Vzc2VkCiAgICBj bGlwcywgb3IgKGluL291dCByYW5nZSkgdGhlIGNsaXBzIG92ZXJsYXBwaW5nIGl0LgoKICAgIFJl c29sdmUncyBBUEkgaGFzIG5vIG11dGU7IGRpc2FibGVkIGF1ZGlvIGlzIHNpbGVudCBpbiBwbGF5 YmFjayBhbmQgcmVuZGVycy4KICAgICIiIgogICAgZG9uZSwgYmV5b25kID0gW10sIDAgICMgYmV5 b25kOiBmcmFtZXMgb2YgZGlzYWJsZWQgY2xpcHMgb3V0c2lkZSB0aGUgcHJvY2Vzc2VkIHJhbmdl CiAgICBmb3IgcGFydCBpbiByZXF1ZXN0LnBhcnRzOgogICAgICAgIGxhYmVsID0gcGFydC5sYWJl bAogICAgICAgIGlmIHBhcnQud2hvbGUgYW5kIG5vdCBwYXJ0LmxpbWl0ZWQ6CiAgICAgICAgICAg IGlmIF9jYWxsKHRpbWVsaW5lLCAiU2V0VHJhY2tFbmFibGUiLCAiYXVkaW8iLCBwYXJ0LnRyYWNr LCBGYWxzZSwgZGVmYXVsdD1GYWxzZSk6CiAgICAgICAgICAgICAgICBkb25lLmFwcGVuZChmInRo ZSBvcmlnaW5hbCB0cmFjayB7bGFiZWx9IikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAg ICAgIHJlc3VsdC53YXJuaW5ncy5hcHBlbmQoZiJDb3VsZG4ndCBkaXNhYmxlIHRoZSBvcmlnaW5h bCB0cmFjayB7bGFiZWx9LiIpCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgd2FudGVkID0g eyhrWzFdLCBrWzJdKSBmb3IgayBpbiBwYXJ0LmNsaXBzfQogICAgICAgIGl0ZW1zID0gW2kgZm9y IGkgaW4gX2l0ZW1zKHRpbWVsaW5lLCBwYXJ0LnRyYWNrKSBpZiBfaXRlbV9yYW5nZShpKSBpbiB3 YW50ZWRdCiAgICAgICAgZGlzYWJsZWQgPSBbaSBmb3IgaSBpbiBpdGVtcyBpZiBfY2FsbChpLCAi U2V0Q2xpcEVuYWJsZWQiLCBGYWxzZSwgZGVmYXVsdD1GYWxzZSldCiAgICAgICAgaWYgcGFydC5s aW1pdGVkOgogICAgICAgICAgICAjIFJlc29sdmUncyBBUEkgY2FuJ3Qgc3BsaXQgY2xpcHMsIHNv IG92ZXJsYXBwaW5nIGNsaXBzIGFyZSBkaXNhYmxlZCB3aG9sZQogICAgICAgICAgICAjIChkZWNp ZGVkIHdpdGggdGhlIHVzZXIpOyB0aGUgbWVzc2FnZSBzYXlzIGhvdyBtdWNoIHVucHJvY2Vzc2Vk IGF1ZGlvIGdvZXMKICAgICAgICAgICAgIyBzaWxlbnQgd2l0aCB0aGVtLgogICAgICAgICAgICBm cmFtZXMgPSByZXF1ZXN0LmZyYW1lcwogICAgICAgICAgICBmb3IgaXRlbSBpbiBkaXNhYmxlZDoK ICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQgPSBfaXRlbV9yYW5nZShpdGVtKQogICAgICAgICAg ICAgICAgYmV5b25kICs9IG1heCgwLCBmcmFtZXMuc3RhcnQgLSBzdGFydCkgKyBtYXgoMCwgZW5k IC0gZnJhbWVzLmVuZCkKICAgICAgICBpZiBsZW4oZGlzYWJsZWQpID09IDEgYW5kIG5vdCBwYXJ0 LmxpbWl0ZWQ6CiAgICAgICAgICAgIG5hbWUgPSBzdHIoX2NhbGwoZGlzYWJsZWRbMF0sICJHZXRO YW1lIiwgZGVmYXVsdD0iIikgb3IgIiIpCiAgICAgICAgICAgIGRvbmUuYXBwZW5kKGYidGhlIG9y aWdpbmFsIGNsaXAg4oCce25hbWV94oCdIiBpZiBuYW1lIGVsc2UgZiIxIG9yaWdpbmFsIGNsaXAg b24ge2xhYmVsfSIpCiAgICAgICAgZWxpZiBkaXNhYmxlZDoKICAgICAgICAgICAgY291bnQgPSBs ZW4oZGlzYWJsZWQpCiAgICAgICAgICAgIGRvbmUuYXBwZW5kKGYie2NvdW50fSBvcmlnaW5hbCBj bGlweydzJyAqIChjb3VudCAhPSAxKX0gb24ge2xhYmVsfSIpCiAgICAgICAgaWYgbGVuKGRpc2Fi bGVkKSA8IGxlbih3YW50ZWQpOgogICAgICAgICAgICByZXN1bHQud2FybmluZ3MuYXBwZW5kKGYi Q291bGRuJ3QgZGlzYWJsZSBzb21lIG9mIHRoZSBvcmlnaW5hbCBjbGlwcyBvbiB7bGFiZWx9LiIp CiAgICByZXN1bHQuZGlzYWJsZWQgPSBfam9pbihkb25lKQogICAgaWYgYmV5b25kOgogICAgICAg IHNlY29uZHMgPSBmbG9hdChGcmFjdGlvbihiZXlvbmQpIC8gcmVxdWVzdC5yYXRlLmZwcykKICAg ICAgICByZXN1bHQud2FybmluZ3MuYXBwZW5kKAogICAgICAgICAgICBmIlNvbWUgb2YgdGhlbSBy ZWFjaCBiZXlvbmQgdGhlIGluL291dCByYW5nZSwgc28ge3NlY29uZHM6LjFmfSBzIG9mIGF1ZGlv IHRoYXQgIgogICAgICAgICAgICAid2Fzbid0IHByb2Nlc3NlZCBpcyBzaWxlbnQgbm93IHRvby4g VG8ga2VlcCBpdCwgY3V0IHRoZSBjbGlwcyBhdCB0aGUgaW4vb3V0ICIKICAgICAgICAgICAgInBv aW50cyBhbmQgZW5hYmxlIHRob3NlIHBhcnRzIGFnYWluLiIKICAgICAgICApCgoKZGVmIF9qb2lu KHRleHRzOiBsaXN0W3N0cl0pIC0+IHN0cjoKICAgIGlmIGxlbih0ZXh0cykgPD0gMjoKICAgICAg ICByZXR1cm4gIiBhbmQgIi5qb2luKHRleHRzKQogICAgcmV0dXJuICIsICIuam9pbih0ZXh0c1s6 LTFdKSArIGYiIGFuZCB7dGV4dHNbLTFdfSIKUEsDBBQAAAAAABRbal0GTvR3IQsAACELAAAZAAAA YXVwaG9uaWNfcmVzb2x2ZS9saW5rcy5weSIiIkV4dGVybmFsIGxpbmtzIHNob3duIGluIHRoZSBV SSwgYW5kIG9wZW5pbmcgdGhlbSBpbiB0aGUgYnJvd3Nlci4iIiIKCmZyb20gX19mdXR1cmVfXyBp bXBvcnQgYW5ub3RhdGlvbnMKCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBzeXMKaW1wb3J0IHdl YmJyb3dzZXIKZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IENhbGxhYmxlCmZyb20gcGF0aGxp YiBpbXBvcnQgUGF0aApmcm9tIHR5cGluZyBpbXBvcnQgQW55Cgpmcm9tIC4gaW1wb3J0IGxvZwoK IyBPbmxpbmUgaGVscCBmb3IgdGhlIHBsdWdpbi4gS2VlcCBpbiBzeW5jIHdpdGggSEVMUF9VUkwg aW4gbGF1bmNoZXIvQXVwaG9uaWMubHVhLgpIRUxQX1VSTCA9ICJodHRwczovL2F1cGhvbmljLmNv bS9oZWxwL3Jlc291cmNlcy9kYXZpbmNpcmVzb2x2ZS5odG1sIgpTVVBQT1JUX0VNQUlMID0gInN1 cHBvcnRAYXVwaG9uaWMuY29tIgojIEZvciBlcnJvcnMgdGhlIHBsdWdpbiBkb2Vzbid0IGV4cGVj dDsgdGhlIENvbnNvbGUgdGhlbiBoYXMgYSB0cmFjZWJhY2suClVORVhQRUNURURfRVJST1IgPSAo CiAgICAiU29tZXRoaW5nIHdlbnQgd3JvbmcuIERldGFpbHMgYXJlIGluIHRoZSBDb25zb2xlIChX b3Jrc3BhY2Ug4oaSIENvbnNvbGUpLiBJZiBpdCAiCiAgICBmImtlZXBzIGhhcHBlbmluZywgZW1h aWwgdGhlbSB0byB7U1VQUE9SVF9FTUFJTH0uIgopCkFVUEhPTklDX0hPTUVfVVJMID0gImh0dHBz Oi8vYXVwaG9uaWMuY29tLyIKUkVHSVNURVJfVVJMID0gImh0dHBzOi8vYXVwaG9uaWMuY29tL2Fj Y291bnRzL3JlZ2lzdGVyLyIKIyBXaGVyZSB1c2VycyBjcmVhdGUgKG9yIHJlc2V0KSB0aGUgQVBJ IGtleSB0aGUgcGx1Z2luIGxvZ3MgaW4gd2l0aC4KQVBJX0tFWV9VUkwgPSAiaHR0cHM6Ly9hdXBo b25pYy5jb20vYWNjb3VudHMvc2V0dGluZ3MvI2FwaS1rZXkiClBZVEhPTl9ET1dOTE9BRF9VUkwg PSAiaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZHMvIgoKCmRlZiBwcm9kdWN0aW9uX2Vk aXRfdXJsKHByb2R1Y3Rpb25fdXVpZDogc3RyKSAtPiBzdHI6CiAgICAiIiJUaGUgcGFnZSB3aGVy ZSB1c2VycyBjaGFuZ2UgYSBwcm9kdWN0aW9uJ3Mgc2V0dGluZ3MgYW5kIHN0YXJ0IGl0LiIiIgog ICAgcmV0dXJuIGYie0FVUEhPTklDX0hPTUVfVVJMfWVuZ2luZS91cGxvYWQvZWRpdC97cHJvZHVj dGlvbl91dWlkfS8iCgoKZGVmIG9wZW5fdXJsKHVybDogc3RyLCBibWQ6IEFueSA9IE5vbmUpIC0+ IGJvb2w6CiAgICAiIiJPcGVuIGBgdXJsYGAgaW4gdGhlIGRlZmF1bHQgYnJvd3NlcjsgcmV0dXJu IHdoZXRoZXIgdGhhdCB3b3JrZWQuCgogICAgVXNlcyB0aGUgc3RhbmRhcmQgbGlicmFyeSBmaXJz dDogaW5zaWRlIFJlc29sdmUncyBQeXRob24sIGBgYm1kYGAgaXMgdGhlCiAgICBgYGZ1c2lvbnNj cmlwdGBgIG1vZHVsZSwgd2hpY2ggaGFzIG5vIGBgb3BlbnVybGBgIChzZWVuIGluIFJlc29sdmUg MjEuMSkuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBpZiB3ZWJicm93c2VyLm9wZW4odXJsKToK ICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAg ICAgIGxvZy5kZWJ1ZyhmIndlYmJyb3dzZXIub3BlbiBmYWlsZWQ6IHtleGMhcn0iKQogICAgb3Bl bmVyID0gZ2V0YXR0cihibWQsICJvcGVudXJsIiwgTm9uZSkKICAgIGlmIGNhbGxhYmxlKG9wZW5l cik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcGVuZXIodXJsKQogICAgICAgICAgICByZXR1 cm4gVHJ1ZQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICBsb2cu ZGVidWcoZiJibWQub3BlbnVybCBmYWlsZWQ6IHtleGMhcn0iKQogICAgbG9nLmVycm9yKGYiQ291 bGRuJ3Qgb3BlbiBhIGJyb3dzZXIuIFBsZWFzZSBvcGVuIHt1cmx9IG1hbnVhbGx5LiIpCiAgICBy ZXR1cm4gRmFsc2UKCgpkZWYgcmV2ZWFsX2NvbW1hbmQocGF0aDogUGF0aCwgcGxhdGZvcm06IHN0 ciA9IHN5cy5wbGF0Zm9ybSkgLT4gbGlzdFtzdHJdOgogICAgIiIiVGhlIGNvbW1hbmQgdGhhdCBz aG93cyBgYHBhdGhgYCBpbiB0aGUgZmlsZSBtYW5hZ2VyIChzZWxlY3RlZCwgd2hlcmUgcG9zc2li bGUpLiIiIgogICAgaWYgcGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgcmV0dXJuIFsib3Bl biIsICItUiIsIHN0cihwYXRoKV0KICAgIGlmIHBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICAgICAg cmV0dXJuIFsiZXhwbG9yZXIiLCBmIi9zZWxlY3Qse3BhdGh9Il0KICAgIHJldHVybiBbInhkZy1v cGVuIiwgc3RyKHBhdGgucGFyZW50KV0KCgpkZWYgcmV2ZWFsX2ZpbGUoCiAgICBwYXRoOiBQYXRo LAogICAgcGxhdGZvcm06IHN0ciA9IHN5cy5wbGF0Zm9ybSwKICAgIHJ1bjogQ2FsbGFibGVbW2xp c3Rbc3RyXV0sIEFueV0gfCBOb25lID0gTm9uZSwKKSAtPiBib29sOgogICAgIiIiU2hvdyBgYHBh dGhgYCBpbiBGaW5kZXIsIEV4cGxvcmVyIG9yIHRoZSBMaW51eCBmaWxlIG1hbmFnZXIuCgogICAg QSBgYGZpbGU6Ly9gYCBVUkwgdGhyb3VnaCBgYHdlYmJyb3dzZXJgYCBkaWQgbm90aGluZyBpbiBS ZXNvbHZlIDIxLjEgb24gbWFjT1MuCiAgICAiIiIKICAgIGNvbW1hbmQgPSByZXZlYWxfY29tbWFu ZChwYXRoLCBwbGF0Zm9ybSkKICAgIHRyeToKICAgICAgICAocnVuIG9yIHN1YnByb2Nlc3MuUG9w ZW4pKGNvbW1hbmQpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICBsb2cuZXJy b3IoZiJDb3VsZG4ndCBzaG93IHRoZSBmaWxlLiBJdCdzIHNhdmVkIGFzIHtwYXRofSIsIGV4YykK ICAgICAgICByZXR1cm4gRmFsc2UKICAgIGxvZy5kZWJ1ZyhmInJldmVhbGVkIHdpdGgge2NvbW1h bmQhcn0iKQogICAgcmV0dXJuIFRydWUKUEsDBBQAAAAAABRbal3RvlxBrRIAAK0SAAAXAAAAYXVw aG9uaWNfcmVzb2x2ZS9sb2cucHkiIiJDb25zb2xlIGxvZ2dpbmcgKHRoZSBSZXNvbHZlIENvbnNv bGUpIGFuZCB0aGUgc3RhcnR1cCBkaWFnbm9zdGljIGxpbmUuIiIiCgpmcm9tIF9fZnV0dXJlX18g aW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgcGxhdGZvcm0KaW1w b3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IHRocmVhZGluZwppbXBvcnQgdHJhY2ViYWNrCmZyb20g dHlwaW5nIGltcG9ydCBBbnkKCmZyb20gLmNvbXBhdCBpbXBvcnQgaXNfYnVpbHRpbl9weXRob24K ClBSRUZJWCA9ICJbQXVwaG9uaWNdIgoKX3ZlcmJvc2UgPSBGYWxzZQoKX1NFQ1JFVF9QQVRURVJO UyA9IFsKICAgICMgQXV0aG9yaXphdGlvbiBoZWFkZXJzLCBpbiBhbnkgY2FwaXRhbGl6YXRpb24g YW5kIHF1b3RpbmcuCiAgICAoCiAgICAgICAgcmUuY29tcGlsZShyIig/aSkoYXV0aG9yaXphdGlv blsnXCJdP1xzKls6PV1ccypbJ1wiXT8pKGJhc2ljfGJlYXJlcilccytbXlxzJ1wiLH1dKyIpLAog ICAgICAgIHIiXDFcMiA8cmVkYWN0ZWQ+IiwKICAgICksCiAgICAjIENvbW1vbiBzZWNyZXQtY2Fy cnlpbmcgZmllbGRzIGluIEpTT04sIGZvcm0gYm9kaWVzIGFuZCBxdWVyeSBzdHJpbmdzLgogICAg KAogICAgICAgIHJlLmNvbXBpbGUoCiAgICAgICAgICAgIHIiKD9pKSgoPzphY2Nlc3NfdG9rZW58 YmVhcmVyX3Rva2VufGFwaV8/a2V5fHBhc3N3b3JkfHJlZnJlc2hfdG9rZW4pIgogICAgICAgICAg ICByIlsnXCJdP1xzKls6PV1ccypbJ1wiXT8pW14mXHMnXCIsfV0rIgogICAgICAgICksCiAgICAg ICAgciJcMTxyZWRhY3RlZD4iLAogICAgKSwKXQoKCmRlZiBzZXRfdmVyYm9zZShlbmFibGVkOiBi b29sKSAtPiBOb25lOgogICAgZ2xvYmFsIF92ZXJib3NlCiAgICBfdmVyYm9zZSA9IGVuYWJsZWQK CgpkZWYgaXNfdmVyYm9zZSgpIC0+IGJvb2w6CiAgICByZXR1cm4gX3ZlcmJvc2UKCgpkZWYgcmVk YWN0KHRleHQ6IHN0cikgLT4gc3RyOgogICAgIiIiUmVtb3ZlIHRva2VucywgcGFzc3dvcmRzIGFu ZCBBdXRob3JpemF0aW9uIGhlYWRlcnMgZnJvbSBgYHRleHRgYC4iIiIKICAgIGZvciBwYXR0ZXJu LCByZXBsYWNlbWVudCBpbiBfU0VDUkVUX1BBVFRFUk5TOgogICAgICAgIHRleHQgPSBwYXR0ZXJu LnN1YihyZXBsYWNlbWVudCwgdGV4dCkKICAgIHJldHVybiB0ZXh0CgoKIyBDb25zb2xlIG91dHB1 dCBtdXN0IGhhcHBlbiBvbiB0aGUgVUkgdGhyZWFkOiBpbiBSZXNvbHZlIDIxLjEsIHdyaXRpbmcg dG8gdGhlCiMgQ29uc29sZSAoZnVfc3Rkb3V0KSBmcm9tIGEgd29ya2VyIHRocmVhZCBmYWlscyB3 aXRoICJQeUNhcHN1bGVfR2V0UG9pbnRlciBjYWxsZWQKIyB3aXRoIGludmFsaWQgUHlDYXBzdWxl IG9iamVjdCIuIExpbmVzIGxvZ2dlZCBmcm9tIG90aGVyIHRocmVhZHMgYXJlIHF1ZXVlZCBhbmQK IyBwcmludGVkIGJ5IGZsdXNoX3BlbmRpbmcoKSwgd2hpY2ggdGhlIFVJIHRpbWVyIGNhbGxzLgpf dWlfdGhyZWFkOiBpbnQgfCBOb25lID0gTm9uZQpfcGVuZGluZzogbGlzdFtzdHJdID0gW10KX3Bl bmRpbmdfbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKCgpkZWYgc2V0X3VpX3RocmVhZChpZGVudDog aW50IHwgTm9uZSkgLT4gTm9uZToKICAgICIiIkRlY2xhcmUgd2hpY2ggdGhyZWFkIG1heSBwcmlu dCAoYGBOb25lYGA6IGFueSB0aHJlYWQsIGUuZy4gb3V0c2lkZSBhIHdpbmRvdykuIiIiCiAgICBn bG9iYWwgX3VpX3RocmVhZAogICAgX3VpX3RocmVhZCA9IGlkZW50CgoKZGVmIGVtaXQodGV4dDog c3RyKSAtPiBOb25lOgogICAgIiIiUHJpbnQgYGB0ZXh0YGAgdG8gdGhlIFJlc29sdmUgQ29uc29s ZSwgb3IgcXVldWUgaXQgd2hlbiBjYWxsZWQgb2ZmIHRoZSBVSSB0aHJlYWQuIiIiCiAgICBpZiBf dWlfdGhyZWFkIGlzIG5vdCBOb25lIGFuZCB0aHJlYWRpbmcuZ2V0X2lkZW50KCkgIT0gX3VpX3Ro cmVhZDoKICAgICAgICB3aXRoIF9wZW5kaW5nX2xvY2s6CiAgICAgICAgICAgIF9wZW5kaW5nLmFw cGVuZCh0ZXh0KQogICAgICAgIHJldHVybgogICAgZmx1c2hfcGVuZGluZygpCiAgICBfd3JpdGUo dGV4dCkKCgpkZWYgZmx1c2hfcGVuZGluZygpIC0+IE5vbmU6CiAgICAiIiJQcmludCBsaW5lcyBx dWV1ZWQgYnkgd29ya2VyIHRocmVhZHMuIENhbGwgZnJvbSB0aGUgVUkgdGhyZWFkIG9ubHkuIiIi CiAgICB3aXRoIF9wZW5kaW5nX2xvY2s6CiAgICAgICAgbGluZXMgPSBfcGVuZGluZ1s6XQogICAg ICAgIF9wZW5kaW5nLmNsZWFyKCkKICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgIF93cml0 ZShsaW5lKQoKCmRlZiBfd3JpdGUodGV4dDogc3RyKSAtPiBOb25lOgogICAgIyBOZXZlciBwYXNz IGZsdXNoPVRydWUgdG8gcHJpbnQ6IFJlc29sdmUgMjEuMSByZXBsYWNlcyBzeXMuc3Rkb3V0IHdp dGggYQogICAgIyBmdV9zdGRvdXQgbW9kdWxlIHRoYXQgaGFzIG5vIGZsdXNoKCkuIExvZ2dpbmcg bXVzdCBuZXZlciBicmVhayB0aGUgcGx1Z2luLgogICAgd2l0aCBjb250ZXh0bGliLnN1cHByZXNz KEV4Y2VwdGlvbik6CiAgICAgICAgcHJpbnQodGV4dCkKICAgIGZsdXNoID0gZ2V0YXR0cihzeXMu c3Rkb3V0LCAiZmx1c2giLCBOb25lKQogICAgaWYgY2FsbGFibGUoZmx1c2gpOgogICAgICAgIHdp dGggY29udGV4dGxpYi5zdXBwcmVzcyhFeGNlcHRpb24pOgogICAgICAgICAgICBmbHVzaCgpCgoK ZGVmIHdhcm5pbmcobWVzc2FnZTogc3RyKSAtPiBOb25lOgogICAgZW1pdChmIntQUkVGSVh9IFdB Uk5JTkc6IHtyZWRhY3QobWVzc2FnZSl9IikKCgpkZWYgaW5mbyhtZXNzYWdlOiBzdHIpIC0+IE5v bmU6CiAgICBlbWl0KGYie1BSRUZJWH0ge3JlZGFjdChtZXNzYWdlKX0iKQoKCmRlZiBkZWJ1Zyht ZXNzYWdlOiBzdHIpIC0+IE5vbmU6CiAgICBpZiBfdmVyYm9zZToKICAgICAgICBlbWl0KGYie1BS RUZJWH0gW2RlYnVnXSB7cmVkYWN0KG1lc3NhZ2UpfSIpCgoKZGVmIGVycm9yKG1lc3NhZ2U6IHN0 ciwgZXhjOiBCYXNlRXhjZXB0aW9uIHwgTm9uZSA9IE5vbmUpIC0+IE5vbmU6CiAgICAiIiJQcmlu dCBhbiBlcnJvciwgd2l0aCB0aGUgZnVsbCB0cmFjZWJhY2sgd2hlbiBgYGV4Y2BgIGlzIGdpdmVu LiIiIgogICAgZW1pdChmIntQUkVGSVh9IEVSUk9SOiB7cmVkYWN0KG1lc3NhZ2UpfSIpCiAgICBp ZiBleGMgaXMgbm90IE5vbmU6CiAgICAgICAgZGV0YWlscyA9ICIiLmpvaW4odHJhY2ViYWNrLmZv cm1hdF9leGNlcHRpb24odHlwZShleGMpLCBleGMsIGV4Yy5fX3RyYWNlYmFja19fKSkKICAgICAg ICBlbWl0KHJlZGFjdChkZXRhaWxzKSkKCgpkZWYgb3NfZGVzY3JpcHRpb24oKSAtPiBzdHI6CiAg ICBzeXN0ZW0gPSBwbGF0Zm9ybS5zeXN0ZW0oKQogICAgaWYgc3lzdGVtID09ICJEYXJ3aW4iOgog ICAgICAgIHJlbGVhc2UgPSBwbGF0Zm9ybS5tYWNfdmVyKClbMF0KICAgICAgICByZXR1cm4gZiJt YWNPUyB7cmVsZWFzZX0iIGlmIHJlbGVhc2UgZWxzZSAibWFjT1MiCiAgICBpZiBzeXN0ZW0gPT0g IldpbmRvd3MiOgogICAgICAgIHJlbGVhc2UsIHZlcnNpb24sIF8sIF8gPSBwbGF0Zm9ybS53aW4z Ml92ZXIoKQogICAgICAgIHJldHVybiBmIldpbmRvd3Mge3JlbGVhc2V9ICh7dmVyc2lvbn0pIiBp ZiByZWxlYXNlIGVsc2UgIldpbmRvd3MiCiAgICBpZiBzeXN0ZW0gPT0gIkxpbnV4IjoKICAgICAg ICB0cnk6CiAgICAgICAgICAgIG5hbWUgPSBwbGF0Zm9ybS5mcmVlZGVza3RvcF9vc19yZWxlYXNl KCkuZ2V0KCJQUkVUVFlfTkFNRSIsICIiKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAg ICAgICBuYW1lID0gIiIKICAgICAgICBrZXJuZWwgPSBwbGF0Zm9ybS5yZWxlYXNlKCkKICAgICAg ICByZXR1cm4gZiJMaW51eCB7bmFtZX0gKGtlcm5lbCB7a2VybmVsfSkiIGlmIG5hbWUgZWxzZSBm IkxpbnV4IChrZXJuZWwge2tlcm5lbH0pIgogICAgcmV0dXJuIGYie3N5c3RlbX0ge3BsYXRmb3Jt LnJlbGVhc2UoKX0iLnN0cmlwKCkKCgpkZWYgcmVzb2x2ZV9kZXNjcmlwdGlvbihyZXNvbHZlOiBB bnkpIC0+IHN0cjoKICAgIGlmIHJlc29sdmUgaXMgTm9uZToKICAgICAgICByZXR1cm4gInVua25v d24iCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGYie3Jlc29sdmUuR2V0UHJvZHVjdE5hbWUoKX0g e3Jlc29sdmUuR2V0VmVyc2lvblN0cmluZygpfSIKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAg ICAgcmV0dXJuICJ1bmtub3duIgoKCmRlZiBweXRob25fbG9jYXRpb24oKSAtPiBzdHI6CiAgICAi IiJXaGVyZSB0aGUgcnVubmluZyBQeXRob24gbGl2ZXMuCgogICAgUmVzb2x2ZSAyMS4xKyBlbWJl ZHMgaXRzIG93biBQeXRob24sIGFuZCB0aGVuIGBgc3lzLmV4ZWN1dGFibGVgYCBpcyB0aGUgUmVz b2x2ZQogICAgYmluYXJ5IGl0c2VsZiwgc28gcmVwb3J0IHRoYXQgYXMgYnVpbHQtaW4uCiAgICAi IiIKICAgIGlmIGlzX2J1aWx0aW5fcHl0aG9uKCk6CiAgICAgICAgcmV0dXJuIGYiYnVpbHQtaW4g KHtzeXMucHJlZml4fSkiCiAgICByZXR1cm4gc3lzLmV4ZWN1dGFibGUKCgpkZWYgZGlhZ25vc3Rp Y19saW5lKHZlcnNpb246IHN0ciwgcmVzb2x2ZTogQW55KSAtPiBzdHI6CiAgICBweXRob24gPSAi LiIuam9pbihzdHIocGFydCkgZm9yIHBhcnQgaW4gc3lzLnZlcnNpb25faW5mb1s6M10pCiAgICBs b2NhdGlvbiA9IHB5dGhvbl9sb2NhdGlvbigpCiAgICByZXR1cm4gKAogICAgICAgIGYie1BSRUZJ WH0gdnt2ZXJzaW9ufSB8IFB5dGhvbiB7cHl0aG9ufSBhdCB7bG9jYXRpb259IHwgIgogICAgICAg IGYiUmVzb2x2ZSB7cmVzb2x2ZV9kZXNjcmlwdGlvbihyZXNvbHZlKX0gfCB7b3NfZGVzY3JpcHRp b24oKX0iCiAgICApClBLAwQUAAAAAAAUW2pdbjjAxieBAAAngQAAHwAAAGF1cGhvbmljX3Jlc29s dmUvbWFpbl9zY3JlZW4ucHkiIiJMb2dpYyBvZiB0aGUgbWFpbiBzY3JlZW46IHRpbWVsaW5lIGlu cHV0cywgcHJlc2V0cywgdGl0bGUgYW5kIHRoZSBzdW1tYXJ5LgoKQWxsIFJlc29sdmUgQVBJIGNh bGxzIGhhcHBlbiBoZXJlLCBvbiB0aGUgVUkgdGhyZWFkIChldmVudCBhbmQgdGltZXIgaGFuZGxl cnMpLgpQcmVzZXRzIGFyZSBsb2FkZWQgaW4gYSB3b3JrZXIgdGhyZWFkIHZpYSBgYFRhc2tSdW5u ZXJgYC4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgZGF0 YWNsYXNzZXMKaW1wb3J0IHRpbWUKZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IENhbGxhYmxl CmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcwpmcm9tIHBhdGhsaWIgaW1wb3J0IFBh dGgKZnJvbSB0eXBpbmcgaW1wb3J0IEFueQoKZnJvbSAuIGltcG9ydCBjcmVkaXRzLCBsaW5rcywg bG9nLCBwaXBlbGluZQpmcm9tIC5hdXBob25pY19hcGkgaW1wb3J0IEFjY291bnQsIEFwaUVycm9y LCBBdXRoRXJyb3IsIFByZXNldApmcm9tIC5jb25maWcgaW1wb3J0IFNldHRpbmdzCmZyb20gLmlu c2VydCBpbXBvcnQgKAogICAgSW5zZXJ0RXJyb3IsCiAgICBJbnNlcnRSZXF1ZXN0LAogICAgSW5z ZXJ0UmVzdWx0LAogICAgaW5zZXJ0X3Byb2Nlc3NlZF9hdWRpbywKICAgIHJlbW92ZV9wcmV2aW91 c19yZXN1bHQsCikKZnJvbSAucGlwZWxpbmUgaW1wb3J0IFBpcGVsaW5lLCBQaXBlbGluZVJlc3Vs dCwgUHJvZHVjdGlvblJlcXVlc3QsIGRlZmF1bHRfZG93bmxvYWRfZGlyCmZyb20gLnJlc29sdmVf aW8gaW1wb3J0ICgKICAgIE5vVGltZWxpbmVFcnJvciwKICAgIFJlbmRlckVycm9yLAogICAgVGlt ZWxpbmVTdGF0ZSwKICAgIGNsZWFyX21hcmtfaW5fb3V0LAogICAgcmVhZF9tYXJrX2luX291dCwK ICAgIHJlYWRfdGltZWxpbmVfc3RhdGUsCiAgICByZXN0b3JlX21hcmtfaW5fb3V0LAogICAgc2Vs ZWN0ZWRfYXVkaW9fY2xpcHMsCiAgICB0aW1lbGluZV9zaWduYXR1cmUsCikKZnJvbSAuc2VsZWN0 aW9uIGltcG9ydCBDaG9pY2UsIENsaXBLZXksIFNlbGVjdGlvbiwgcGxhbgpmcm9tIC50aW1pbmcg aW1wb3J0ICgKICAgIGNoYXB0ZXJzX2Zyb21fbWFya2VycywKICAgIGZvcm1hdF9kdXJhdGlvbiwK ICAgIGZyYW1lc190b19zZWNvbmRzLAogICAgZnJhbWVzX3RvX3RpbWVjb2RlLAogICAgbWFya2Vy c19pbl9yYW5nZSwKKQpmcm9tIC51aS5tYWluIGltcG9ydCBDSEVDS0VELCBFRElUX1RFWFQsIFBB UlRMWSwgVU5DSEVDS0VELCBNYWluV2luZG93CmZyb20gLnVpLnRhc2tzIGltcG9ydCBUYXNrUnVu bmVyCmZyb20gLnVpLndpZGdldHMgaW1wb3J0IENVUlJFTlQsIERPTkUsIElORk8sIFRPRE8KCkRF RkFVTFRfVElUTEUgPSAiRGFWaW5jaSBSZXNvbHZlIgpKSU5HTEVfV0FSTklORyA9ICgKICAgICJX aXRoIGEgZnJlZSBBdXBob25pYyBhY2NvdW50LCB0aGUgQXVwaG9uaWMgamluZ2xlIGlzIGFkZGVk IHRvIHlvdXIgYXVkaW8sICIKICAgICJ3aGljaCBtYWtlcyBpdCBhIGZldyBzZWNvbmRzIGxvbmdl ci4iCikKClNURVBfTkFNRVMgPSB7CiAgICBwaXBlbGluZS5TVEVQX1JFTkRFUjogIlJlbmRlciB0 aGUgYXVkaW8iLAogICAgcGlwZWxpbmUuU1RFUF9DUkVBVEU6ICJDcmVhdGUgdGhlIHByb2R1Y3Rp b24iLAogICAgcGlwZWxpbmUuU1RFUF9VUExPQUQ6ICJVcGxvYWQiLAogICAgcGlwZWxpbmUuU1RF UF9FRElUOiAiRWRpdCBhbmQgc3RhcnQgaXQgb24gYXVwaG9uaWMuY29tIiwKICAgIHBpcGVsaW5l LlNURVBfUFJPQ0VTUzogIlByb2Nlc3Mgb24gQXVwaG9uaWMiLAogICAgcGlwZWxpbmUuU1RFUF9E T1dOTE9BRDogIkRvd25sb2FkIiwKICAgIHBpcGVsaW5lLlNURVBfSU5TRVJUOiAiQWRkIHRvIHRo ZSB0aW1lbGluZSIsCn0KCgpkZWYgX2VsYXBzZWQoc2Vjb25kczogZmxvYXQpIC0+IHN0cjoKICAg IHNlY29uZHMgPSByb3VuZChzZWNvbmRzKQogICAgcmV0dXJuIGYie3NlY29uZHMgLy8gNjB9Ontz ZWNvbmRzICUgNjA6MDJkfSIKCgpjbGFzcyBTdGVwczoKICAgICIiIlRoZSBydW4ncyBzdGVwcyBm b3IgdGhlIHByb2dyZXNzIGxpc3Q6IHdoaWNoIGlzIGN1cnJlbnQsIGhvdyBsb25nIGVhY2ggdG9v ay4iIiIKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgc2VsZiwgZWRpdF9maXJzdDogYm9vbCwg Y2xvY2s6IENhbGxhYmxlW1tdLCBmbG9hdF0gPSB0aW1lLm1vbm90b25pYywgYWdhaW46IGJvb2wg PSBGYWxzZQogICAgKSAtPiBOb25lOgogICAgICAgICIiImBgYWdhaW5gYDogRWRpdCBBZ2Fpbiwg d2hpY2ggc3RhcnRzIGF0IGVkaXRpbmcgb24gYXVwaG9uaWMuY29tLiIiIgogICAgICAgIHNlbGYu b3JkZXIgPSBbcyBmb3IgcyBpbiBTVEVQX05BTUVTIGlmIGVkaXRfZmlyc3Qgb3IgYWdhaW4gb3Ig cyAhPSBwaXBlbGluZS5TVEVQX0VESVRdCiAgICAgICAgaWYgYWdhaW46CiAgICAgICAgICAgIHNl bGYub3JkZXIgPSBzZWxmLm9yZGVyW3NlbGYub3JkZXIuaW5kZXgocGlwZWxpbmUuU1RFUF9FRElU KSA6XQogICAgICAgIHNlbGYuY2xvY2sgPSBjbG9jawogICAgICAgIHNlbGYuY3VycmVudCA9IHNl bGYub3JkZXJbMF0KICAgICAgICBzZWxmLnN0YXJ0ZWQgPSBjbG9jaygpCiAgICAgICAgc2VsZi50 b29rOiBkaWN0W2ludCwgZmxvYXRdID0ge30KCiAgICBkZWYgdXBkYXRlKHNlbGYsIHN0YWdlOiBz dHIsIGZyYWN0aW9uOiBmbG9hdCB8IE5vbmUpIC0+IGxpc3RbdHVwbGVbc3RyLCBzdHIsIHN0cl1d OgogICAgICAgIHN0ZXAgPSBwaXBlbGluZS5zdGVwX29mKHN0YWdlKQogICAgICAgIGlmIHN0ZXAg aXMgbm90IE5vbmUgYW5kIHN0ZXAgIT0gc2VsZi5jdXJyZW50IGFuZCBzdGVwIGluIHNlbGYub3Jk ZXI6CiAgICAgICAgICAgIG5vdyA9IHNlbGYuY2xvY2soKQogICAgICAgICAgICBmb3IgZWFybGll ciBpbiBzZWxmLm9yZGVyWzogc2VsZi5vcmRlci5pbmRleChzdGVwKV06CiAgICAgICAgICAgICAg ICBzZWxmLnRvb2suc2V0ZGVmYXVsdChlYXJsaWVyLCAwLjApCiAgICAgICAgICAgIHNlbGYudG9v a1tzZWxmLmN1cnJlbnRdID0gbm93IC0gc2VsZi5zdGFydGVkCiAgICAgICAgICAgIHNlbGYuY3Vy cmVudCwgc2VsZi5zdGFydGVkID0gc3RlcCwgbm93CiAgICAgICAgaWYgZnJhY3Rpb24gaXMgbm90 IE5vbmU6CiAgICAgICAgICAgIGRldGFpbCA9IGYie3JvdW5kKG1pbihtYXgoZnJhY3Rpb24sIDAu MCksIDEuMCkgKiAxMDApfSAlIgogICAgICAgIGVsaWYgc3RhZ2Uuc3RhcnRzd2l0aCgiQXVwaG9u aWM6ICIpOgogICAgICAgICAgICBkZXRhaWwgPSBzdGFnZS5yZW1vdmVwcmVmaXgoIkF1cGhvbmlj OiAiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRldGFpbCA9ICIiCiAgICAgICAgcm93cyA9 IFtdCiAgICAgICAgZm9yIHN0ZXBfaWQgaW4gc2VsZi5vcmRlcjoKICAgICAgICAgICAgbmFtZSA9 IFNURVBfTkFNRVNbc3RlcF9pZF0KICAgICAgICAgICAgaWYgc3RlcF9pZCA9PSBzZWxmLmN1cnJl bnQ6CiAgICAgICAgICAgICAgICByb3dzLmFwcGVuZCgobmFtZSwgQ1VSUkVOVCwgZGV0YWlsKSkK ICAgICAgICAgICAgZWxpZiBzdGVwX2lkIGluIHNlbGYudG9vazoKICAgICAgICAgICAgICAgIHJv d3MuYXBwZW5kKChuYW1lLCBET05FLCBfZWxhcHNlZChzZWxmLnRvb2tbc3RlcF9pZF0pKSkKICAg ICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJvd3MuYXBwZW5kKChuYW1lLCBUT0RPLCAi IikpCiAgICAgICAgcmV0dXJuIHJvd3MKCgpAZGF0YWNsYXNzCmNsYXNzIExhc3RSdW46CiAgICAi IiJBIGZpbmlzaGVkIHByb2R1Y3Rpb24sIGZvciBFZGl0IEFnYWluLiIiIgoKICAgIHJlcXVlc3Q6 IFByb2R1Y3Rpb25SZXF1ZXN0CiAgICBpbnNlcnRfcmVxdWVzdDogSW5zZXJ0UmVxdWVzdAogICAg cHJvZHVjdGlvbl91dWlkOiBzdHIKICAgIGluc2VydGVkOiBJbnNlcnRSZXN1bHQKICAgIHJ1bl9k ZXRhaWxzOiBsaXN0W3R1cGxlW3N0ciwgc3RyXV0KCgpjbGFzcyBNYWluU2NyZWVuOgogICAgZGVm IF9faW5pdF9fKAogICAgICAgIHNlbGYsCiAgICAgICAgdmlldzogTWFpbldpbmRvdywKICAgICAg ICAqLAogICAgICAgIHJlc29sdmU6IEFueSwKICAgICAgICBzZXR0aW5nczogU2V0dGluZ3MsCiAg ICAgICAgc2F2ZV9zZXR0aW5nczogQ2FsbGFibGVbW10sIE5vbmVdLAogICAgICAgIHRhc2tzOiBU YXNrUnVubmVyLAogICAgICAgIG9uX2F1dGhfZXJyb3I6IENhbGxhYmxlW1tBdXRoRXJyb3JdLCBO b25lXSwKICAgICAgICBvbl9wcm9kdWN0aW9uX2RvbmU6IENhbGxhYmxlW1tdLCBOb25lXSA9IGxh bWJkYTogTm9uZSwKICAgICAgICBwaXBlbGluZV9vcHRpb25zOiBkaWN0W3N0ciwgQW55XSB8IE5v bmUgPSBOb25lLAogICAgKSAtPiBOb25lOgogICAgICAgIHNlbGYudmlldyA9IHZpZXcKICAgICAg ICBzZWxmLnJlc29sdmUgPSByZXNvbHZlCiAgICAgICAgc2VsZi5zZXR0aW5ncyA9IHNldHRpbmdz CiAgICAgICAgc2VsZi5zYXZlX3NldHRpbmdzID0gc2F2ZV9zZXR0aW5ncwogICAgICAgIHNlbGYu dGFza3MgPSB0YXNrcwogICAgICAgIHNlbGYub25fYXV0aF9lcnJvciA9IG9uX2F1dGhfZXJyb3IK ICAgICAgICBzZWxmLm9uX3Byb2R1Y3Rpb25fZG9uZSA9IG9uX3Byb2R1Y3Rpb25fZG9uZQogICAg ICAgIHNlbGYucGlwZWxpbmVfb3B0aW9ucyA9IHBpcGVsaW5lX29wdGlvbnMgb3Ige30KICAgICAg ICBzZWxmLmNhbmNlbGxlZF9wcm9kdWN0aW9uID0gIiIgICMgdXVpZCBhd2FpdGluZyAia2VlcCBv ciBkZWxldGUiCiAgICAgICAgc2VsZi5jbGllbnQ6IEFueSA9IE5vbmUKICAgICAgICBzZWxmLmFj Y291bnQ6IEFjY291bnQgfCBOb25lID0gTm9uZQogICAgICAgIHNlbGYuc3RhdGU6IFRpbWVsaW5l U3RhdGUgfCBOb25lID0gTm9uZQogICAgICAgIHNlbGYudGltZWxpbmVfZXJyb3IgPSAiIgogICAg ICAgIHNlbGYuY2hvaWNlID0gQ2hvaWNlKCkgICMgdGhlIHRpY2tlZCB0cmFja3MgYW5kIGNsaXBz CiAgICAgICAgc2VsZi5jaG9zZW5fb25jZSA9IEZhbHNlICAjIGEgZGVmYXVsdCB3YXMgcGlja2Vk IGZvciB0aGlzIHNjcmVlbiBhbHJlYWR5CiAgICAgICAgIyBUaGUgdGltZWxpbmUgc2VsZWN0aW9u IHNlZW4gbGFzdDsgdGhlIHRpY2tzIGZvbGxvdyBpdCB3aGVuIGl0IGNoYW5nZXMuCiAgICAgICAg c2VsZi5fc2Vlbl9zZWxlY3Rpb246IGZyb3plbnNldFtDbGlwS2V5XSB8IE5vbmUgPSBOb25lCiAg ICAgICAgc2VsZi5wcmVzZXRzOiBsaXN0W1ByZXNldF0gfCBOb25lID0gTm9uZQogICAgICAgIHNl bGYucHJlc2V0c19lcnJvciA9ICIiCiAgICAgICAgc2VsZi5fc2lnbmF0dXJlOiB0dXBsZVtBbnks IC4uLl0gfCBOb25lID0gTm9uZQogICAgICAgIHNlbGYucGlwZWxpbmU6IFBpcGVsaW5lIHwgTm9u ZSA9IE5vbmUKICAgICAgICBzZWxmLmluc2VydF9yZXF1ZXN0OiBJbnNlcnRSZXF1ZXN0IHwgTm9u ZSA9IE5vbmUKICAgICAgICBzZWxmLnNhdmVkX21hcmtzOiBBbnkgPSBOb25lICAjIHRoZSB0aW1l bGluZSdzIGluL291dCBwb2ludHMgYmVmb3JlIFN0YXJ0CiAgICAgICAgc2VsZi5zdGVwczogU3Rl cHMgfCBOb25lID0gTm9uZQogICAgICAgIHNlbGYucnVuX2RldGFpbHM6IGxpc3RbdHVwbGVbc3Ry LCBzdHJdXSA9IFtdCiAgICAgICAgc2VsZi5wcm9kdWN0aW9uX3VybCA9ICIiICAjIHRoZSBydW5u aW5nIHByb2R1Y3Rpb24ncyBzdGF0dXMgcGFnZQogICAgICAgIHNlbGYub3V0cHV0X2ZpbGU6IFBh dGggfCBOb25lID0gTm9uZSAgIyB0aGUgbGFzdCBkb3dubG9hZGVkIHJlc3VsdAogICAgICAgIHNl bGYuc2hvd2luZ19lZGl0X2xpbmsgPSBGYWxzZSAgIyB0aGUgbGluayBwb2ludHMgdG8gdGhlIGVk aXQgcGFnZSBmb3Igbm93CiAgICAgICAgc2VsZi5sYXN0X3J1bjogTGFzdFJ1biB8IE5vbmUgPSBO b25lICAjIHRoZSBsYXN0IGZpbmlzaGVkIHByb2R1Y3Rpb24KICAgICAgICBzZWxmLmZvbGxvd2lu ZyA9IEZhbHNlICAjIEVkaXQgQWdhaW46IGZvbGxvd2luZyBsYXN0X3J1bidzIHByb2R1Y3Rpb24K ICAgICAgICBzZWxmLnJlcXVlc3Q6IFByb2R1Y3Rpb25SZXF1ZXN0IHwgTm9uZSA9IE5vbmUgICMg dGhlIHJ1bm5pbmcgcHJvZHVjdGlvbidzIHJlcXVlc3QKICAgICAgICBzZWxmLmJhY2tfdG9fc2V0 dGluZ3MgPSBGYWxzZSAgIyBjYW5jZWxsZWQgYWZ0ZXIgYSBzaWxlbnQgcmVuZGVyOiBubyByZXN1 bHQgdmlldwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJ1bm5pbmcoc2VsZikgLT4gYm9vbDoKICAg ICAgICByZXR1cm4gc2VsZi5waXBlbGluZSBpcyBub3QgTm9uZQoKICAgICMgLS0gZW50ZXJpbmcg LyBhY2NvdW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQoKICAgIGRlZiBlbnRlcihzZWxmLCBjbGllbnQ6IEFueSwgYWNjb3VudDogQWNj b3VudCkgLT4gTm9uZToKICAgICAgICBzZWxmLmNsaWVudCA9IGNsaWVudAogICAgICAgIHNlbGYu dmlldy5zaG93X3NldHVwKCkKICAgICAgICBzZWxmLnNldF9hY2NvdW50KGFjY291bnQpCiAgICAg ICAgc2VsZi52aWV3LnNldF9tdXRlKHNlbGYuc2V0dGluZ3MubXV0ZV9vcmlnaW5hbCkKICAgICAg ICBzZWxmLnJlZnJlc2hfdGltZWxpbmUoKQogICAgICAgIHNlbGYubG9hZF9wcmVzZXRzKCkKCiAg ICBkZWYgc2V0X2FjY291bnQoc2VsZiwgYWNjb3VudDogQWNjb3VudCkgLT4gTm9uZToKICAgICAg ICBzZWxmLmFjY291bnQgPSBhY2NvdW50CiAgICAgICAgc2VsZi52aWV3LnNldF9hY2NvdW50KGFj Y291bnQuZGlzcGxheV9uYW1lKQogICAgICAgIHNlbGYudmlldy5zZXRfY3JlZGl0cyhmIjxiPntj cmVkaXRzLmZvcm1hdF9ob3VycyhhY2NvdW50LmNyZWRpdHNfaG91cnMpfTwvYj4gY3JlZGl0cyBs ZWZ0IikKICAgICAgICBzZWxmLnVwZGF0ZSgpCgogICAgIyAtLSB0aW1lbGluZSAtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CgogICAgZGVmIF90cmFja19jbGlwcyhzZWxmKSAtPiBkaWN0W2ludCwgbGlzdFtDbGlwS2V5XV06 CiAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4ge30KICAg ICAgICByZXR1cm4ge3QuaW5kZXg6IFsodC5pbmRleCwgYy5zdGFydCwgYy5lbmQpIGZvciBjIGlu IHQuY2xpcHNdIGZvciB0IGluIHNlbGYuc3RhdGUudHJhY2tzfQoKICAgIGRlZiByZWZyZXNoX3Rp bWVsaW5lKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgIiIiUmUtcmVhZCB0aGUgdGltZWxpbmUgYW5k IGtlZXAgdGhlIHRpY2tlZCB0cmFja3MgYW5kIGNsaXBzIHRoYXQgc3RpbGwgZXhpc3QuIiIiCiAg ICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnN0YXRlID0gcmVhZF90aW1lbGluZV9zdGF0ZShz ZWxmLnJlc29sdmUpCiAgICAgICAgICAgIHNlbGYudGltZWxpbmVfZXJyb3IgPSAiIgogICAgICAg IGV4Y2VwdCBOb1RpbWVsaW5lRXJyb3IgYXMgZXhjOgogICAgICAgICAgICBzZWxmLnN0YXRlLCBz ZWxmLnRpbWVsaW5lX2Vycm9yID0gTm9uZSwgc3RyKGV4YykKICAgICAgICBleGNlcHQgRXhjZXB0 aW9uIGFzIGV4YzogICMgdW5leHBlY3RlZCBwcm94eSBmYWlsdXJlczogcmVwb3J0LCBrZWVwIHRo ZSBVSSBhbGl2ZQogICAgICAgICAgICBsb2cuZXJyb3IoIkNvdWxkbid0IHJlYWQgdGhlIHRpbWVs aW5lLiIsIGV4YykKICAgICAgICAgICAgc2VsZi5zdGF0ZSwgc2VsZi50aW1lbGluZV9lcnJvciA9 IE5vbmUsICJDb3VsZG4ndCByZWFkIHRoZSB0aW1lbGluZS4iCiAgICAgICAgc2VsZi5jaG9pY2Ug PSBzZWxmLmNob2ljZS5ub3JtYWxpemVkKHNlbGYuX3RyYWNrX2NsaXBzKCkpCiAgICAgICAgaWYg c2VsZi5zdGF0ZSBpcyBub3QgTm9uZSBhbmQgc2VsZi5jaG9pY2UuZW1wdHkgYW5kIG5vdCBzZWxm LmNob3Nlbl9vbmNlOgogICAgICAgICAgICBkZWZhdWx0ID0gc2VsZi5zdGF0ZS5kZWZhdWx0X3Ry YWNrX2luZGV4KCkKICAgICAgICAgICAgaWYgZGVmYXVsdCBpcyBub3QgTm9uZToKICAgICAgICAg ICAgICAgIHNlbGYuY2hvaWNlID0gQ2hvaWNlKGZyb3plbnNldCh7ZGVmYXVsdH0pKQogICAgICAg ICAgICAgICAgc2VsZi5jaG9zZW5fb25jZSA9IFRydWUKICAgICAgICBzZWxmLl9maWxsX3RyZWUo KQogICAgICAgIHNlbGYudmlldy5zZXRfZm9sbG93KAogICAgICAgICAgICBzZWxmLnNldHRpbmdz LmZvbGxvd190aW1lbGluZV9zZWxlY3Rpb24sCiAgICAgICAgICAgIGF2YWlsYWJsZT1zZWxmLnN0 YXRlIGlzIG5vdCBOb25lIGFuZCBzZWxlY3RlZF9hdWRpb19jbGlwcyhzZWxmLnJlc29sdmUpIGlz IG5vdCBOb25lLAogICAgICAgICkKICAgICAgICBzZWxmLnZpZXcuc2V0X3RpdGxlX3BsYWNlaG9s ZGVyKHNlbGYuZGVmYXVsdF90aXRsZSkKICAgICAgICBzZWxmLl9zaWduYXR1cmUgPSB0aW1lbGlu ZV9zaWduYXR1cmUoc2VsZi5yZXNvbHZlKQogICAgICAgIHNlbGYudXBkYXRlKCkKCiAgICBkZWYg cG9sbChzZWxmKSAtPiBOb25lOgogICAgICAgICIiIkNhbGxlZCBwZXJpb2RpY2FsbHkgYnkgdGhl IFVJIHRpbWVyOiBmb2xsb3cgdGhlIHRpbWVsaW5lIGFuZCBpdHMgc2VsZWN0aW9uLiIiIgogICAg ICAgIGlmIHNlbGYucnVubmluZzoKICAgICAgICAgICAgcmV0dXJuICAjIHRoZSByZW5kZXIgY2hh bmdlcyB0cmFjayBzdGF0ZXM7IHRoZSBpbnB1dHMgYXJlIGxvY2tlZCBhbnl3YXkKICAgICAgICB0 cnk6CiAgICAgICAgICAgIHNpZ25hdHVyZSA9IHRpbWVsaW5lX3NpZ25hdHVyZShzZWxmLnJlc29s dmUpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIGxvZy5kZWJ1 ZyhmInRpbWVsaW5lIHBvbGwgZmFpbGVkOiB7ZXhjIXJ9IikKICAgICAgICAgICAgcmV0dXJuCiAg ICAgICAgaWYgc2lnbmF0dXJlICE9IHNlbGYuX3NpZ25hdHVyZToKICAgICAgICAgICAgbG9nLmRl YnVnKCJ0aW1lbGluZSBjaGFuZ2VkOyByZWZyZXNoaW5nIikKICAgICAgICAgICAgc2VsZi5yZWZy ZXNoX3RpbWVsaW5lKCkKICAgICAgICBzZWxmLmZvbGxvd190aW1lbGluZV9zZWxlY3Rpb24oKQoK ICAgIGRlZiBmb2xsb3dfdGltZWxpbmVfc2VsZWN0aW9uKHNlbGYpIC0+IE5vbmU6CiAgICAgICAg IiIiVGljayB3aGF0IGlzIHNlbGVjdGVkIGluIFJlc29sdmUncyB0aW1lbGluZSwgd2hlbiB0aGF0 IHNlbGVjdGlvbiBjaGFuZ2VzLgoKICAgICAgICBPbmx5IGNoYW5nZXMgY291bnQsIHNvIHRpY2tz IG1hZGUgaW4gdGhlIHdpbmRvdyBzdGF5IHVudGlsIHRoZSB1c2VyIHNlbGVjdHMKICAgICAgICBz b21ldGhpbmcgZWxzZSBpbiB0aGUgdGltZWxpbmUuIEFuIGVtcHR5IHNlbGVjdGlvbiBjaGFuZ2Vz IG5vdGhpbmcuIFRoZSB1c2VyCiAgICAgICAgY2FuIHN3aXRjaCB0aGlzIG9mZiAoaXQgY2FuIGdl dCBpbiB0aGUgd2F5IHdoaWxlIGVkaXRpbmcpLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBz ZWxmLnNldHRpbmdzLmZvbGxvd190aW1lbGluZV9zZWxlY3Rpb246CiAgICAgICAgICAgIHJldHVy bgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZWN0ZWQgPSBzZWxlY3RlZF9hdWRpb19jbGlw cyhzZWxmLnJlc29sdmUpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAg ICAgIGxvZy5kZWJ1ZyhmInJlYWRpbmcgdGhlIHRpbWVsaW5lIHNlbGVjdGlvbiBmYWlsZWQ6IHtl eGMhcn0iKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBzZWxlY3RlZCBpcyBOb25lIG9y IHNlbGVjdGVkID09IHNlbGYuX3NlZW5fc2VsZWN0aW9uOgogICAgICAgICAgICByZXR1cm4KICAg ICAgICBzZWxmLl9zZWVuX3NlbGVjdGlvbiA9IHNlbGVjdGVkCiAgICAgICAgaWYgbm90IHNlbGVj dGVkOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBsb2cuZGVidWcoZiJ0aW1lbGluZSBzZWxl Y3Rpb246IHtzb3J0ZWQoc2VsZWN0ZWQpfSIpCiAgICAgICAgc2VsZi5jaG9pY2UgPSBDaG9pY2Uo Y2xpcHM9c2VsZWN0ZWQpLm5vcm1hbGl6ZWQoc2VsZi5fdHJhY2tfY2xpcHMoKSkKICAgICAgICBz ZWxmLmNob3Nlbl9vbmNlID0gVHJ1ZQogICAgICAgIHNlbGYuX2FwcGx5X2NoZWNrcygpCiAgICAg ICAgc2VsZi51cGRhdGUoKQoKICAgIGRlZiBfZmlsbF90cmVlKHNlbGYpIC0+IE5vbmU6CiAgICAg ICAgcmF0ZSA9IHNlbGYuc3RhdGUucmF0ZSBpZiBzZWxmLnN0YXRlIGVsc2UgTm9uZQogICAgICAg IHRyYWNrcyA9IFtdCiAgICAgICAgZm9yIHRyYWNrIGluIHNlbGYuc3RhdGUudHJhY2tzIGlmIHNl bGYuc3RhdGUgZWxzZSAoKToKICAgICAgICAgICAgY2xpcHMgPSBbXQogICAgICAgICAgICBmb3Ig Y2xpcCBpbiB0cmFjay5jbGlwczoKICAgICAgICAgICAgICAgIHNwYW4gPSAoCiAgICAgICAgICAg ICAgICAgICAgZiJ7ZnJhbWVzX3RvX3RpbWVjb2RlKGNsaXAuc3RhcnQsIHJhdGUpfSDigJMge2Zy YW1lc190b190aW1lY29kZShjbGlwLmVuZCwgcmF0ZSl9IgogICAgICAgICAgICAgICAgICAgIGlm IHJhdGUKICAgICAgICAgICAgICAgICAgICBlbHNlICIiCiAgICAgICAgICAgICAgICApCiAgICAg ICAgICAgICAgICBjbGlwcy5hcHBlbmQoKGNsaXAubmFtZSwgc3BhbikpCiAgICAgICAgICAgIHRy YWNrcy5hcHBlbmQoKHRyYWNrLmxhYmVsLCBjbGlwcykpCiAgICAgICAgc2VsZi52aWV3LnNldF9h dWRpb190cmVlKHRyYWNrcykKICAgICAgICBzZWxmLl9hcHBseV9jaGVja3MoKQoKICAgIGRlZiBf YXBwbHlfY2hlY2tzKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgc3RhdGVzID0gW10KICAgICAgICBm b3IgdHJhY2sgaW4gc2VsZi5zdGF0ZS50cmFja3MgaWYgc2VsZi5zdGF0ZSBlbHNlICgpOgogICAg ICAgICAgICB3aG9sZSA9IHRyYWNrLmluZGV4IGluIHNlbGYuY2hvaWNlLndob2xlX3RyYWNrcwog ICAgICAgICAgICB0aWNrZWQgPSBzZWxmLmNob2ljZS5jbGlwc19vbih0cmFjay5pbmRleCkKICAg ICAgICAgICAgY2xpcHMgPSBbCiAgICAgICAgICAgICAgICBDSEVDS0VEIGlmIHdob2xlIG9yICh0 cmFjay5pbmRleCwgYy5zdGFydCwgYy5lbmQpIGluIHRpY2tlZCBlbHNlIFVOQ0hFQ0tFRAogICAg ICAgICAgICAgICAgZm9yIGMgaW4gdHJhY2suY2xpcHMKICAgICAgICAgICAgXQogICAgICAgICAg ICBzdGF0ZSA9IENIRUNLRUQgaWYgd2hvbGUgZWxzZSAoUEFSVExZIGlmIHRpY2tlZCBlbHNlIFVO Q0hFQ0tFRCkKICAgICAgICAgICAgc3RhdGVzLmFwcGVuZCgoc3RhdGUsIGNsaXBzKSkKICAgICAg ICBzZWxmLnZpZXcuc2V0X2F1ZGlvX2NoZWNrcyhzdGF0ZXMpCgogICAgZGVmIG9uX2ZvbGxvd19j aGFuZ2VkKHNlbGYsIGNoZWNrZWQ6IGJvb2wpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5zZXR0aW5n cy5mb2xsb3dfdGltZWxpbmVfc2VsZWN0aW9uID0gY2hlY2tlZAogICAgICAgIHNlbGYuc2F2ZV9z ZXR0aW5ncygpCiAgICAgICAgaWYgY2hlY2tlZDoKICAgICAgICAgICAgc2VsZi5fc2Vlbl9zZWxl Y3Rpb24gPSBOb25lICAjIHRha2Ugb3ZlciB3aGF0IGlzIHNlbGVjdGVkIHJpZ2h0IG5vdwogICAg ICAgICAgICBzZWxmLmZvbGxvd190aW1lbGluZV9zZWxlY3Rpb24oKQoKICAgIGRlZiBvbl90cmFj a19jaGVja2VkKHNlbGYsIHBvc2l0aW9uOiBpbnQsIGNoZWNrZWQ6IGJvb2wpIC0+IE5vbmU6CiAg ICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBOb25lIG9yIG5vdCAwIDw9IHBvc2l0aW9uIDwgbGVuKHNl bGYuc3RhdGUudHJhY2tzKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgdHJhY2sgPSBzZWxm LnN0YXRlLnRyYWNrc1twb3NpdGlvbl0KICAgICAgICBpZiBub3QgdHJhY2suY2xpcHM6ICAjIG5v dGhpbmcgdG8gcHJvY2VzcyBvbiBhbiBlbXB0eSB0cmFjawogICAgICAgICAgICBzZWxmLl9hcHBs eV9jaGVja3MoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmNob2ljZSA9IHNlbGYu Y2hvaWNlLnRvZ2dsZV90cmFjayh0cmFjay5pbmRleCwgY2hlY2tlZCkubm9ybWFsaXplZChzZWxm Ll90cmFja19jbGlwcygpKQogICAgICAgIHNlbGYuY2hvc2VuX29uY2UgPSBUcnVlCiAgICAgICAg c2VsZi5fYXBwbHlfY2hlY2tzKCkKICAgICAgICBzZWxmLnVwZGF0ZSgpCgogICAgZGVmIG9uX2Ns aXBfY2hlY2tlZChzZWxmLCBwb3NpdGlvbjogaW50LCBjbGlwX3Bvc2l0aW9uOiBpbnQsIGNoZWNr ZWQ6IGJvb2wpIC0+IE5vbmU6CiAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBOb25lIG9yIG5vdCAw IDw9IHBvc2l0aW9uIDwgbGVuKHNlbGYuc3RhdGUudHJhY2tzKToKICAgICAgICAgICAgcmV0dXJu CiAgICAgICAgdHJhY2sgPSBzZWxmLnN0YXRlLnRyYWNrc1twb3NpdGlvbl0KICAgICAgICBpZiBu b3QgMCA8PSBjbGlwX3Bvc2l0aW9uIDwgbGVuKHRyYWNrLmNsaXBzKToKICAgICAgICAgICAgcmV0 dXJuCiAgICAgICAgY2xpcCA9IHRyYWNrLmNsaXBzW2NsaXBfcG9zaXRpb25dCiAgICAgICAga2V5 cyA9IHNlbGYuX3RyYWNrX2NsaXBzKCkKICAgICAgICBzZWxmLmNob2ljZSA9IHNlbGYuY2hvaWNl LnRvZ2dsZV9jbGlwKAogICAgICAgICAgICAodHJhY2suaW5kZXgsIGNsaXAuc3RhcnQsIGNsaXAu ZW5kKSwgY2hlY2tlZCwga2V5c1t0cmFjay5pbmRleF0KICAgICAgICApLm5vcm1hbGl6ZWQoa2V5 cykKICAgICAgICBzZWxmLmNob3Nlbl9vbmNlID0gVHJ1ZQogICAgICAgIHNlbGYuX2FwcGx5X2No ZWNrcygpCiAgICAgICAgc2VsZi51cGRhdGUoKQoKICAgICMgLS0gcHJlc2V0cyAtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCgogICAgZGVmIGxvYWRfcHJlc2V0cyhzZWxmKSAtPiBOb25lOgogICAgICAgIGlmIHNlbGYu Y2xpZW50IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYudmlldy5zZXRf cHJlc2V0cyhbIkxvYWRpbmcgcHJlc2V0c+KApiJdLCAwLCBlbmFibGVkPUZhbHNlKQogICAgICAg IHNlbGYudmlldy5zZXRfcHJlc2V0c19idXN5KFRydWUpCiAgICAgICAgc2VsZi50YXNrcy5ydW4o InByZXNldHMiLCBzZWxmLmNsaWVudC5nZXRfcHJlc2V0cywgc2VsZi5vbl9wcmVzZXRzKQoKICAg IGRlZiBvbl9wcmVzZXRzKHNlbGYsIHByZXNldHM6IGxpc3RbUHJlc2V0XSB8IE5vbmUsIGVycm9y OiBCYXNlRXhjZXB0aW9uIHwgTm9uZSkgLT4gTm9uZToKICAgICAgICBzZWxmLnZpZXcuc2V0X3By ZXNldHNfYnVzeShGYWxzZSkKICAgICAgICBpZiBpc2luc3RhbmNlKGVycm9yLCBBdXRoRXJyb3Ip OgogICAgICAgICAgICBzZWxmLm9uX2F1dGhfZXJyb3IoZXJyb3IpCiAgICAgICAgICAgIHJldHVy bgogICAgICAgIGlmIGVycm9yIGlzIG5vdCBOb25lIG9yIHByZXNldHMgaXMgTm9uZToKICAgICAg ICAgICAgc2VsZi5wcmVzZXRzID0gTm9uZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVycm9y LCBBcGlFcnJvcik6CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gc3RyKGVycm9yKQogICAgICAg ICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDb3VsZG4ndCBsb2FkIHByZXNl dHMuIiwgZXJyb3IpCiAgICAgICAgICAgICAgICBtZXNzYWdlID0gIkNvdWxkbid0IGxvYWQgeW91 ciBwcmVzZXRzLiIKICAgICAgICAgICAgc2VsZi52aWV3LnNob3dfZXJyb3IoZiJ7bWVzc2FnZX0g Q2xpY2sgUmVmcmVzaCBuZXh0IHRvIFByZXNldCB0byB0cnkgYWdhaW4uIikKICAgICAgICBlbGlm IG5vdCBwcmVzZXRzOgogICAgICAgICAgICBzZWxmLnByZXNldHMgPSBbXQogICAgICAgICAgICBz ZWxmLnZpZXcuc2hvd19ub3RpY2UoCiAgICAgICAgICAgICAgICAiWW91IGhhdmUgbm8gc2luZ2xl dHJhY2sgQXVwaG9uaWMgcHJlc2V0cyB5ZXQuIENyZWF0ZSBvbmUgb24gYXVwaG9uaWMuY29tLCAi CiAgICAgICAgICAgICAgICAidGhlbiBjbGljayBSZWZyZXNoIG5leHQgdG8gUHJlc2V0LiIKICAg ICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucHJlc2V0cyA9IHByZXNl dHMKICAgICAgICAgICAgb3duID0gc3VtKG5vdCBwLmF1cGhvbmljIGZvciBwIGluIHByZXNldHMp CiAgICAgICAgICAgIGxvZy5kZWJ1ZyhmInByZXNldHM6IHtvd259IG9mIHlvdXJzLCB7bGVuKHBy ZXNldHMpIC0gb3dufSBmcm9tIEF1cGhvbmljIikKICAgICAgICBzZWxmLl9maWxsX3ByZXNldHMo KQogICAgICAgIHNlbGYudXBkYXRlKCkKCiAgICBkZWYgX2ZpbGxfcHJlc2V0cyhzZWxmKSAtPiBO b25lOgogICAgICAgIGlmIHNlbGYucHJlc2V0cyBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnZp ZXcuc2V0X3ByZXNldHMoWyJDb3VsZG4ndCBsb2FkIHByZXNldHMiXSwgMCwgZW5hYmxlZD1GYWxz ZSkKICAgICAgICBlbGlmIG5vdCBzZWxmLnByZXNldHM6CiAgICAgICAgICAgIHNlbGYudmlldy5z ZXRfcHJlc2V0cyhbIk5vIHNpbmdsZXRyYWNrIHByZXNldHMiXSwgMCwgZW5hYmxlZD1GYWxzZSkK ICAgICAgICBlbHNlOgogICAgICAgICAgICB1dWlkcyA9IFtwLnV1aWQgZm9yIHAgaW4gc2VsZi5w cmVzZXRzXQogICAgICAgICAgICBsYXN0ID0gc2VsZi5zZXR0aW5ncy5sYXN0X3ByZXNldF91dWlk CiAgICAgICAgICAgIGluZGV4ID0gdXVpZHMuaW5kZXgobGFzdCkgaWYgbGFzdCBpbiB1dWlkcyBl bHNlIDAKICAgICAgICAgICAgIyBUaGUgdXNlcidzIHByZXNldHMsIHRoZW4gQXVwaG9uaWMncyBi ZWxvdyBhIGRpdmlkZXIuCiAgICAgICAgICAgIGdyb3VwcyA9IFsKICAgICAgICAgICAgICAgIFtw Lm5hbWUgZm9yIHAgaW4gc2VsZi5wcmVzZXRzIGlmIG5vdCBwLmF1cGhvbmljXSwKICAgICAgICAg ICAgICAgIFtwLm5hbWUgZm9yIHAgaW4gc2VsZi5wcmVzZXRzIGlmIHAuYXVwaG9uaWNdLAogICAg ICAgICAgICBdCiAgICAgICAgICAgIHNlbGYudmlldy5zZXRfcHJlc2V0X2dyb3Vwcyhncm91cHMs IGluZGV4KQogICAgICAgICAgICBzZWxmLl9yZW1lbWJlcl9wcmVzZXQoc2VsZi5wcmVzZXRzW2lu ZGV4XSkKCiAgICBkZWYgb25fcHJlc2V0X2NoYW5nZWQoc2VsZiwgaW5kZXg6IGludCkgLT4gTm9u ZToKICAgICAgICBpZiBzZWxmLnByZXNldHMgYW5kIDAgPD0gaW5kZXggPCBsZW4oc2VsZi5wcmVz ZXRzKToKICAgICAgICAgICAgc2VsZi5fcmVtZW1iZXJfcHJlc2V0KHNlbGYucHJlc2V0c1tpbmRl eF0pCiAgICAgICAgc2VsZi51cGRhdGUoKQoKICAgIGRlZiBfcmVtZW1iZXJfcHJlc2V0KHNlbGYs IHByZXNldDogUHJlc2V0KSAtPiBOb25lOgogICAgICAgIGlmIHNlbGYuc2V0dGluZ3MubGFzdF9w cmVzZXRfdXVpZCAhPSBwcmVzZXQudXVpZDoKICAgICAgICAgICAgc2VsZi5zZXR0aW5ncy5sYXN0 X3ByZXNldF91dWlkID0gcHJlc2V0LnV1aWQKICAgICAgICAgICAgc2VsZi5zYXZlX3NldHRpbmdz KCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVzZXQoc2VsZikgLT4gUHJlc2V0IHwgTm9uZToK ICAgICAgICBpZiBub3Qgc2VsZi5wcmVzZXRzOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAg ICAgIHV1aWQgPSBzZWxmLnNldHRpbmdzLmxhc3RfcHJlc2V0X3V1aWQKICAgICAgICByZXR1cm4g bmV4dCgocCBmb3IgcCBpbiBzZWxmLnByZXNldHMgaWYgcC51dWlkID09IHV1aWQpLCBzZWxmLnBy ZXNldHNbMF0pCgogICAgIyAtLSBvdGhlciBpbnB1dHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZGVmIG9uX211dGVf Y2hhbmdlZChzZWxmLCBjaGVja2VkOiBib29sKSAtPiBOb25lOgogICAgICAgIHNlbGYuc2V0dGlu Z3MubXV0ZV9vcmlnaW5hbCA9IGNoZWNrZWQKICAgICAgICBzZWxmLnNhdmVfc2V0dGluZ3MoKQoK ICAgIEBwcm9wZXJ0eQogICAgZGVmIGRlZmF1bHRfdGl0bGUoc2VsZikgLT4gc3RyOgogICAgICAg IG5hbWUgPSBzZWxmLnN0YXRlLnByb2plY3RfbmFtZS5zdHJpcCgpIGlmIHNlbGYuc3RhdGUgZWxz ZSAiIgogICAgICAgIHJldHVybiBuYW1lIG9yIERFRkFVTFRfVElUTEUKCiAgICBAcHJvcGVydHkK ICAgIGRlZiB0aXRsZShzZWxmKSAtPiBzdHI6CiAgICAgICAgcmV0dXJuIHNlbGYudmlldy50aXRs ZSBvciBzZWxmLmRlZmF1bHRfdGl0bGUKCiAgICAjIC0tIHN1bW1hcnkgLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoK ICAgIEBwcm9wZXJ0eQogICAgZGVmIHNlbGVjdGlvbihzZWxmKSAtPiBTZWxlY3Rpb246CiAgICAg ICAgaWYgc2VsZi5zdGF0ZSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gU2VsZWN0aW9uKE5v bmUsIHNlbGYudGltZWxpbmVfZXJyb3IpCiAgICAgICAgbWFyayA9IHNlbGYuc3RhdGUubWFyawog ICAgICAgIGxhYmVsID0gIiIKICAgICAgICBpZiBtYXJrIGlzIG5vdCBOb25lOgogICAgICAgICAg ICByYXRlID0gc2VsZi5zdGF0ZS5yYXRlCiAgICAgICAgICAgIGxhYmVsID0gZiJ7ZnJhbWVzX3Rv X3RpbWVjb2RlKG1hcmsuc3RhcnQsIHJhdGUpfeKAk3tmcmFtZXNfdG9fdGltZWNvZGUobWFyay5l bmQsIHJhdGUpfSIKICAgICAgICB0cmFja3MgPSB7CiAgICAgICAgICAgIHQuaW5kZXg6ICh0Lmxh YmVsLCBbKHQuaW5kZXgsIGMuc3RhcnQsIGMuZW5kKSBmb3IgYyBpbiB0LmNsaXBzXSkKICAgICAg ICAgICAgZm9yIHQgaW4gc2VsZi5zdGF0ZS50cmFja3MKICAgICAgICB9CiAgICAgICAgbmFtZXMg PSB7KHQuaW5kZXgsIGMuc3RhcnQsIGMuZW5kKTogYy5uYW1lIGZvciB0IGluIHNlbGYuc3RhdGUu dHJhY2tzIGZvciBjIGluIHQuY2xpcHN9CiAgICAgICAgcmV0dXJuIHBsYW4oc2VsZi5jaG9pY2Us IHRyYWNrcywgbWFyaywgbGFiZWwsIG5hbWVzKQoKICAgIGRlZiBjbGVhcl9pbl9vdXQoc2VsZikg LT4gTm9uZToKICAgICAgICAiIiJDbGVhciB0aGUgdGltZWxpbmUncyBpbi9vdXQgcG9pbnRzIGlu IFJlc29sdmUsIHRoZW4gcmUtcmVhZCB0aGUgdGltZWxpbmUuIiIiCiAgICAgICAgaWYgY2xlYXJf bWFya19pbl9vdXQoc2VsZi5yZXNvbHZlKToKICAgICAgICAgICAgbG9nLmluZm8oIkNsZWFyZWQg dGhlIHRpbWVsaW5lJ3MgaW4vb3V0IHBvaW50cy4iKQogICAgICAgIGVsc2U6CiAgICAgICAgICAg IHNlbGYudmlldy5zaG93X2Vycm9yKAogICAgICAgICAgICAgICAgIkNvdWxkbid0IGNsZWFyIHRo ZSBpbi9vdXQgcG9pbnRzLiBDbGVhciB0aGVtIGluIERhVmluY2kgUmVzb2x2ZSBpbnN0ZWFkICIK ICAgICAgICAgICAgICAgICIoT3B0aW9uK1ggb24gbWFjT1MsIEFsdCtYIG9uIFdpbmRvd3MgYW5k IExpbnV4KS4iCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLnJlZnJlc2hfdGltZWxpbmUoKQoK ICAgIGRlZiB3YXJuaW5ncyhzZWxmKSAtPiBsaXN0W3N0cl06CiAgICAgICAgIiIiV2hhdCBtYXkg bWFrZSB0aGUgcmVzdWx0IGRpZmZlciBmcm9tIHdoYXQgdGhlIHVzZXIgZXhwZWN0cy4iIiIKICAg ICAgICB3YXJuaW5ncyA9IFtdCiAgICAgICAgaWYgc2VsZi5hY2NvdW50IGlzIG5vdCBOb25lIGFu ZCBzZWxmLmFjY291bnQuZ2V0c19qaW5nbGU6CiAgICAgICAgICAgIHdhcm5pbmdzLmFwcGVuZChK SU5HTEVfV0FSTklORykKICAgICAgICByZXR1cm4gd2FybmluZ3MKCiAgICBkZWYgdXBkYXRlKHNl bGYpIC0+IE5vbmU6CiAgICAgICAgIiIiUmVjb21wdXRlIGR1cmF0aW9uLCBjaGFwdGVycyBhbmQg Y3JlZGl0cywgYW5kIHdoZXRoZXIgU3RhcnQgaXMgcG9zc2libGUuIiIiCiAgICAgICAgc2VsZi52 aWV3LnNldF93YXJuaW5ncyhzZWxmLndhcm5pbmdzKCkpCiAgICAgICAgc2VsZWN0aW9uID0gc2Vs Zi5zZWxlY3Rpb24KICAgICAgICAjIE9mZmVyIHRvIGNsZWFyIGluL291dCBwb2ludHMgd2hlbmV2 ZXIgdGhleSBjaGFuZ2Ugd2hhdCBnZXRzIHByb2Nlc3NlZC4KICAgICAgICBzZWxmLnZpZXcuc2hv d19jbGVhcl9pbl9vdXQoCiAgICAgICAgICAgIHNlbGYuc3RhdGUgaXMgbm90IE5vbmUKICAgICAg ICAgICAgYW5kIHNlbGYuc3RhdGUubWFyayBpcyBub3QgTm9uZQogICAgICAgICAgICBhbmQgYm9v bChzZWxlY3Rpb24ubm90ZSkKICAgICAgICAgICAgYW5kIG5vdCBzZWxmLmNob2ljZS5jbGlwcwog ICAgICAgICkKICAgICAgICBpZiBzZWxmLnN0YXRlIGlzIE5vbmUgb3Igbm90IHNlbGVjdGlvbi5v ayBvciBzZWxlY3Rpb24ucmFuZ2UgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi52aWV3LnNldF9z dW1tYXJ5KCLigJMiLCAi4oCTIiwgIuKAkyIsICLigJMiLCAi4oCTIiwgIuKAkyIsIHdhcm49RmFs c2UpCiAgICAgICAgICAgIHNlbGYudmlldy5zZXRfc2VsZWN0aW9uX25vdGUoc2VsZWN0aW9uLm5v dGUsIHdhcm49Ym9vbChzZWxlY3Rpb24ubm90ZSkpCiAgICAgICAgICAgIHNlbGYudmlldy5zZXRf c3RhcnRfZW5hYmxlZChGYWxzZSkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2Vjb25kcyA9 IGZyYW1lc190b19zZWNvbmRzKHNlbGVjdGlvbi5yYW5nZS5mcmFtZXMsIHNlbGYuc3RhdGUucmF0 ZSkKICAgICAgICBtYXJrZXJzID0gbGVuKG1hcmtlcnNfaW5fcmFuZ2UobGlzdChzZWxmLnN0YXRl Lm1hcmtlcnMpLCBzZWxlY3Rpb24ucmFuZ2UpKQogICAgICAgIGVzdGltYXRlID0gY3JlZGl0cy5l c3RpbWF0ZV9ob3VycyhzZWNvbmRzKQogICAgICAgIHJlbWFpbmluZyA9IHNlbGYuYWNjb3VudC5j cmVkaXRzX2hvdXJzIGlmIHNlbGYuYWNjb3VudCBlbHNlIDAuMAogICAgICAgIGVub3VnaCA9IGVz dGltYXRlIDw9IHJlbWFpbmluZyArIDFlLTkKICAgICAgICBlc3RpbWF0ZV90ZXh0ID0gY3JlZGl0 cy5mb3JtYXRfaG91cnMoZXN0aW1hdGUsIHJvdW5kX3VwPVRydWUpCiAgICAgICAgcmVtYWluaW5n X3RleHQgPSBjcmVkaXRzLmZvcm1hdF9ob3VycyhyZW1haW5pbmcpCiAgICAgICAgaWYgZW5vdWdo OgogICAgICAgICAgICBlc3RpbWF0ZV9sYWJlbCA9IGYie2VzdGltYXRlX3RleHR9IChvZiB7cmVt YWluaW5nX3RleHR9IHJlbWFpbmluZykiCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZXN0aW1h dGVfbGFiZWwgPSBmIntlc3RpbWF0ZV90ZXh0fSwgYnV0IG9ubHkge3JlbWFpbmluZ190ZXh0fSBy ZW1haW5pbmciCiAgICAgICAgbWFya2VyX3RleHQgPSAibm9uZSIgaWYgbWFya2VycyA9PSAwIGVs c2UgZiJ7bWFya2Vyc30gbWFya2VyeydzJyAqIChtYXJrZXJzICE9IDEpfSIKICAgICAgICByYXRl ID0gc2VsZi5zdGF0ZS5yYXRlCiAgICAgICAgc2VsZi52aWV3LnNldF9zdW1tYXJ5KAogICAgICAg ICAgICBzZWxlY3Rpb24uZGVzY3JpYmUoKSwKICAgICAgICAgICAgZnJhbWVzX3RvX3RpbWVjb2Rl KHNlbGVjdGlvbi5yYW5nZS5zdGFydCwgcmF0ZSksCiAgICAgICAgICAgIGZyYW1lc190b190aW1l Y29kZShzZWxlY3Rpb24ucmFuZ2UuZW5kLCByYXRlKSwKICAgICAgICAgICAgZm9ybWF0X2R1cmF0 aW9uKHNlY29uZHMpLAogICAgICAgICAgICBtYXJrZXJfdGV4dCwKICAgICAgICAgICAgZXN0aW1h dGVfbGFiZWwsCiAgICAgICAgICAgIHdhcm49bm90IGVub3VnaCwKICAgICAgICApCiAgICAgICAg c2VsZi52aWV3LnNldF9zZWxlY3Rpb25fbm90ZShzZWxlY3Rpb24ubm90ZSkKICAgICAgICBzZWxm LnZpZXcuc2V0X3N0YXJ0X2VuYWJsZWQoc2VsZi5wcmVzZXQgaXMgbm90IE5vbmUpCgogICAgIyAt LSBydW5uaW5nIGEgcHJvZHVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZGVmIG9uX3N0YXJ0KHNlbGYsIGVkaXRfZmlyc3Q6 IGJvb2wgPSBGYWxzZSkgLT4gTm9uZToKICAgICAgICAiIiJTdGFydCBQcm9kdWN0aW9uOyB3aXRo IGBgZWRpdF9maXJzdGBgLCBDcmVhdGUgYW5kIEVkaXQgUHJvZHVjdGlvbi4iIiIKICAgICAgICBz ZWxlY3Rpb24gPSBzZWxmLnNlbGVjdGlvbgogICAgICAgIGlmIHNlbGYucnVubmluZyBvciBzZWxm LnN0YXRlIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIG5vdCBzZWxlY3Rp b24ub2sgb3Igc2VsZWN0aW9uLnJhbmdlIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAg ICAgIHByZXNldCA9IHNlbGYucHJlc2V0CiAgICAgICAgaWYgcHJlc2V0IGlzIE5vbmUgb3Igc2Vs Zi5jbGllbnQgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIyBFeHBsaWNpdGx5 IHRpY2tlZCBjbGlwcyBtdXN0IHNvdW5kIGV2ZW4gaWYgdGhleSB3ZXJlIGRpc2FibGVkIChlLmcu IGJ5IGFuCiAgICAgICAgIyBlYXJsaWVyICJkaXNhYmxlIHRoZSBvcmlnaW5hbCBhdWRpbyIpLgog ICAgICAgIGV4cGxpY2l0ID0gdHVwbGUoayBmb3IgcGFydCBpbiBzZWxlY3Rpb24ucGFydHMgaWYg bm90IHBhcnQud2hvbGUgZm9yIGsgaW4gcGFydC5jbGlwcykKICAgICAgICByZXF1ZXN0ID0gUHJv ZHVjdGlvblJlcXVlc3QoCiAgICAgICAgICAgIHRyYWNrcz1zZWxlY3Rpb24udHJhY2tzLAogICAg ICAgICAgICBmcmFtZXM9c2VsZWN0aW9uLnJhbmdlLAogICAgICAgICAgICByYXRlPXNlbGYuc3Rh dGUucmF0ZSwKICAgICAgICAgICAgdGl0bGU9c2VsZi50aXRsZSwKICAgICAgICAgICAgcHJlc2V0 X3V1aWQ9cHJlc2V0LnV1aWQsCiAgICAgICAgICAgIGNoYXB0ZXJzPXR1cGxlKAogICAgICAgICAg ICAgICAgY2hhcHRlcnNfZnJvbV9tYXJrZXJzKGxpc3Qoc2VsZi5zdGF0ZS5tYXJrZXJzKSwgc2Vs ZWN0aW9uLnJhbmdlLCBzZWxmLnN0YXRlLnJhdGUpCiAgICAgICAgICAgICksCiAgICAgICAgICAg IGRvd25sb2FkX2Rpcj1kZWZhdWx0X2Rvd25sb2FkX2RpcihzZWxmLnN0YXRlLnByb2plY3RfbmFt ZSBvciBzZWxmLnRpdGxlKSwKICAgICAgICAgICAgc2lsZW5jZT1zZWxlY3Rpb24uc2lsZW5jZSwK ICAgICAgICAgICAgc291bmQ9ZXhwbGljaXQsCiAgICAgICAgICAgIGVkaXRfZmlyc3Q9ZWRpdF9m aXJzdCwKICAgICAgICApCiAgICAgICAgc2VsZi5pbnNlcnRfcmVxdWVzdCA9IEluc2VydFJlcXVl c3QoCiAgICAgICAgICAgIHRpbWVsaW5lX2lkPXNlbGYuc3RhdGUudGltZWxpbmVfaWQsCiAgICAg ICAgICAgIHRpbWVsaW5lX25hbWU9c2VsZi5zdGF0ZS50aW1lbGluZV9uYW1lLAogICAgICAgICAg ICBwYXJ0cz1zZWxlY3Rpb24ucGFydHMsCiAgICAgICAgICAgIGZyYW1lcz1zZWxlY3Rpb24ucmFu Z2UsCiAgICAgICAgICAgIHJhdGU9c2VsZi5zdGF0ZS5yYXRlLAogICAgICAgICAgICBkaXNhYmxl X29yaWdpbmFsPXNlbGYuc2V0dGluZ3MubXV0ZV9vcmlnaW5hbCwKICAgICAgICAgICAgdHJhY2tf bmFtZT1zZWxmLnRpdGxlLAogICAgICAgICAgICBqaW5nbGU9c2VsZi5hY2NvdW50IGlzIG5vdCBO b25lIGFuZCBzZWxmLmFjY291bnQuZ2V0c19qaW5nbGUsCiAgICAgICAgKQogICAgICAgIGxvZy5p bmZvKAogICAgICAgICAgICBmIlN0YXJ0aW5nOiB7c2VsZWN0aW9uLmRlc2NyaWJlKCl9LCBmcmFt ZXMgIgogICAgICAgICAgICBmIntzZWxlY3Rpb24ucmFuZ2Uuc3RhcnR9Li57c2VsZWN0aW9uLnJh bmdlLmVuZH0sIHRpdGxlIHtyZXF1ZXN0LnRpdGxlIXJ9LCAiCiAgICAgICAgICAgIGYicHJlc2V0 IHtwcmVzZXQubmFtZSFyfSwge2xlbihyZXF1ZXN0LmNoYXB0ZXJzKX0gY2hhcHRlcihzKSIKICAg ICAgICAgICAgKyAoIiwgZWRpdCBvbiBhdXBob25pYy5jb20gZmlyc3QiIGlmIGVkaXRfZmlyc3Qg ZWxzZSAiIikKICAgICAgICApCiAgICAgICAgc2VsZi5zdGVwcyA9IFN0ZXBzKGVkaXRfZmlyc3Qp CiAgICAgICAgc2VsZi5yZXF1ZXN0ID0gcmVxdWVzdAogICAgICAgIHNlbGYuZm9sbG93aW5nID0g RmFsc2UKICAgICAgICBzZWxmLmxhc3RfcnVuID0gTm9uZQogICAgICAgIHNlbGYucGlwZWxpbmUg PSBQaXBlbGluZSgKICAgICAgICAgICAgcmVxdWVzdCwKICAgICAgICAgICAgcmVzb2x2ZT1zZWxm LnJlc29sdmUsCiAgICAgICAgICAgIGNsaWVudD1zZWxmLmNsaWVudCwKICAgICAgICAgICAgb25f cHJvZ3Jlc3M9c2VsZi5fb25fcHJvZ3Jlc3MsCiAgICAgICAgICAgIG9uX2xpbms9c2VsZi5fb25f bGluaywKICAgICAgICAgICAgb25fZWRpdD1zZWxmLl9vbl9lZGl0LAogICAgICAgICAgICBvbl9m aW5pc2hlZD1zZWxmLl9vbl9maW5pc2hlZCwKICAgICAgICAgICAgb25fc2lsZW50PXNlbGYuX29u X3NpbGVudCwKICAgICAgICAgICAgKipzZWxmLnBpcGVsaW5lX29wdGlvbnMsCiAgICAgICAgKQog ICAgICAgIHNlbGYuc2F2ZWRfbWFya3MgPSByZWFkX21hcmtfaW5fb3V0KHNlbGYucmVzb2x2ZSkK ICAgICAgICBzZWxmLmNhbmNlbGxlZF9wcm9kdWN0aW9uID0gIiIKICAgICAgICBzZWxmLnZpZXcu c2hvd19rZWVwX29yX2RlbGV0ZShGYWxzZSkKICAgICAgICBzZWxmLnZpZXcuc2V0X3Byb2R1Y3Rp b25fbGluaygiIikKICAgICAgICBzZWxmLnZpZXcuc2V0X3N0YXR1cygiIikKICAgICAgICByYXRl ID0gc2VsZi5zdGF0ZS5yYXRlCiAgICAgICAgc2Vjb25kcyA9IGZyYW1lc190b19zZWNvbmRzKHNl bGVjdGlvbi5yYW5nZS5mcmFtZXMsIHJhdGUpCiAgICAgICAgc3BhbiA9ICgKICAgICAgICAgICAg ZiJ7ZnJhbWVzX3RvX3RpbWVjb2RlKHNlbGVjdGlvbi5yYW5nZS5zdGFydCwgcmF0ZSl9IOKGkiAi CiAgICAgICAgICAgIGYie2ZyYW1lc190b190aW1lY29kZShzZWxlY3Rpb24ucmFuZ2UuZW5kLCBy YXRlKX0iCiAgICAgICAgKQogICAgICAgIHNlbGYucnVuX2RldGFpbHMgPSBbCiAgICAgICAgICAg ICgiVGl0bGUiLCBzZWxmLnRpdGxlKSwKICAgICAgICAgICAgKCJBdWRpbyIsIHNlbGVjdGlvbi5k ZXNjcmliZSgpKSwKICAgICAgICAgICAgKCJQcmVzZXQiLCBwcmVzZXQubmFtZSksCiAgICAgICAg ICAgICgiTGVuZ3RoIiwgZiJ7Zm9ybWF0X2R1cmF0aW9uKHNlY29uZHMpfSAgKHtzcGFufSkiKSwK ICAgICAgICBdCiAgICAgICAgc2VsZi52aWV3LnNldF9ydW5fZGV0YWlscyhzZWxmLnJ1bl9kZXRh aWxzKQogICAgICAgIHNlbGYudmlldy5zaG93X2VkaXRfYWdhaW4oRmFsc2UpCiAgICAgICAgc2Vs Zi52aWV3LnNob3dfZmlsZV9idXR0b24oRmFsc2UpCiAgICAgICAgc2VsZi52aWV3LnNldF9ydW5u aW5nKFRydWUpCiAgICAgICAgc2VsZi5waXBlbGluZS5zdGFydCgpCgogICAgZGVmIG9uX2VkaXRf YWdhaW4oc2VsZikgLT4gTm9uZToKICAgICAgICAiIiJGb2xsb3cgdGhlIGZpbmlzaGVkIHByb2R1 Y3Rpb24gd2hpbGUgdGhlIHVzZXIgZWRpdHMgYW5kIHJlc3RhcnRzIGl0IG9uCiAgICAgICAgYXVw aG9uaWMuY29tOyB0aGVuIHJlcGxhY2UgdGhlIHJlc3VsdCBvbiB0aGUgdGltZWxpbmUuIiIiCiAg ICAgICAgbGFzdCA9IHNlbGYubGFzdF9ydW4KICAgICAgICBpZiBzZWxmLnJ1bm5pbmcgb3IgbGFz dCBpcyBOb25lIG9yIHNlbGYuY2xpZW50IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAg ICAgIGxvZy5pbmZvKGYiRWRpdCBBZ2FpbjogZm9sbG93aW5nIHByb2R1Y3Rpb24ge2xhc3QucHJv ZHVjdGlvbl91dWlkfSIpCiAgICAgICAgc2VsZi5mb2xsb3dpbmcgPSBUcnVlCiAgICAgICAgc2Vs Zi5yZXF1ZXN0ID0gbGFzdC5yZXF1ZXN0CiAgICAgICAgIyBUaGUgb3JpZ2luYWwgd2FzIGFscmVh ZHkgZGlzYWJsZWQgKGlmIHdhbnRlZCkgd2hlbiB0aGUgZmlyc3QgcmVzdWx0IGNhbWUgaW4uCiAg ICAgICAgc2VsZi5pbnNlcnRfcmVxdWVzdCA9IGRhdGFjbGFzc2VzLnJlcGxhY2UobGFzdC5pbnNl cnRfcmVxdWVzdCwgZGlzYWJsZV9vcmlnaW5hbD1GYWxzZSkKICAgICAgICBzZWxmLnN0ZXBzID0g U3RlcHMoZWRpdF9maXJzdD1UcnVlLCBhZ2Fpbj1UcnVlKQogICAgICAgIHNlbGYucGlwZWxpbmUg PSBQaXBlbGluZSgKICAgICAgICAgICAgbGFzdC5yZXF1ZXN0LAogICAgICAgICAgICByZXNvbHZl PXNlbGYucmVzb2x2ZSwKICAgICAgICAgICAgY2xpZW50PXNlbGYuY2xpZW50LAogICAgICAgICAg ICBvbl9wcm9ncmVzcz1zZWxmLl9vbl9wcm9ncmVzcywKICAgICAgICAgICAgb25fbGluaz1zZWxm Ll9vbl9saW5rLAogICAgICAgICAgICBvbl9lZGl0PXNlbGYuX29uX2VkaXQsCiAgICAgICAgICAg IG9uX2ZpbmlzaGVkPXNlbGYuX29uX2ZpbmlzaGVkLAogICAgICAgICAgICBmb2xsb3dfdXVpZD1s YXN0LnByb2R1Y3Rpb25fdXVpZCwKICAgICAgICAgICAgKipzZWxmLnBpcGVsaW5lX29wdGlvbnMs CiAgICAgICAgKQogICAgICAgIHNlbGYuc2F2ZWRfbWFya3MgPSByZWFkX21hcmtfaW5fb3V0KHNl bGYucmVzb2x2ZSkKICAgICAgICBzZWxmLnZpZXcuc2V0X3N0YXR1cygiIikKICAgICAgICBzZWxm LnZpZXcuc2V0X3J1bl9kZXRhaWxzKGxhc3QucnVuX2RldGFpbHMpCiAgICAgICAgc2VsZi52aWV3 LnNob3dfZWRpdF9hZ2FpbihGYWxzZSkKICAgICAgICBzZWxmLnZpZXcuc2hvd19maWxlX2J1dHRv bihGYWxzZSkKICAgICAgICBzZWxmLnZpZXcuc2V0X3J1bm5pbmcoVHJ1ZSkKICAgICAgICBzZWxm LnBpcGVsaW5lLnN0YXJ0KCkKCiAgICBkZWYgX29uX2xpbmsoc2VsZiwgdXJsOiBzdHIpIC0+IE5v bmU6CiAgICAgICAgc2VsZi5wcm9kdWN0aW9uX3VybCA9IHVybAogICAgICAgIHNlbGYudmlldy5z ZXRfcHJvZHVjdGlvbl9saW5rKHVybCkKCiAgICBkZWYgX29uX3Byb2dyZXNzKHNlbGYsIHN0YWdl OiBzdHIsIGZyYWN0aW9uOiBmbG9hdCB8IE5vbmUpIC0+IE5vbmU6CiAgICAgICAgc2VsZi52aWV3 LnNldF9wcm9ncmVzcyhzdGFnZSwgZnJhY3Rpb24pCiAgICAgICAgc3RlcCA9IHBpcGVsaW5lLnN0 ZXBfb2Yoc3RhZ2UpCiAgICAgICAgaWYgc2VsZi5zaG93aW5nX2VkaXRfbGluayBhbmQgc3RlcCBp cyBub3QgTm9uZSBhbmQgc3RlcCA+IHBpcGVsaW5lLlNURVBfRURJVDoKICAgICAgICAgICAgIyBT dGFydGVkIG9uIGF1cGhvbmljLmNvbTogdGhlIGVkaXQgbGluayBoYXMgZG9uZSBpdHMgam9iLgog ICAgICAgICAgICBzZWxmLnNob3dpbmdfZWRpdF9saW5rID0gRmFsc2UKICAgICAgICAgICAgc2Vs Zi52aWV3LnNldF9wcm9kdWN0aW9uX2xpbmsoc2VsZi5wcm9kdWN0aW9uX3VybCkKICAgICAgICBp ZiBzZWxmLnN0ZXBzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnZpZXcuc2V0X3N0ZXBz KHNlbGYuc3RlcHMudXBkYXRlKHN0YWdlLCBmcmFjdGlvbikpCgogICAgZGVmIF9vbl9lZGl0KHNl bGYsIHVybDogc3RyKSAtPiBOb25lOgogICAgICAgICIiIlRoZSBwcm9kdWN0aW9uIHdhaXRzIG9u IGF1cGhvbmljLmNvbTogb3BlbiBpdCB0aGVyZSBmb3IgdGhlIHVzZXIuIiIiCiAgICAgICAgc2Vs Zi5zaG93aW5nX2VkaXRfbGluayA9IFRydWUKICAgICAgICBzZWxmLnZpZXcuc2V0X3Byb2R1Y3Rp b25fbGluayh1cmwsIEVESVRfVEVYVCkKICAgICAgICBsaW5rcy5vcGVuX3VybCh1cmwpCgogICAg ZGVmIF9vbl9zaWxlbnQoc2VsZikgLT4gTm9uZToKICAgICAgICBzZWxmLnZpZXcuc2V0X3Byb2dy ZXNzKCIiLCBOb25lKQogICAgICAgIHNlbGYudmlldy5hc2tfYWJvdXRfc2lsZW5jZShUcnVlKQoK ICAgIGRlZiBvbl9jb250aW51ZV9zaWxlbnQoc2VsZikgLT4gTm9uZToKICAgICAgICBpZiBzZWxm LnBpcGVsaW5lIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsb2cuaW5mbygiQ29udGludWluZyB3 aXRoIHRoZSBzaWxlbnQgcmVuZGVyLiIpCiAgICAgICAgICAgIHNlbGYudmlldy5hc2tfYWJvdXRf c2lsZW5jZShGYWxzZSkKICAgICAgICAgICAgc2VsZi5waXBlbGluZS5jb250aW51ZV9hZnRlcl9z aWxlbmNlKCkKCiAgICBkZWYgb25fYmFja190b19zZXR0aW5ncyhzZWxmKSAtPiBOb25lOgogICAg ICAgICIiIlN0b3AgYWZ0ZXIgYSBzaWxlbnQgcmVuZGVyIGFuZCBnbyBzdHJhaWdodCBiYWNrIHRv IHRoZSBpbnB1dHMuIiIiCiAgICAgICAgaWYgc2VsZi5waXBlbGluZSBpcyBub3QgTm9uZToKICAg ICAgICAgICAgbG9nLmluZm8oIlN0b3BwZWQgYWZ0ZXIgYSBzaWxlbnQgcmVuZGVyLiIpCiAgICAg ICAgICAgIHNlbGYuYmFja190b19zZXR0aW5ncyA9IFRydWUKICAgICAgICAgICAgc2VsZi5waXBl bGluZS5jYW5jZWwoKQoKICAgIGRlZiBvbl9uZXdfcHJvZHVjdGlvbihzZWxmKSAtPiBOb25lOgog ICAgICAgICIiIkxlYXZlIHRoZSByZXN1bHQgdmlldzogYmFjayB0byB0aGUgaW5wdXRzLCB3aXRo IHRoZSB0aW1lbGluZSByZS1yZWFkLiIiIgogICAgICAgIHNlbGYuY2FuY2VsbGVkX3Byb2R1Y3Rp b24gPSAiIiAgIyBub3QgZGVsZXRlZDogaXQgc3RheXMgb24gQXVwaG9uaWMKICAgICAgICBzZWxm Lmxhc3RfcnVuID0gTm9uZQogICAgICAgIHNlbGYudmlldy5zaG93X2VkaXRfYWdhaW4oRmFsc2Up CiAgICAgICAgc2VsZi52aWV3LnNob3dfc2V0dXAoKQogICAgICAgIHNlbGYucmVmcmVzaF90aW1l bGluZSgpCgogICAgZGVmIHRpY2soc2VsZikgLT4gTm9uZToKICAgICAgICAiIiJDYWxsZWQgb24g ZXZlcnkgVUkgdGltZXIgdGljay4iIiIKICAgICAgICBpZiBzZWxmLnBpcGVsaW5lIGlzIG5vdCBO b25lOgogICAgICAgICAgICBzZWxmLnBpcGVsaW5lLnRpY2soKQoKICAgIGRlZiBvbl9jYW5jZWwo c2VsZikgLT4gTm9uZToKICAgICAgICBpZiBzZWxmLnBpcGVsaW5lIGlzIG5vdCBOb25lOgogICAg ICAgICAgICBzZWxmLnZpZXcuc2V0X3Byb2dyZXNzKCJDYW5jZWxsaW5nIiwgTm9uZSkKICAgICAg ICAgICAgc2VsZi5waXBlbGluZS5jYW5jZWwoKQoKICAgIGRlZiBfb25fZmluaXNoZWQoCiAgICAg ICAgc2VsZiwKICAgICAgICByZXN1bHQ6IFBpcGVsaW5lUmVzdWx0IHwgTm9uZSwKICAgICAgICBl cnJvcjogQmFzZUV4Y2VwdGlvbiB8IE5vbmUsCiAgICAgICAgY2FuY2VsbGVkOiBib29sLAogICAg ICAgIHByb2R1Y3Rpb25fdXVpZDogc3RyLAogICAgKSAtPiBOb25lOgogICAgICAgIHNlbGYucGlw ZWxpbmUgPSBOb25lCiAgICAgICAgc2VsZi5zdGVwcyA9IE5vbmUKICAgICAgICBpZiBzZWxmLnNo b3dpbmdfZWRpdF9saW5rOiAgIyBub3RoaW5nIHdhaXRzIGZvciB0aGUgdXNlciBvbiBhdXBob25p Yy5jb20gYW55bW9yZQogICAgICAgICAgICBzZWxmLnNob3dpbmdfZWRpdF9saW5rID0gRmFsc2UK ICAgICAgICAgICAgc2VsZi52aWV3LnNldF9wcm9kdWN0aW9uX2xpbmsoc2VsZi5wcm9kdWN0aW9u X3VybCkKICAgICAgICBzZWxmLnZpZXcuc2V0X3J1bm5pbmcoRmFsc2UpCiAgICAgICAgIyBSZS1h cHBseSB0aGUgaW5wdXRzJyBvd24gZW5hYmxlZCBzdGF0ZXMuCiAgICAgICAgc2VsZi5fZmlsbF9w cmVzZXRzKCkKICAgICAgICBmb2xsb3dpbmcsIHNlbGYuZm9sbG93aW5nID0gc2VsZi5mb2xsb3dp bmcsIEZhbHNlCiAgICAgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lIGFuZCBlcnJvciBpcyBOb25l IGFuZCBub3QgY2FuY2VsbGVkOgogICAgICAgICAgICBzZWxmLl9pbnNlcnQocmVzdWx0LCBwcm9k dWN0aW9uX3V1aWQsIGZvbGxvd2luZykKICAgICAgICAgICAgc2VsZi5vbl9wcm9kdWN0aW9uX2Rv bmUoKQogICAgICAgICMgUmVuZGVyaW5nIGFuZCBpbnNlcnRpbmcgY2hhbmdlIHRoZSBpbi9vdXQg cG9pbnRzOyBwdXQgdGhlIHVzZXIncyBiYWNrLCB0aGVuCiAgICAgICAgIyBwaWNrIHVwIHRoZSBy ZXN0b3JlZCB0aW1lbGluZS4KICAgICAgICByZXN0b3JlX21hcmtfaW5fb3V0KHNlbGYucmVzb2x2 ZSwgc2VsZi5zYXZlZF9tYXJrcykKICAgICAgICBzZWxmLnNhdmVkX21hcmtzID0gTm9uZQogICAg ICAgIHNlbGYucmVmcmVzaF90aW1lbGluZSgpCiAgICAgICAgc2VsZi52aWV3LnNob3dfZWRpdF9h Z2FpbihzZWxmLmxhc3RfcnVuIGlzIG5vdCBOb25lKQogICAgICAgIGJhY2ssIHNlbGYuYmFja190 b19zZXR0aW5ncyA9IHNlbGYuYmFja190b19zZXR0aW5ncywgRmFsc2UKICAgICAgICBpZiBjYW5j ZWxsZWQgYW5kIGJhY2s6CiAgICAgICAgICAgIHNlbGYudmlldy5zaG93X3NldHVwKCkKICAgICAg ICBlbGlmIGNhbmNlbGxlZCBhbmQgZm9sbG93aW5nOgogICAgICAgICAgICBzZWxmLnZpZXcuc2hv d19yZXN1bHQoCiAgICAgICAgICAgICAgICBJTkZPLAogICAgICAgICAgICAgICAgIlN0b3BwZWQg d2FpdGluZyIsCiAgICAgICAgICAgICAgICB0ZXh0PSJUaGUgcHJvZHVjdGlvbiBzdGF5cyBvbiBB dXBob25pYyBhcyBpdCBpczsgdGhlIHRpbWVsaW5lIHdhc24ndCBjaGFuZ2VkLiIsCiAgICAgICAg ICAgICkKICAgICAgICBlbGlmIGNhbmNlbGxlZDoKICAgICAgICAgICAgaWYgcHJvZHVjdGlvbl91 dWlkOgogICAgICAgICAgICAgICAgc2VsZi5jYW5jZWxsZWRfcHJvZHVjdGlvbiA9IHByb2R1Y3Rp b25fdXVpZAogICAgICAgICAgICAgICAgc2VsZi52aWV3LnNob3dfcmVzdWx0KAogICAgICAgICAg ICAgICAgICAgICJub3RpY2UiLAogICAgICAgICAgICAgICAgICAgICJDYW5jZWxsZWQiLAogICAg ICAgICAgICAgICAgICAgIHRleHQ9IlRoZSBwcm9kdWN0aW9uIHdhcyBhbHJlYWR5IGNyZWF0ZWQg b24gQXVwaG9uaWMuICIKICAgICAgICAgICAgICAgICAgICAiS2VlcCBpdCB0aGVyZSwgb3IgZGVs ZXRlIGl0PyIsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBzZWxmLnZpZXcuc2hv d19rZWVwX29yX2RlbGV0ZShUcnVlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAg c2VsZi52aWV3LnNob3dfcmVzdWx0KElORk8sICJDYW5jZWxsZWQiLCB0ZXh0PSJZb3VyIHRyYWNr cyB3ZXJlIHJlc3RvcmVkLiIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGVycm9yLCBBdXRoRXJy b3IpOgogICAgICAgICAgICBzZWxmLm9uX2F1dGhfZXJyb3IoZXJyb3IpCiAgICAgICAgZWxpZiBl cnJvciBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlcnJvciwgKFJlbmRl ckVycm9yLCBBcGlFcnJvcikpOgogICAgICAgICAgICAgICAgc2VsZi52aWV3LnNob3dfcmVzdWx0 KCJlcnJvciIsICJQcm9jZXNzaW5nIGZhaWxlZCIsIHRleHQ9c3RyKGVycm9yKSkKICAgICAgICAg ICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVGhlIHByb2R1Y3Rpb24gZmFpbGVk LiIsIGVycm9yKQogICAgICAgICAgICAgICAgc2VsZi52aWV3LnNob3dfcmVzdWx0KAogICAgICAg ICAgICAgICAgICAgICJlcnJvciIsCiAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3NpbmcgZmFp bGVkIiwKICAgICAgICAgICAgICAgICAgICB0ZXh0PWxpbmtzLlVORVhQRUNURURfRVJST1IsCiAg ICAgICAgICAgICAgICApCgogICAgZGVmIF9pbnNlcnQoc2VsZiwgcmVzdWx0OiBQaXBlbGluZVJl c3VsdCwgcHJvZHVjdGlvbl91dWlkOiBzdHIsIGZvbGxvd2luZzogYm9vbCkgLT4gTm9uZToKICAg ICAgICAiIiJQdXQgdGhlIHByb2Nlc3NlZCBhdWRpbyBvbiB0aGUgdGltZWxpbmUgYW5kIHRlbGwg dGhlIHVzZXIgd2hhdCBjaGFuZ2VkLgoKICAgICAgICBBZnRlciBFZGl0IEFnYWluLCB0aGUgbmV3 IHJlc3VsdCByZXBsYWNlcyB0aGUgcHJldmlvdXMgb25lOiBpdCdzIGluc2VydGVkIGZpcnN0CiAg ICAgICAgKHNvIG5vdGhpbmcgaXMgbG9zdCBpZiB0aGF0IGZhaWxzKSwgdGhlbiB0aGUgcHJldmlv dXMgdHJhY2sgaXMgcmVtb3ZlZCBpZiB0aGUKICAgICAgICB1c2VyIGRpZG4ndCBjaGFuZ2UgaXQu CiAgICAgICAgIiIiCiAgICAgICAgcmVxdWVzdCwgc2VsZi5pbnNlcnRfcmVxdWVzdCA9IHNlbGYu aW5zZXJ0X3JlcXVlc3QsIE5vbmUKICAgICAgICBpZiByZXF1ZXN0IGlzIE5vbmU6CiAgICAgICAg ICAgIHJldHVybgogICAgICAgIHByZXZpb3VzID0gc2VsZi5sYXN0X3J1bgogICAgICAgIHNlbGYu b3V0cHV0X2ZpbGUgPSByZXN1bHQub3V0cHV0CiAgICAgICAgc2VsZi52aWV3LnNob3dfZmlsZV9i dXR0b24oVHJ1ZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGluc2VydGVkID0gaW5zZXJ0X3By b2Nlc3NlZF9hdWRpbyhzZWxmLnJlc29sdmUsIHJlc3VsdC5vdXRwdXQsIHJlcXVlc3QpCiAgICAg ICAgZXhjZXB0IEluc2VydEVycm9yIGFzIGV4YzoKICAgICAgICAgICAgc2VsZi52aWV3LnNob3df cmVzdWx0KAogICAgICAgICAgICAgICAgImVycm9yIiwKICAgICAgICAgICAgICAgICJDb3VsZG4n dCBhZGQgaXQgdG8gdGhlIHRpbWVsaW5lIiwKICAgICAgICAgICAgICAgIHJvd3M9WygiRmlsZSIs IHJlc3VsdC5vdXRwdXQubmFtZSldLAogICAgICAgICAgICAgICAgdGV4dD1mIntleGN9IFRoZSBw cm9jZXNzZWQgYXVkaW8gaXMgc2F2ZWQsIHNvIHlvdSBjYW4gaW1wb3J0IGl0IHlvdXJzZWxmICIK ICAgICAgICAgICAgICAgICIoU2hvdyBGaWxlKS4iLAogICAgICAgICAgICApCiAgICAgICAgICAg IHJldHVybgogICAgICAgIHJlcGxhY2VkID0gTm9uZQogICAgICAgIGlmIGZvbGxvd2luZyBhbmQg cHJldmlvdXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJlcGxhY2VkID0gcmVtb3ZlX3ByZXZp b3VzX3Jlc3VsdChzZWxmLnJlc29sdmUsIHByZXZpb3VzLmluc2VydGVkKQogICAgICAgICAgICBp ZiByZXBsYWNlZCBpcyBub3QgTm9uZSBhbmQgcmVwbGFjZWQgPCBpbnNlcnRlZC50cmFja19pbmRl eDoKICAgICAgICAgICAgICAgIGluc2VydGVkLnRyYWNrX2luZGV4IC09IDEKICAgICAgICBpZiBz ZWxmLnJlcXVlc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYubGFzdF9ydW4gPSBMYXN0 UnVuKAogICAgICAgICAgICAgICAgc2VsZi5yZXF1ZXN0LAogICAgICAgICAgICAgICAgcmVxdWVz dCwKICAgICAgICAgICAgICAgIHByb2R1Y3Rpb25fdXVpZCwKICAgICAgICAgICAgICAgIGluc2Vy dGVkLAogICAgICAgICAgICAgICAgcHJldmlvdXMucnVuX2RldGFpbHMgaWYgZm9sbG93aW5nIGFu ZCBwcmV2aW91cyBlbHNlIHNlbGYucnVuX2RldGFpbHMsCiAgICAgICAgICAgICkKICAgICAgICB0 cmFjayA9IGYiQXtpbnNlcnRlZC50cmFja19pbmRleH0g4oCTIHtpbnNlcnRlZC50cmFja19uYW1l fSIKICAgICAgICByb3dzID0gWygiVHJhY2siLCB0cmFjayldCiAgICAgICAgaWYgaW5zZXJ0ZWQu ZGlzYWJsZWQ6CiAgICAgICAgICAgIHJvd3MuYXBwZW5kKCgiRGlzYWJsZWQiLCBpbnNlcnRlZC5k aXNhYmxlZFswXS51cHBlcigpICsgaW5zZXJ0ZWQuZGlzYWJsZWRbMTpdKSkKICAgICAgICByb3dz LmFwcGVuZCgoIkZpbGUiLCByZXN1bHQub3V0cHV0Lm5hbWUpKQogICAgICAgIG5vdGVzID0gbGlz dChpbnNlcnRlZC53YXJuaW5ncykKICAgICAgICBpZiBmb2xsb3dpbmcgYW5kIHJlcGxhY2VkIGlz IE5vbmU6CiAgICAgICAgICAgIG5vdGVzLmluc2VydCgKICAgICAgICAgICAgICAgIDAsCiAgICAg ICAgICAgICAgICAiVGhlIHByZXZpb3VzIHJlc3VsdCdzIHRyYWNrIHdhcyBjaGFuZ2VkIG9yIHJl bW92ZWQsIHNvIGl0IHdhcyBsZWZ0IGFzIGl0ICIKICAgICAgICAgICAgICAgICJpcyBhbmQgdGhl IG5ldyByZXN1bHQgaXMgb24gYSBuZXcgdHJhY2suIiwKICAgICAgICAgICAgKQogICAgICAgIGlm IGluc2VydGVkLmF0X2JvdHRvbToKICAgICAgICAgICAgbm90ZXMuYXBwZW5kKAogICAgICAgICAg ICAgICAgIlRoaXMgdmVyc2lvbiBvZiBEYVZpbmNpIFJlc29sdmUgY2FuJ3QgaW5zZXJ0IHRyYWNr cyBhdCBhIHBvc2l0aW9uLCBzbyAiCiAgICAgICAgICAgICAgICAidGhlIHRyYWNrIHdhcyBhZGRl ZCBhdCB0aGUgYm90dG9tLiIKICAgICAgICAgICAgKQogICAgICAgIGhlYWRsaW5lID0gKAogICAg ICAgICAgICAiUmVwbGFjZWQgdGhlIHByZXZpb3VzIHJlc3VsdCIgaWYgcmVwbGFjZWQgaXMgbm90 IE5vbmUgZWxzZSAoIkFkZGVkIHRvIHRoZSB0aW1lbGluZSIpCiAgICAgICAgKQogICAgICAgIGxv Zy5pbmZvKGYie2hlYWRsaW5lfToge3RyYWNrfTsgc2F2ZWQgYXMge3Jlc3VsdC5vdXRwdXR9IiAr ICIiLmpvaW4oZiIge259IiBmb3IgbiBpbiBub3RlcykpCiAgICAgICAgc2VsZi52aWV3LnNob3df cmVzdWx0KCJub3RpY2UiIGlmIG5vdGVzIGVsc2UgIm9rIiwgaGVhZGxpbmUsIHJvd3M9cm93cywg bm90ZXM9bm90ZXMpCgogICAgZGVmIG9uX3Nob3dfZmlsZShzZWxmKSAtPiBOb25lOgogICAgICAg ICIiIlNob3cgdGhlIGRvd25sb2FkZWQgcmVzdWx0IGluIEZpbmRlciwgRXhwbG9yZXIgb3IgdGhl IGZpbGUgbWFuYWdlci4iIiIKICAgICAgICBpZiBzZWxmLm91dHB1dF9maWxlIGlzIG5vdCBOb25l OgogICAgICAgICAgICBsaW5rcy5yZXZlYWxfZmlsZShzZWxmLm91dHB1dF9maWxlKQoKICAgIGRl ZiBvbl9rZWVwX3Byb2R1Y3Rpb24oc2VsZikgLT4gTm9uZToKICAgICAgICBzZWxmLmNhbmNlbGxl ZF9wcm9kdWN0aW9uID0gIiIKICAgICAgICBzZWxmLnZpZXcuc2hvd19rZWVwX29yX2RlbGV0ZShG YWxzZSkKICAgICAgICBzZWxmLnZpZXcuc2hvd19yZXN1bHQoSU5GTywgIktlcHQgb24gQXVwaG9u aWMiLCB0ZXh0PSJUaGUgcHJvZHVjdGlvbiBzdGF5cyB0aGVyZS4iKQoKICAgIGRlZiBvbl9kZWxl dGVfcHJvZHVjdGlvbihzZWxmKSAtPiBOb25lOgogICAgICAgIHV1aWQsIHNlbGYuY2FuY2VsbGVk X3Byb2R1Y3Rpb24gPSBzZWxmLmNhbmNlbGxlZF9wcm9kdWN0aW9uLCAiIgogICAgICAgIHNlbGYu dmlldy5zaG93X2tlZXBfb3JfZGVsZXRlKEZhbHNlKQogICAgICAgIGlmIG5vdCB1dWlkIG9yIHNl bGYuY2xpZW50IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYudmlldy5z aG93X3Jlc3VsdChJTkZPLCAiRGVsZXRpbmcgdGhlIHByb2R1Y3Rpb24gb24gQXVwaG9uaWPigKYi KQogICAgICAgIHNlbGYudGFza3MucnVuKCJkZWxldGUiLCBsYW1iZGE6IHNlbGYuY2xpZW50LmRl bGV0ZV9wcm9kdWN0aW9uKHV1aWQpLCBzZWxmLl9vbl9kZWxldGVkKQoKICAgIGRlZiBfb25fZGVs ZXRlZChzZWxmLCBfOiBBbnksIGVycm9yOiBCYXNlRXhjZXB0aW9uIHwgTm9uZSkgLT4gTm9uZToK ICAgICAgICBpZiBpc2luc3RhbmNlKGVycm9yLCBBdXRoRXJyb3IpOgogICAgICAgICAgICBzZWxm Lm9uX2F1dGhfZXJyb3IoZXJyb3IpCiAgICAgICAgZWxpZiBlcnJvciBpcyBub3QgTm9uZToKICAg ICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXJyb3IsIEFwaUVycm9yKToKICAgICAgICAgICAg ICAgIGxvZy5lcnJvcigiRGVsZXRpbmcgdGhlIHByb2R1Y3Rpb24gZmFpbGVkLiIsIGVycm9yKQog ICAgICAgICAgICBzZWxmLnZpZXcuc2hvd19yZXN1bHQoCiAgICAgICAgICAgICAgICAiZXJyb3Ii LAogICAgICAgICAgICAgICAgIkNvdWxkbid0IGRlbGV0ZSB0aGUgcHJvZHVjdGlvbiIsCiAgICAg ICAgICAgICAgICB0ZXh0PSJZb3UgY2FuIGRlbGV0ZSBpdCBvbiBhdXBob25pYy5jb20uIiwKICAg ICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudmlldy5zZXRfcHJvZHVj dGlvbl9saW5rKCIiKQogICAgICAgICAgICBzZWxmLnZpZXcuc2hvd19yZXN1bHQoSU5GTywgIkRl bGV0ZWQgb24gQXVwaG9uaWMiKQpQSwMEFAAAAAAAFFtqXdGQmdOOQwAAjkMAABwAAABhdXBob25p Y19yZXNvbHZlL3BpcGVsaW5lLnB5IiIiVGhlIHByb2R1Y3Rpb24gcGlwZWxpbmU6IHJlbmRlciDi hpIgQXVwaG9uaWMgKGNyZWF0ZSwgdXBsb2FkLCBwcm9jZXNzKSDihpIgZG93bmxvYWQuCgpgYFBp cGVsaW5lLnRpY2soKWBgIGlzIGNhbGxlZCBieSB0aGUgVUkgdGltZXIgb24gdGhlIFVJIHRocmVh ZC4gVGhlIHJlbmRlciBydW5zIHJpZ2h0CnRoZXJlIChSZXNvbHZlIEFQSSBjYWxscyBzdGF5IG9u IHRoZSBVSSB0aHJlYWQpLiBFdmVyeXRoaW5nIHRoYXQgdGFsa3MgdG8gQXVwaG9uaWMgcnVucwpp biBvbmUgd29ya2VyIHRocmVhZCwgd2hpY2ggb25seSB3cml0ZXMgdG8gYSBsb2NrLXByb3RlY3Rl ZCBgYF9TaGFyZWRgYCBzdGF0ZTsgYGB0aWNrKClgYApyZWFkcyBpdCBhbmQgcmVwb3J0cyBwcm9n cmVzcyB0byB0aGUgd2luZG93LgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlv bnMKCmltcG9ydCByZQppbXBvcnQgc2h1dGlsCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgdGhyZWFk aW5nCmltcG9ydCB0aW1lCmZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBDYWxsYWJsZQpmcm9t IGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MsIGZpZWxkCmZyb20gZnJhY3Rpb25zIGltcG9y dCBGcmFjdGlvbgpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKZnJvbSB0eXBpbmcgaW1wb3J0IEFu eQoKZnJvbSAuIGltcG9ydCBsb2cKZnJvbSAuYXVkaW9maWxlIGltcG9ydCBBdWRpb0ZpbGVFcnJv ciwgY2hlY2tfc2lsZW5jZSwgcmVhZF9hdWRpb19pbmZvCmZyb20gLmF1cGhvbmljX2FwaSBpbXBv cnQgU1RBVFVTX0RPTkUsIFNUQVRVU19GQUlMRUQsIFNUQVRVU19OT1RfU1RBUlRFRCwgQXBpRXJy b3IsIENhbmNlbGxlZApmcm9tIC5saW5rcyBpbXBvcnQgcHJvZHVjdGlvbl9lZGl0X3VybApmcm9t IC5yZXNvbHZlX2lvIGltcG9ydCBSZW5kZXJFcnJvciwgUmVuZGVySm9iCmZyb20gLnNlbGVjdGlv biBpbXBvcnQgQ2xpcEtleQpmcm9tIC50aW1pbmcgaW1wb3J0IENoYXB0ZXIsIEZyYW1lUmF0ZSwg UmFuZ2UKClJFTkRFUl9OQU1FID0gImF1cGhvbmljX3NvdXJjZSIKU0FNUExFX1JBVEUgPSA0ODAw MApQT0xMX0ZJUlNUX1MgPSA1LjAKUE9MTF9NQVhfUyA9IDE1LjAKV0FWX09VVFBVVCA9IHsiZm9y bWF0IjogIndhdi0yNGJpdCJ9CgojIFN0YWdlIHRleHRzIHJlcG9ydGVkIHRvIHRoZSB3aW5kb3cs IGFuZCB0aGUgc3RlcHMgdGhleSBiZWxvbmcgdG8uClJFTkRFUklORyA9ICJSZW5kZXJpbmciCkNS RUFUSU5HID0gIkNyZWF0aW5nIHRoZSBwcm9kdWN0aW9uIgpVUExPQURJTkcgPSAiVXBsb2FkaW5n IgpXQUlUSU5HID0gIldhaXRpbmcgZm9yIHlvdSB0byBzdGFydCB0aGUgcHJvZHVjdGlvbiBvbiBh dXBob25pYy5jb20iClBST0NFU1NJTkcgPSAiUHJvY2Vzc2luZyBvbiBBdXBob25pYyIKRE9XTkxP QURJTkcgPSAiRG93bmxvYWRpbmciClNURVBfUkVOREVSLCBTVEVQX0NSRUFURSwgU1RFUF9VUExP QUQsIFNURVBfRURJVCwgU1RFUF9QUk9DRVNTLCBTVEVQX0RPV05MT0FELCBTVEVQX0lOU0VSVCA9 IHJhbmdlKAogICAgNwopCl9TVEVQUyA9IHsKICAgIFJFTkRFUklORzogU1RFUF9SRU5ERVIsCiAg ICBDUkVBVElORzogU1RFUF9DUkVBVEUsCiAgICBVUExPQURJTkc6IFNURVBfVVBMT0FELAogICAg V0FJVElORzogU1RFUF9FRElULAogICAgUFJPQ0VTU0lORzogU1RFUF9QUk9DRVNTLAogICAgRE9X TkxPQURJTkc6IFNURVBfRE9XTkxPQUQsCn0KCgpkZWYgc3RlcF9vZihzdGFnZTogc3RyKSAtPiBp bnQgfCBOb25lOgogICAgIiIiVGhlIHN0ZXAgYSBzdGFnZSB0ZXh0IGJlbG9uZ3MgdG8gKCJBdXBo b25pYzog4oCmIiB0ZXh0cyBhcmUgcHJvY2Vzc2luZykuIiIiCiAgICBpZiBzdGFnZS5zdGFydHN3 aXRoKCJBdXBob25pYzogIik6CiAgICAgICAgcmV0dXJuIFNURVBfUFJPQ0VTUwogICAgcmV0dXJu IF9TVEVQUy5nZXQoc3RhZ2UpCgoKY2xhc3MgUHJvZHVjdGlvbkZhaWxlZEVycm9yKEFwaUVycm9y KToKICAgICIiIkF1cGhvbmljIHJlcG9ydGVkIGFuIGVycm9yIHdoaWxlIHByb2Nlc3NpbmcuIiIi CgoKQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKY2xhc3MgUHJvZHVjdGlvblJlcXVlc3Q6CiAgICB0 cmFja3M6IHR1cGxlW2ludCwgLi4uXSAgIyByZW5kZXJlZCB0b2dldGhlciBhcyBhIG1peGRvd24K ICAgIGZyYW1lczogUmFuZ2UKICAgIHJhdGU6IEZyYW1lUmF0ZQogICAgdGl0bGU6IHN0cgogICAg cHJlc2V0X3V1aWQ6IHN0cgogICAgY2hhcHRlcnM6IHR1cGxlW0NoYXB0ZXIsIC4uLl0KICAgIGRv d25sb2FkX2RpcjogUGF0aAogICAgc2lsZW5jZTogdHVwbGVbQ2xpcEtleSwgLi4uXSA9ICgpICAj IGNsaXBzIHN3aXRjaGVkIG9mZiBmb3IgdGhlIHJlbmRlcgogICAgc291bmQ6IHR1cGxlW0NsaXBL ZXksIC4uLl0gPSAoKSAgIyBjbGlwcyBzd2l0Y2hlZCBvbiBmb3IgdGhlIHJlbmRlcgogICAgIyBE b24ndCBzdGFydCB0aGUgcHJvZHVjdGlvbjogb3BlbiBpdCBvbiBhdXBob25pYy5jb20sIHdoZXJl IHRoZSB1c2VyIGNoYW5nZXMKICAgICMgaXRzIHNldHRpbmdzIGFuZCBzdGFydHMgaXQ7IHRoZW4g Y29udGludWUgYXMgdXN1YWwuCiAgICBlZGl0X2ZpcnN0OiBib29sID0gRmFsc2UKCgpAZGF0YWNs YXNzKGZyb3plbj1UcnVlKQpjbGFzcyBQaXBlbGluZVJlc3VsdDoKICAgIG91dHB1dDogUGF0aCAg IyB0aGUgZG93bmxvYWRlZCwgcHJvY2Vzc2VkIGF1ZGlvCiAgICBwcm9kdWN0aW9uX3VybDogc3Ry CiAgICBsZW5ndGhfY2hlY2s6IHN0ciA9ICIiICAjIHJlbmRlcmVkIHZzLiBleHBlY3RlZCBsZW5n dGgsIGZvciB2ZXJpZnlpbmcgc3luYwoKClByb2dyZXNzQ2FsbGJhY2sgPSBDYWxsYWJsZVtbc3Ry LCBmbG9hdCB8IE5vbmVdLCBOb25lXQpMaW5rQ2FsbGJhY2sgPSBDYWxsYWJsZVtbc3RyXSwgTm9u ZV0KIyByZXN1bHQsIGVycm9yLCBjYW5jZWxsZWQsIHV1aWQgb2YgYSBwcm9kdWN0aW9uIHRoYXQg ZXhpc3RzIG9uIEF1cGhvbmljIChvciAiIikKRmluaXNoZWRDYWxsYmFjayA9IENhbGxhYmxlW1tQ aXBlbGluZVJlc3VsdCB8IE5vbmUsIEJhc2VFeGNlcHRpb24gfCBOb25lLCBib29sLCBzdHJdLCBO b25lXQoKCmRlZiBleHBlY3RlZF9zYW1wbGVzKGZyYW1lczogUmFuZ2UsIHJhdGU6IEZyYW1lUmF0 ZSkgLT4gaW50OgogICAgcmV0dXJuIHJvdW5kKEZyYWN0aW9uKGZyYW1lcy5mcmFtZXMpIC8gcmF0 ZS5mcHMgKiBTQU1QTEVfUkFURSkKCgpkZWYgc2FmZV9maWxlbmFtZShuYW1lOiBzdHIsIGZhbGxi YWNrOiBzdHIgPSAiQXVwaG9uaWMiKSAtPiBzdHI6CiAgICAiIiJBIGZpbGUgb3IgZm9sZGVyIG5h bWUgdGhhdCB3b3JrcyBvbiBXaW5kb3dzLCBtYWNPUyBhbmQgTGludXggKGtlZXBzIFVuaWNvZGUp LiIiIgogICAgY2xlYW5lZCA9IHJlLnN1YihyJ1s8PjoiL1xcfD8qXHgwMC1ceDFmXScsICJfIiwg bmFtZSkuc3RyaXAoKS5yc3RyaXAoIi4gIikKICAgIHJldHVybiBjbGVhbmVkWzoxMDBdLnN0cmlw KCkgb3IgZmFsbGJhY2sKCgpkZWYgZG93bmxvYWRfcGF0aChkb3dubG9hZF9kaXI6IFBhdGgsIHRp dGxlOiBzdHIsIG5vdzogZmxvYXQgfCBOb25lID0gTm9uZSkgLT4gUGF0aDoKICAgIHN0YW1wID0g dGltZS5zdHJmdGltZSgiJVklbSVkLSVIJU0lUyIsIHRpbWUubG9jYWx0aW1lKG5vdykpCiAgICBw YXRoID0gZG93bmxvYWRfZGlyIC8gZiJ7c2FmZV9maWxlbmFtZSh0aXRsZSl9X3tzdGFtcH0ud2F2 IgogICAgY291bnRlciA9IDIKICAgIHdoaWxlIHBhdGguZXhpc3RzKCk6CiAgICAgICAgcGF0aCA9 IGRvd25sb2FkX2RpciAvIGYie3NhZmVfZmlsZW5hbWUodGl0bGUpfV97c3RhbXB9X3tjb3VudGVy fS53YXYiCiAgICAgICAgY291bnRlciArPSAxCiAgICByZXR1cm4gcGF0aAoKCmRlZiBkZWZhdWx0 X2Rvd25sb2FkX2Rpcihwcm9qZWN0X25hbWU6IHN0cikgLT4gUGF0aDoKICAgICIiImBgfi9Eb2N1 bWVudHMvQXVwaG9uaWMvPHByb2plY3Q+L2BgIChkZWNpZGVkIDIwMjYtMTAtMDcpLiIiIgogICAg Zm9sZGVyID0gc2FmZV9maWxlbmFtZShwcm9qZWN0X25hbWUsICJEYVZpbmNpIFJlc29sdmUiKQog ICAgcmV0dXJuIFBhdGguaG9tZSgpIC8gIkRvY3VtZW50cyIgLyAiQXVwaG9uaWMiIC8gZm9sZGVy CgoKQGRhdGFjbGFzcwpjbGFzcyBfU2hhcmVkOgogICAgIiIiU3RhdGUgd3JpdHRlbiBieSB0aGUg d29ya2VyIHRocmVhZCBhbmQgcmVhZCBieSBgYHRpY2soKWBgLiBHdWFyZCB3aXRoIGBgbG9ja2Bg LiIiIgoKICAgIGxvY2s6IHRocmVhZGluZy5Mb2NrID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PXRo cmVhZGluZy5Mb2NrKQogICAgc3RhZ2U6IHN0ciA9ICIiCiAgICBmcmFjdGlvbjogZmxvYXQgfCBO b25lID0gTm9uZQogICAgcHJvZHVjdGlvbl91dWlkOiBzdHIgPSAiIgogICAgcHJvZHVjdGlvbl91 cmw6IHN0ciA9ICIiCiAgICBlZGl0X3VybDogc3RyID0gIiIKICAgIG91dHB1dDogUGF0aCB8IE5v bmUgPSBOb25lCiAgICBlcnJvcjogQmFzZUV4Y2VwdGlvbiB8IE5vbmUgPSBOb25lCiAgICBkb25l OiBib29sID0gRmFsc2UKCgpkZWYgX3N0YXJ0X3RocmVhZCh0YXJnZXQ6IENhbGxhYmxlW1tdLCBO b25lXSkgLT4gTm9uZToKICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXRhcmdldCwgbmFtZT0i YXVwaG9uaWMtcHJvZHVjdGlvbiIsIGRhZW1vbj1UcnVlKS5zdGFydCgpCgoKZGVmIF93YWl0KGV2 ZW50OiB0aHJlYWRpbmcuRXZlbnQsIHNlY29uZHM6IGZsb2F0KSAtPiBib29sOgogICAgcmV0dXJu IGV2ZW50LndhaXQoc2Vjb25kcykKCgpjbGFzcyBQaXBlbGluZToKICAgIGRlZiBfX2luaXRfXygK ICAgICAgICBzZWxmLAogICAgICAgIHJlcXVlc3Q6IFByb2R1Y3Rpb25SZXF1ZXN0LAogICAgICAg ICosCiAgICAgICAgcmVzb2x2ZTogQW55LAogICAgICAgIGNsaWVudDogQW55LAogICAgICAgIG9u X3Byb2dyZXNzOiBQcm9ncmVzc0NhbGxiYWNrLAogICAgICAgIG9uX2xpbms6IExpbmtDYWxsYmFj aywKICAgICAgICBvbl9maW5pc2hlZDogRmluaXNoZWRDYWxsYmFjaywKICAgICAgICBvbl9lZGl0 OiBMaW5rQ2FsbGJhY2sgfCBOb25lID0gTm9uZSwKICAgICAgICBvbl9zaWxlbnQ6IENhbGxhYmxl W1tdLCBOb25lXSB8IE5vbmUgPSBOb25lLAogICAgICAgIGZvbGxvd191dWlkOiBzdHIgPSAiIiwK ICAgICAgICB0ZW1wX3Jvb3Q6IFBhdGggfCBOb25lID0gTm9uZSwKICAgICAgICBzdGFydF90aHJl YWQ6IENhbGxhYmxlW1tDYWxsYWJsZVtbXSwgTm9uZV1dLCBOb25lXSA9IF9zdGFydF90aHJlYWQs CiAgICAgICAgd2FpdDogQ2FsbGFibGVbW3RocmVhZGluZy5FdmVudCwgZmxvYXRdLCBib29sXSA9 IF93YWl0LAogICAgKSAtPiBOb25lOgogICAgICAgIHNlbGYucmVxdWVzdCA9IHJlcXVlc3QKICAg ICAgICBzZWxmLnJlc29sdmUgPSByZXNvbHZlCiAgICAgICAgc2VsZi5jbGllbnQgPSBjbGllbnQK ICAgICAgICBzZWxmLm9uX3Byb2dyZXNzID0gb25fcHJvZ3Jlc3MKICAgICAgICBzZWxmLm9uX2xp bmsgPSBvbl9saW5rCiAgICAgICAgc2VsZi5vbl9maW5pc2hlZCA9IG9uX2ZpbmlzaGVkCiAgICAg ICAgc2VsZi5vbl9lZGl0ID0gb25fZWRpdAogICAgICAgICMgVGhlIHJlbmRlciBpcyBjb21wbGV0 ZSBzaWxlbmNlOiB3YWl0IGZvciBjb250aW51ZV9hZnRlcl9zaWxlbmNlKCkgb3IgY2FuY2VsKCku CiAgICAgICAgc2VsZi5vbl9zaWxlbnQgPSBvbl9zaWxlbnQKICAgICAgICBzZWxmLndhaXRpbmdf Zm9yX2Fuc3dlciA9IEZhbHNlCiAgICAgICAgIyBFZGl0IEFnYWluOiBubyByZW5kZXI7IGZvbGxv dyB0aGlzIGZpbmlzaGVkIHByb2R1Y3Rpb24gd2hpbGUgdGhlIHVzZXIgZWRpdHMKICAgICAgICAj IGFuZCByZXN0YXJ0cyBpdCBvbiBhdXBob25pYy5jb20sIHRoZW4gZG93bmxvYWQgdGhlIG5ldyBy ZXN1bHQuCiAgICAgICAgc2VsZi5mb2xsb3dfdXVpZCA9IGZvbGxvd191dWlkCiAgICAgICAgc2Vs Zi50ZW1wX3Jvb3QgPSB0ZW1wX3Jvb3QKICAgICAgICBzZWxmLnN0YXJ0X3RocmVhZCA9IHN0YXJ0 X3RocmVhZAogICAgICAgIHNlbGYud2FpdCA9IHdhaXQKICAgICAgICBzZWxmLnRlbXBfZGlyOiBQ YXRoIHwgTm9uZSA9IE5vbmUKICAgICAgICBzZWxmLnJlbmRlcjogUmVuZGVySm9iIHwgTm9uZSA9 IE5vbmUKICAgICAgICBzZWxmLnJlbmRlcmVkOiBQYXRoIHwgTm9uZSA9IE5vbmUKICAgICAgICBz ZWxmLmxlbmd0aF9jaGVjayA9ICIiCiAgICAgICAgc2VsZi5jYW5jZWxfZXZlbnQgPSB0aHJlYWRp bmcuRXZlbnQoKQogICAgICAgIHNlbGYuc2hhcmVkID0gX1NoYXJlZCgpCiAgICAgICAgc2VsZi53 b3JrZXJfc3RhcnRlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5saW5rX3Nob3duID0gRmFsc2UKICAg ICAgICBzZWxmLmVkaXRfc2hvd24gPSBGYWxzZQogICAgICAgIHNlbGYuZmluaXNoZWQgPSBGYWxz ZQoKICAgICMgLS0gbGlmZWN5Y2xlIChVSSB0aHJlYWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBkZWYgc3RhcnQoc2VsZikgLT4g Tm9uZToKICAgICAgICBpZiBzZWxmLmZvbGxvd191dWlkOgogICAgICAgICAgICBzZWxmLndvcmtl cl9zdGFydGVkID0gVHJ1ZQogICAgICAgICAgICBzZWxmLm9uX3Byb2dyZXNzKFdBSVRJTkcsIE5v bmUpCiAgICAgICAgICAgIHNlbGYuc3RhcnRfdGhyZWFkKHNlbGYuX3dvcmspCiAgICAgICAgICAg IHJldHVybgogICAgICAgIHNlbGYudGVtcF9kaXIgPSBQYXRoKHRlbXBmaWxlLm1rZHRlbXAocHJl Zml4PSJhdXBob25pYy1yZXNvbHZlLSIsIGRpcj1zZWxmLnRlbXBfcm9vdCkpCiAgICAgICAgc2Vs Zi5yZW5kZXIgPSBSZW5kZXJKb2IoCiAgICAgICAgICAgIHNlbGYucmVzb2x2ZSwKICAgICAgICAg ICAgc2VsZi5yZXF1ZXN0LnRyYWNrcywKICAgICAgICAgICAgc2VsZi5yZXF1ZXN0LmZyYW1lcywK ICAgICAgICAgICAgc2VsZi50ZW1wX2RpciwKICAgICAgICAgICAgUkVOREVSX05BTUUsCiAgICAg ICAgICAgIHNpbGVuY2U9c2VsZi5yZXF1ZXN0LnNpbGVuY2UsCiAgICAgICAgICAgIHNvdW5kPXNl bGYucmVxdWVzdC5zb3VuZCwKICAgICAgICApCiAgICAgICAgIyBSZXNvbHZlIGRpZG4ndCByZXBv cnQgdXNhYmxlIGludGVybWVkaWF0ZSBwZXJjZW50YWdlcywgc28gbm8gcHJvZ3Jlc3MgYmFyLgog ICAgICAgIHNlbGYub25fcHJvZ3Jlc3MoUkVOREVSSU5HLCBOb25lKQogICAgICAgIHRyeToKICAg ICAgICAgICAgc2VsZi5yZW5kZXIuc3RhcnQoKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMg ZXhjOgogICAgICAgICAgICBzZWxmLl9maW5pc2goTm9uZSwgZXhjKQoKICAgIGRlZiB0aWNrKHNl bGYpIC0+IE5vbmU6CiAgICAgICAgaWYgc2VsZi5maW5pc2hlZCBvciBzZWxmLndhaXRpbmdfZm9y X2Fuc3dlcjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgbm90IHNlbGYud29ya2VyX3N0 YXJ0ZWQ6CiAgICAgICAgICAgIHNlbGYuX3RpY2tfcmVuZGVyKCkKICAgICAgICAgICAgcmV0dXJu CiAgICAgICAgd2l0aCBzZWxmLnNoYXJlZC5sb2NrOgogICAgICAgICAgICBzdGFnZSwgZnJhY3Rp b24gPSBzZWxmLnNoYXJlZC5zdGFnZSwgc2VsZi5zaGFyZWQuZnJhY3Rpb24KICAgICAgICAgICAg dXJsID0gc2VsZi5zaGFyZWQucHJvZHVjdGlvbl91cmwKICAgICAgICAgICAgZWRpdF91cmwgPSBz ZWxmLnNoYXJlZC5lZGl0X3VybAogICAgICAgICAgICBkb25lLCBlcnJvciwgb3V0cHV0ID0gc2Vs Zi5zaGFyZWQuZG9uZSwgc2VsZi5zaGFyZWQuZXJyb3IsIHNlbGYuc2hhcmVkLm91dHB1dAogICAg ICAgIGlmIHVybCBhbmQgbm90IHNlbGYubGlua19zaG93bjoKICAgICAgICAgICAgc2VsZi5saW5r X3Nob3duID0gVHJ1ZQogICAgICAgICAgICBzZWxmLm9uX2xpbmsodXJsKQogICAgICAgIGlmIGVk aXRfdXJsIGFuZCBub3Qgc2VsZi5lZGl0X3Nob3duOgogICAgICAgICAgICBzZWxmLmVkaXRfc2hv d24gPSBUcnVlCiAgICAgICAgICAgIGlmIHNlbGYub25fZWRpdCBpcyBub3QgTm9uZToKICAgICAg ICAgICAgICAgIHNlbGYub25fZWRpdChlZGl0X3VybCkKICAgICAgICBpZiBkb25lOgogICAgICAg ICAgICBpZiBvdXRwdXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLl9maW5pc2go UGlwZWxpbmVSZXN1bHQob3V0cHV0LCB1cmwsIHNlbGYubGVuZ3RoX2NoZWNrKSwgTm9uZSkKICAg ICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2ZpbmlzaChOb25lLCBlcnJvcikK ICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5vbl9wcm9ncmVzcyhzdGFnZSwgZnJhY3Rp b24pCgogICAgZGVmIGNhbmNlbChzZWxmKSAtPiBOb25lOgogICAgICAgICIiIlN0b3AgYXMgc29v biBhcyBwb3NzaWJsZTsgdGhlIHdvcmtlciBub3RpY2VzIGF0IGl0cyBuZXh0IGNoZWNrLiIiIgog ICAgICAgIGlmIHNlbGYuZmluaXNoZWQ6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYu Y2FuY2VsX2V2ZW50LnNldCgpCiAgICAgICAgaWYgbm90IHNlbGYud29ya2VyX3N0YXJ0ZWQ6CiAg ICAgICAgICAgIGlmIHNlbGYucmVuZGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2Vs Zi5yZW5kZXIuY2FuY2VsKCkKICAgICAgICAgICAgc2VsZi5fZmluaXNoKE5vbmUsIENhbmNlbGxl ZCgpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByb2R1Y3Rpb25fdXVpZChzZWxmKSAtPiBzdHI6 CiAgICAgICAgd2l0aCBzZWxmLnNoYXJlZC5sb2NrOgogICAgICAgICAgICByZXR1cm4gc2VsZi5z aGFyZWQucHJvZHVjdGlvbl91dWlkCgogICAgIyAtLSByZW5kZXIgKFVJIHRocmVhZCkgLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAg IGRlZiBfdGlja19yZW5kZXIoc2VsZikgLT4gTm9uZToKICAgICAgICBhc3NlcnQgc2VsZi5yZW5k ZXIgaXMgbm90IE5vbmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHByb2dyZXNzID0gc2VsZi5y ZW5kZXIucG9sbCgpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAg IHNlbGYuX2ZpbmlzaChOb25lLCBleGMpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIHBy b2dyZXNzIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBvdXRwdXQgPSBz ZWxmLnJlbmRlci5maW5kX291dHB1dCgpCiAgICAgICAgc2VsZi5yZW5kZXIuY2xlYW51cCgpCiAg ICAgICAgaWYgb3V0cHV0IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuX2ZpbmlzaChOb25lLCBS ZW5kZXJFcnJvcigiRGFWaW5jaSBSZXNvbHZlIGRpZG4ndCB3cml0ZSB0aGUgcmVuZGVyZWQgYXVk aW8gZmlsZS4iKSkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5yZW5kZXJlZCA9IG91 dHB1dAogICAgICAgIHNlbGYuX2NoZWNrX2xlbmd0aChvdXRwdXQpCiAgICAgICAgaWYgc2VsZi5v bl9zaWxlbnQgaXMgbm90IE5vbmUgYW5kIHNlbGYuX3NpbGVudChvdXRwdXQpOgogICAgICAgICAg ICAjIFVwbG9hZGluZyBzaWxlbmNlIHdvdWxkIG9ubHkgZmFpbCBvbiBBdXBob25pYyAob3Igd2Fz dGUgY3JlZGl0cyk6IGFzay4KICAgICAgICAgICAgbG9nLndhcm5pbmcoIlRoZSByZW5kZXJlZCBh dWRpbyBpcyBjb21wbGV0ZSBzaWxlbmNlLiIpCiAgICAgICAgICAgIHNlbGYud2FpdGluZ19mb3Jf YW5zd2VyID0gVHJ1ZQogICAgICAgICAgICBzZWxmLm9uX3NpbGVudCgpCiAgICAgICAgICAgIHJl dHVybgogICAgICAgIHNlbGYuX3N0YXJ0X2F1cGhvbmljKCkKCiAgICBkZWYgY29udGludWVfYWZ0 ZXJfc2lsZW5jZShzZWxmKSAtPiBOb25lOgogICAgICAgICIiIlRoZSB1c2VyIHdhbnRzIHRoZSBz aWxlbnQgcmVuZGVyIHByb2Nlc3NlZCBhbnl3YXkuIiIiCiAgICAgICAgaWYgc2VsZi53YWl0aW5n X2Zvcl9hbnN3ZXIgYW5kIG5vdCBzZWxmLmZpbmlzaGVkOgogICAgICAgICAgICBzZWxmLndhaXRp bmdfZm9yX2Fuc3dlciA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuX3N0YXJ0X2F1cGhvbmljKCkK CiAgICBkZWYgX3N0YXJ0X2F1cGhvbmljKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgc2VsZi53b3Jr ZXJfc3RhcnRlZCA9IFRydWUKICAgICAgICBzZWxmLm9uX3Byb2dyZXNzKENSRUFUSU5HLCBOb25l KQogICAgICAgIHNlbGYuc3RhcnRfdGhyZWFkKHNlbGYuX3dvcmspCgogICAgZGVmIF9zaWxlbnQo c2VsZiwgcGF0aDogUGF0aCkgLT4gYm9vbDoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNpbGVu dCwgd2h5ID0gY2hlY2tfc2lsZW5jZShwYXRoKQogICAgICAgIGV4Y2VwdCAoQXVkaW9GaWxlRXJy b3IsIE9TRXJyb3IpIGFzIGV4YzoKICAgICAgICAgICAgbG9nLmluZm8oZiJzaWxlbmNlIGNoZWNr OiB7cGF0aC5uYW1lfSBub3QgcmVhZGFibGUgKHtleGN9KSIpCiAgICAgICAgICAgIHJldHVybiBG YWxzZQogICAgICAgIHZlcmRpY3QgPSB7VHJ1ZTogInNpbGVudCIsIEZhbHNlOiAibm90IHNpbGVu dCIsIE5vbmU6ICJjYW4ndCB0ZWxsIn1bc2lsZW50XQogICAgICAgIGxvZy5pbmZvKGYic2lsZW5j ZSBjaGVjazoge3ZlcmRpY3R9ICh7cGF0aC5uYW1lfToge3doeX0pIikKICAgICAgICByZXR1cm4g c2lsZW50IGlzIFRydWUKCiAgICBkZWYgX2NoZWNrX2xlbmd0aChzZWxmLCBwYXRoOiBQYXRoKSAt PiBOb25lOgogICAgICAgIGV4cGVjdGVkID0gZXhwZWN0ZWRfc2FtcGxlcyhzZWxmLnJlcXVlc3Qu ZnJhbWVzLCBzZWxmLnJlcXVlc3QucmF0ZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGluZm8g PSByZWFkX2F1ZGlvX2luZm8ocGF0aCkKICAgICAgICBleGNlcHQgKEF1ZGlvRmlsZUVycm9yLCBP U0Vycm9yKSBhcyBleGM6CiAgICAgICAgICAgIGxvZy5kZWJ1ZyhmInJlbmRlcmVkIGZpbGUgbm90 IHJlYWRhYmxlICh7ZXhjfSk7IGxlbmd0aCBub3QgY2hlY2tlZCIpCiAgICAgICAgICAgIHJldHVy bgogICAgICAgIGRpZmZlcmVuY2UgPSBpbmZvLmZyYW1lcyAtIGV4cGVjdGVkCiAgICAgICAgZnJh bWVfc2FtcGxlcyA9IFNBTVBMRV9SQVRFIC8gZmxvYXQoc2VsZi5yZXF1ZXN0LnJhdGUuZnBzKQog ICAgICAgIHNlbGYubGVuZ3RoX2NoZWNrID0gKAogICAgICAgICAgICBmImV4cGVjdGVkIHtleHBl Y3RlZH0gc2FtcGxlcywgZ290IHtpbmZvLmZyYW1lc30gIgogICAgICAgICAgICBmIih7ZGlmZmVy ZW5jZTorZH0gc2FtcGxlcywge2RpZmZlcmVuY2UgLyBmcmFtZV9zYW1wbGVzOisuMmZ9IGZyYW1l cykiCiAgICAgICAgKQogICAgICAgIGxvZy5pbmZvKGYicmVuZGVyZWQge2luZm8uZGVzY3JpYmUo KX07IHtzZWxmLmxlbmd0aF9jaGVja30iKQogICAgICAgIGlmIGFicyhkaWZmZXJlbmNlKSA+IGZy YW1lX3NhbXBsZXMgLyAyOgogICAgICAgICAgICBsb2cud2FybmluZygKICAgICAgICAgICAgICAg ICJUaGUgcmVuZGVyZWQgbGVuZ3RoIGRpZmZlcnMgZnJvbSB0aGUgc2VsZWN0aW9uIGJ5ICIKICAg ICAgICAgICAgICAgIGYie2RpZmZlcmVuY2UgLyBmcmFtZV9zYW1wbGVzOisuMmZ9IGZyYW1lcy4i CiAgICAgICAgICAgICkKCiAgICAjIC0tIEF1cGhvbmljICh3b3JrZXIgdGhyZWFkKSAtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZGVmIF9z ZXQoc2VsZiwgKip2YWx1ZXM6IEFueSkgLT4gTm9uZToKICAgICAgICB3aXRoIHNlbGYuc2hhcmVk LmxvY2s6CiAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHZhbHVlcy5pdGVtcygpOgogICAg ICAgICAgICAgICAgc2V0YXR0cihzZWxmLnNoYXJlZCwga2V5LCB2YWx1ZSkKCiAgICBkZWYgX2No ZWNrX2NhbmNlbChzZWxmKSAtPiBOb25lOgogICAgICAgIGlmIHNlbGYuY2FuY2VsX2V2ZW50Lmlz X3NldCgpOgogICAgICAgICAgICByYWlzZSBDYW5jZWxsZWQoKQoKICAgIGRlZiBfcHJvZ3Jlc3Mo c2VsZiwgZG9uZTogaW50LCB0b3RhbDogaW50KSAtPiBOb25lOgogICAgICAgIHNlbGYuX3NldChm cmFjdGlvbj1kb25lIC8gdG90YWwgaWYgdG90YWwgZWxzZSBOb25lKQoKICAgIGRlZiBfd29yayhz ZWxmKSAtPiBOb25lOgogICAgICAgIHRyeToKICAgICAgICAgICAgb3V0cHV0ID0gc2VsZi5fZm9s bG93KCkgaWYgc2VsZi5mb2xsb3dfdXVpZCBlbHNlIHNlbGYuX3J1bl9hdXBob25pYygpCiAgICAg ICAgZXhjZXB0IEJhc2VFeGNlcHRpb24gYXMgZXhjOiAgIyBkZWxpdmVyZWQgdG8gdGhlIFVJIHRo cmVhZCBieSB0aWNrKCkKICAgICAgICAgICAgc2VsZi5fc2V0KGVycm9yPWV4YywgZG9uZT1UcnVl KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX3NldChvdXRwdXQ9b3V0cHV0LCBkb25l PVRydWUpCgogICAgZGVmIF9ydW5fYXVwaG9uaWMoc2VsZikgLT4gUGF0aDoKICAgICAgICByZXF1 ZXN0LCBjbGllbnQgPSBzZWxmLnJlcXVlc3QsIHNlbGYuY2xpZW50CiAgICAgICAgYXNzZXJ0IHNl bGYucmVuZGVyZWQgaXMgbm90IE5vbmUKICAgICAgICBzZWxmLl9jaGVja19jYW5jZWwoKQogICAg ICAgIHByb2R1Y3Rpb24gPSBjbGllbnQuY3JlYXRlX3Byb2R1Y3Rpb24oCiAgICAgICAgICAgIHJl cXVlc3QucHJlc2V0X3V1aWQsIHJlcXVlc3QudGl0bGUsIFtjLnRvX2FwaSgpIGZvciBjIGluIHJl cXVlc3QuY2hhcHRlcnNdCiAgICAgICAgKQogICAgICAgIHNlbGYuX3NldChwcm9kdWN0aW9uX3V1 aWQ9cHJvZHVjdGlvbi51dWlkLCBwcm9kdWN0aW9uX3VybD1wcm9kdWN0aW9uLnN0YXR1c19wYWdl KQogICAgICAgIGxvZy5pbmZvKGYiQ3JlYXRlZCBwcm9kdWN0aW9uIHtwcm9kdWN0aW9uLnV1aWR9 OiB7cHJvZHVjdGlvbi5zdGF0dXNfcGFnZX0iKQogICAgICAgIGlmIHByb2R1Y3Rpb24ud2F2X291 dHB1dCgpIGlzIE5vbmU6CiAgICAgICAgICAgICMgS2VlcCB0aGUgcHJlc2V0J3Mgb3V0cHV0cyBh bmQgYWRkIHRoZSBXQVYgd2UgcHV0IGJhY2sgb24gdGhlIHRpbWVsaW5lLgogICAgICAgICAgICBj bGllbnQuYWRkX291dHB1dF9maWxlcyhwcm9kdWN0aW9uLnV1aWQsIFtXQVZfT1VUUFVUXSkKCiAg ICAgICAgc2VsZi5fY2hlY2tfY2FuY2VsKCkKICAgICAgICBzZWxmLl9zZXQoc3RhZ2U9VVBMT0FE SU5HLCBmcmFjdGlvbj0wLjApCiAgICAgICAgY2xpZW50LnVwbG9hZCgKICAgICAgICAgICAgcHJv ZHVjdGlvbi51dWlkLCBzZWxmLnJlbmRlcmVkLCBwcm9ncmVzcz1zZWxmLl9wcm9ncmVzcywgY2Fu Y2VsPXNlbGYuY2FuY2VsX2V2ZW50CiAgICAgICAgKQogICAgICAgIHNlbGYuX3JlbW92ZV90ZW1w KCkKCiAgICAgICAgc2VsZi5fY2hlY2tfY2FuY2VsKCkKICAgICAgICAjIEluIGVkaXQgbW9kZSwg dGhlIHByb2R1Y3Rpb24gd2FpdHMgdW50aWwgdGhlIHVzZXIgc3RhcnRzIGl0IG9uIGF1cGhvbmlj LmNvbS4KICAgICAgICBpZiByZXF1ZXN0LmVkaXRfZmlyc3Q6CiAgICAgICAgICAgIHNlbGYuX3dh aXRfZm9yX3VzZXIocHJvZHVjdGlvbi51dWlkKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNs aWVudC5zdGFydF9wcm9kdWN0aW9uKHByb2R1Y3Rpb24udXVpZCkKICAgICAgICAgICAgc2VsZi5f c2V0KHN0YWdlPVBST0NFU1NJTkcsIGZyYWN0aW9uPU5vbmUpCiAgICAgICAgcmV0dXJuIHNlbGYu X2ZpbmlzaF9vbl9hdXBob25pYyhwcm9kdWN0aW9uLnV1aWQsIHdhaXRpbmc9cmVxdWVzdC5lZGl0 X2ZpcnN0KQoKICAgIGRlZiBfd2FpdF9mb3JfdXNlcihzZWxmLCB1dWlkOiBzdHIpIC0+IE5vbmU6 CiAgICAgICAgZWRpdF91cmwgPSBwcm9kdWN0aW9uX2VkaXRfdXJsKHV1aWQpCiAgICAgICAgbG9n LmluZm8oZiJXYWl0aW5nIGZvciB0aGUgcHJvZHVjdGlvbiB0byBiZSBzdGFydGVkIG9uIHtlZGl0 X3VybH0iKQogICAgICAgIHNlbGYuX3NldChzdGFnZT1XQUlUSU5HLCBmcmFjdGlvbj1Ob25lLCBl ZGl0X3VybD1lZGl0X3VybCkKCiAgICBkZWYgX2ZvbGxvdyhzZWxmKSAtPiBQYXRoOgogICAgICAg ICIiIkVkaXQgQWdhaW46IHdhaXQgdW50aWwgdGhlIGZpbmlzaGVkIHByb2R1Y3Rpb24gaXMgcHJv Y2Vzc2VkIGFnYWluLiIiIgogICAgICAgIHByb2R1Y3Rpb24gPSBzZWxmLmNsaWVudC5nZXRfcHJv ZHVjdGlvbihzZWxmLmZvbGxvd191dWlkKQogICAgICAgIHNlbGYuX3NldChwcm9kdWN0aW9uX3V1 aWQ9cHJvZHVjdGlvbi51dWlkLCBwcm9kdWN0aW9uX3VybD1wcm9kdWN0aW9uLnN0YXR1c19wYWdl KQogICAgICAgIHNlbGYuX3dhaXRfZm9yX3VzZXIocHJvZHVjdGlvbi51dWlkKQogICAgICAgIHJl dHVybiBzZWxmLl9maW5pc2hfb25fYXVwaG9uaWMoCiAgICAgICAgICAgIHByb2R1Y3Rpb24udXVp ZCwgd2FpdGluZz1UcnVlLCBkb25lX2JlZm9yZT1wcm9kdWN0aW9uLmNoYW5nZV90aW1lCiAgICAg ICAgKQoKICAgIGRlZiBfc3RpbGxfd2FpdGluZyhzZWxmLCBwcm9kdWN0aW9uOiBBbnksIGRvbmVf YmVmb3JlOiBzdHIgfCBOb25lKSAtPiBib29sOgogICAgICAgICIiIkJlZm9yZSB0aGUgdXNlciBz dGFydHMgaXQ6IG5vdCBzdGFydGVkIG9yIGNoYW5nZWQsIG9yIHN0aWxsIHRoZSBvbGQgcmVzdWx0 LgoKICAgICAgICBgYGRvbmVfYmVmb3JlYGAgaXMgdGhlIGNoYW5nZSB0aW1lIG9mIGEgcmVzdWx0 IHRoYXQgd2FzIGFscmVhZHkgZG93bmxvYWRlZDsgYQogICAgICAgIERvbmUgc3RhdHVzIG9ubHkg Y291bnRzIG9uY2UgdGhlIGNoYW5nZSB0aW1lIGRpZmZlcnMgKGlmIEF1cGhvbmljIHNlbmRzIG5v bmUsCiAgICAgICAgdGhlIHByb2R1Y3Rpb24gaGFzIHRvIGJlIHNlZW4gcHJvY2Vzc2luZyBmaXJz dCkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgcHJvZHVjdGlvbi5zdGF0dXMgaW4gU1RBVFVTX05P VF9TVEFSVEVEOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGlmIHByb2R1Y3Rpb24u c3RhdHVzID09IFNUQVRVU19ET05FIGFuZCBkb25lX2JlZm9yZSBpcyBub3QgTm9uZToKICAgICAg ICAgICAgcmV0dXJuIG5vdCBwcm9kdWN0aW9uLmNoYW5nZV90aW1lIG9yIHByb2R1Y3Rpb24uY2hh bmdlX3RpbWUgPT0gZG9uZV9iZWZvcmUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX2Zp bmlzaF9vbl9hdXBob25pYygKICAgICAgICBzZWxmLCB1dWlkOiBzdHIsICosIHdhaXRpbmc6IGJv b2wsIGRvbmVfYmVmb3JlOiBzdHIgfCBOb25lID0gTm9uZQogICAgKSAtPiBQYXRoOgogICAgICAg ICIiIlBvbGwgdW50aWwgZG9uZSAoYWZ0ZXIgdGhlIHVzZXIgc3RhcnRlZCBpdCwgaWYgYGB3YWl0 aW5nYGApLCB0aGVuIGRvd25sb2FkLiIiIgogICAgICAgIHJlcXVlc3QsIGNsaWVudCA9IHNlbGYu cmVxdWVzdCwgc2VsZi5jbGllbnQKICAgICAgICBkZWxheSA9IFBPTExfRklSU1RfUwogICAgICAg IHdoaWxlIFRydWU6CiAgICAgICAgICAgIGlmIHNlbGYud2FpdChzZWxmLmNhbmNlbF9ldmVudCwg ZGVsYXkpOgogICAgICAgICAgICAgICAgcmFpc2UgQ2FuY2VsbGVkKCkKICAgICAgICAgICAgZGVs YXkgPSBtaW4oUE9MTF9NQVhfUywgZGVsYXkgKiAxLjUpCiAgICAgICAgICAgIHByb2R1Y3Rpb24g PSBjbGllbnQuZ2V0X3Byb2R1Y3Rpb24odXVpZCkKICAgICAgICAgICAgaWYgd2FpdGluZyBhbmQg c2VsZi5fc3RpbGxfd2FpdGluZyhwcm9kdWN0aW9uLCBkb25lX2JlZm9yZSk6CiAgICAgICAgICAg ICAgICBjb250aW51ZQogICAgICAgICAgICB3YWl0aW5nID0gRmFsc2UKICAgICAgICAgICAgc3Rh dHVzX3RleHQgPSBwcm9kdWN0aW9uLnN0YXR1c19zdHJpbmcgb3IgIlByb2Nlc3NpbmciCiAgICAg ICAgICAgIHNlbGYuX3NldChzdGFnZT1mIkF1cGhvbmljOiB7c3RhdHVzX3RleHR9IikKICAgICAg ICAgICAgaWYgcHJvZHVjdGlvbi5zdGF0dXMgPT0gU1RBVFVTX0RPTkU6CiAgICAgICAgICAgICAg ICBicmVhawogICAgICAgICAgICBpZiBwcm9kdWN0aW9uLnN0YXR1cyBpbiBTVEFUVVNfRkFJTEVE OgogICAgICAgICAgICAgICAgcmFpc2UgUHJvZHVjdGlvbkZhaWxlZEVycm9yKAogICAgICAgICAg ICAgICAgICAgICJBdXBob25pYyBjb3VsZG4ndCBwcm9jZXNzIHRoZSBhdWRpbzogIgogICAgICAg ICAgICAgICAgICAgIGYie3Byb2R1Y3Rpb24uZXJyb3JfbWVzc2FnZSBvciBzdGF0dXNfdGV4dH0u ICIKICAgICAgICAgICAgICAgICAgICAiQ2xpY2sgT3BlbiBQcm9kdWN0aW9uIGZvciBkZXRhaWxz LiIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgb3V0cHV0ID0gcHJvZHVjdGlvbi53YXZfb3V0 cHV0KCkKICAgICAgICBpZiBvdXRwdXQgaXMgTm9uZToKICAgICAgICAgICAgaGludCA9ICgKICAg ICAgICAgICAgICAgICIgS2VlcCBhIFdBViBvdXRwdXQgZmlsZSBpbiB0aGUgcHJvZHVjdGlvbidz IHNldHRpbmdzLiIKICAgICAgICAgICAgICAgIGlmIHJlcXVlc3QuZWRpdF9maXJzdCBvciBzZWxm LmZvbGxvd191dWlkCiAgICAgICAgICAgICAgICBlbHNlICIiCiAgICAgICAgICAgICkKICAgICAg ICAgICAgcmFpc2UgQXBpRXJyb3IoZiJBdXBob25pYyBkaWRuJ3QgcHJvZHVjZSBhIFdBViBmaWxl IGZvciB0aGUgdGltZWxpbmUue2hpbnR9IikKICAgICAgICB0YXJnZXQgPSBkb3dubG9hZF9wYXRo KHJlcXVlc3QuZG93bmxvYWRfZGlyLCByZXF1ZXN0LnRpdGxlKQogICAgICAgIHNlbGYuX3NldChz dGFnZT1ET1dOTE9BRElORywgZnJhY3Rpb249MC4wKQogICAgICAgIGNsaWVudC5kb3dubG9hZChv dXRwdXQsIHRhcmdldCwgcHJvZ3Jlc3M9c2VsZi5fcHJvZ3Jlc3MsIGNhbmNlbD1zZWxmLmNhbmNl bF9ldmVudCkKICAgICAgICBsb2cuaW5mbyhmIkRvd25sb2FkZWQgdGhlIHByb2Nlc3NlZCBhdWRp byB0byB7dGFyZ2V0fSIpCiAgICAgICAgcmV0dXJuIHRhcmdldAoKICAgICMgLS0gZmluaXNoaW5n IChVSSB0aHJlYWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KCiAgICBkZWYgX3JlbW92ZV90ZW1wKHNlbGYpIC0+IE5vbmU6CiAgICAgICAg aWYgc2VsZi50ZW1wX2RpciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShz ZWxmLnRlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCgogICAgZGVmIF9maW5pc2goc2VsZiwg cmVzdWx0OiBQaXBlbGluZVJlc3VsdCB8IE5vbmUsIGVycm9yOiBCYXNlRXhjZXB0aW9uIHwgTm9u ZSkgLT4gTm9uZToKICAgICAgICBpZiBzZWxmLmZpbmlzaGVkOgogICAgICAgICAgICByZXR1cm4K ICAgICAgICBzZWxmLmZpbmlzaGVkID0gVHJ1ZQogICAgICAgIGlmIHNlbGYucmVuZGVyIGlzIG5v dCBOb25lOgogICAgICAgICAgICBzZWxmLnJlbmRlci5jbGVhbnVwKCkKICAgICAgICBzZWxmLl9y ZW1vdmVfdGVtcCgpCiAgICAgICAgY2FuY2VsbGVkID0gaXNpbnN0YW5jZShlcnJvciwgQ2FuY2Vs bGVkKQogICAgICAgIHNlbGYub25fZmluaXNoZWQocmVzdWx0LCBOb25lIGlmIGNhbmNlbGxlZCBl bHNlIGVycm9yLCBjYW5jZWxsZWQsIHNlbGYucHJvZHVjdGlvbl91dWlkKQpQSwMEFAAAAAAAFFtq XSEdm3wZXQAAGV0AAB4AAABhdXBob25pY19yZXNvbHZlL3Jlc29sdmVfaW8ucHkiIiJBbGwgYWNj ZXNzIHRvIHRoZSBEYVZpbmNpIFJlc29sdmUgc2NyaXB0aW5nIEFQSS4KClJlc29sdmUgb2JqZWN0 cyBhcmUgdW50eXBlZCBwcm94aWVzLCBzbyB0aGV5IGFyZSB0eXBlZCBhcyBgYEFueWBgIGhlcmUu CiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKZnJvbSBkYXRhY2xhc3Nl cyBpbXBvcnQgZGF0YWNsYXNzCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIHR5cGluZyBp bXBvcnQgQW55Cgpmcm9tIC4gaW1wb3J0IGxvZwpmcm9tIC50aW1pbmcgaW1wb3J0IEZyYW1lUmF0 ZSwgTWFya2VyLCBSYW5nZSwgbWFya19yYW5nZQoKCmRlZiBmaW5kX3Jlc29sdmUoaW5qZWN0ZWQ6 IEFueSwgYm1kOiBBbnksIGZ1c2lvbjogQW55KSAtPiB0dXBsZVtBbnksIHN0cl06CiAgICAiIiJS ZXR1cm4gYGAocmVzb2x2ZSwgaG93KWBgLCB0cnlpbmcgZXZlcnkgd2F5IHRoZSBpbi1hcHAgQVBJ IG1heSBvZmZlciBpdC4KCiAgICBgYGhvd2BgIG5hbWVzIHRoZSBtZXRob2QgdGhhdCB3b3JrZWQs IGZvciB0aGUgZGlhZ25vc3RpY3MuCiAgICAiIiIKICAgIGlmIGluamVjdGVkIGlzIG5vdCBOb25l OgogICAgICAgIHJldHVybiBpbmplY3RlZCwgImluamVjdGVkIGdsb2JhbCIKICAgIGlmIGJtZCBp cyBub3QgTm9uZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvdW5kID0gYm1kLnNjcmlwdGFw cCgiUmVzb2x2ZSIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgZm91bmQg PSBOb25lCiAgICAgICAgaWYgZm91bmQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBm b3VuZCwgImJtZC5zY3JpcHRhcHAiCiAgICBpZiBmdXNpb24gaXMgbm90IE5vbmU6CiAgICAgICAg dHJ5OgogICAgICAgICAgICBmb3VuZCA9IGZ1c2lvbi5HZXRSZXNvbHZlKCkKICAgICAgICBleGNl cHQgRXhjZXB0aW9uOgogICAgICAgICAgICBmb3VuZCA9IE5vbmUKICAgICAgICBpZiBmb3VuZCBp cyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGZvdW5kLCAiZnVzaW9uLkdldFJlc29sdmUi CiAgICByZXR1cm4gTm9uZSwgIm5vdCBmb3VuZCIKCgojIC0tIHJlYWRpbmcgdGhlIGN1cnJlbnQg dGltZWxpbmUgKFVJIHRocmVhZCBvbmx5KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCgoKY2xhc3MgTm9UaW1lbGluZUVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJObyBwcm9qZWN0 IG9yIHRpbWVsaW5lIGlzIG9wZW4uIGBgc3RyKGV4YylgYCBpcyBhIHVzZXItZmFjaW5nIHNlbnRl bmNlLiIiIgoKCkBkYXRhY2xhc3MoZnJvemVuPVRydWUpCmNsYXNzIENsaXA6CiAgICBuYW1lOiBz dHIKICAgIHN0YXJ0OiBpbnQKICAgIGVuZDogaW50CgogICAgQHByb3BlcnR5CiAgICBkZWYgcmFu Z2Uoc2VsZikgLT4gUmFuZ2U6CiAgICAgICAgcmV0dXJuIFJhbmdlKHNlbGYuc3RhcnQsIHNlbGYu ZW5kKQoKCkBkYXRhY2xhc3MoZnJvemVuPVRydWUpCmNsYXNzIEF1ZGlvVHJhY2s6CiAgICBpbmRl eDogaW50ICAjIDEtYmFzZWQsIGFzIGluIHRoZSBSZXNvbHZlIEFQSQogICAgbmFtZTogc3RyCiAg ICBjbGlwczogdHVwbGVbQ2xpcCwgLi4uXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhYmVsKHNl bGYpIC0+IHN0cjoKICAgICAgICByZXR1cm4gZiJBe3NlbGYuaW5kZXh9IOKAkyB7c2VsZi5uYW1l fSIKCgpAZGF0YWNsYXNzKGZyb3plbj1UcnVlKQpjbGFzcyBUaW1lbGluZVN0YXRlOgogICAgcHJv amVjdF9uYW1lOiBzdHIKICAgIHRpbWVsaW5lX25hbWU6IHN0cgogICAgdGltZWxpbmVfaWQ6IHN0 cgogICAgc3RhcnRfZnJhbWU6IGludAogICAgZW5kX2ZyYW1lOiBpbnQKICAgIHJhdGU6IEZyYW1l UmF0ZQogICAgbWFyazogUmFuZ2UgfCBOb25lCiAgICBtYXJrZXJzOiB0dXBsZVtNYXJrZXIsIC4u Ll0KICAgIHRyYWNrczogdHVwbGVbQXVkaW9UcmFjaywgLi4uXQoKICAgIGRlZiB0cmFjayhzZWxm LCBpbmRleDogaW50KSAtPiBBdWRpb1RyYWNrIHwgTm9uZToKICAgICAgICByZXR1cm4gbmV4dCgo dCBmb3IgdCBpbiBzZWxmLnRyYWNrcyBpZiB0LmluZGV4ID09IGluZGV4KSwgTm9uZSkKCiAgICBk ZWYgZGVmYXVsdF90cmFja19pbmRleChzZWxmKSAtPiBpbnQgfCBOb25lOgogICAgICAgICIiIlRo ZSBmaXJzdCBhdWRpbyB0cmFjayB3aXRoIGNsaXBzLCBlbHNlIHRoZSBmaXJzdCBhdWRpbyB0cmFj ay4iIiIKICAgICAgICB3aXRoX2NsaXBzID0gbmV4dCgodCBmb3IgdCBpbiBzZWxmLnRyYWNrcyBp ZiB0LmNsaXBzKSwgTm9uZSkKICAgICAgICBmaXJzdCA9IHdpdGhfY2xpcHMgb3IgKHNlbGYudHJh Y2tzWzBdIGlmIHNlbGYudHJhY2tzIGVsc2UgTm9uZSkKICAgICAgICByZXR1cm4gZmlyc3QuaW5k ZXggaWYgZmlyc3QgZWxzZSBOb25lCgoKZGVmIF9jYWxsKG9iajogQW55LCBtZXRob2Q6IHN0ciwg KmFyZ3M6IEFueSwgZGVmYXVsdDogQW55ID0gTm9uZSkgLT4gQW55OgogICAgIiIiQ2FsbCBhIFJl c29sdmUgQVBJIG1ldGhvZCB0aGF0IG1heSBiZSBtaXNzaW5nIGluIG9sZGVyIHZlcnNpb25zIG9y IGZhaWwuIiIiCiAgICB0cnk6CiAgICAgICAgdmFsdWUgPSBnZXRhdHRyKG9iaiwgbWV0aG9kKSgq YXJncykKICAgIGV4Y2VwdCBFeGNlcHRpb246ICAjIHByb3hpZXMgcmFpc2UgZm9yIHVua25vd24g bWV0aG9kcyBvciBjbG9zZWQgb2JqZWN0cwogICAgICAgIHJldHVybiBkZWZhdWx0CiAgICByZXR1 cm4gZGVmYXVsdCBpZiB2YWx1ZSBpcyBOb25lIGVsc2UgdmFsdWUKCgpkZWYgY3VycmVudF90aW1l bGluZShyZXNvbHZlOiBBbnkpIC0+IHR1cGxlW0FueSwgQW55XToKICAgICIiImBgKHByb2plY3Qs IHRpbWVsaW5lKWBgOyByYWlzZXMgTm9UaW1lbGluZUVycm9yIHdpdGggYSB1c2VyLWZhY2luZyBt ZXNzYWdlLiIiIgogICAgaWYgcmVzb2x2ZSBpcyBOb25lOgogICAgICAgIHJhaXNlIE5vVGltZWxp bmVFcnJvcigiRGFWaW5jaSBSZXNvbHZlJ3Mgc2NyaXB0aW5nIGludGVyZmFjZSBpc24ndCBhdmFp bGFibGUuIikKICAgIHByb2plY3QgPSBfY2FsbChfY2FsbChyZXNvbHZlLCAiR2V0UHJvamVjdE1h bmFnZXIiKSwgIkdldEN1cnJlbnRQcm9qZWN0IikKICAgIGlmIHByb2plY3QgaXMgTm9uZToKICAg ICAgICByYWlzZSBOb1RpbWVsaW5lRXJyb3IoIk9wZW4gYSBwcm9qZWN0IGluIERhVmluY2kgUmVz b2x2ZS4iKQogICAgdGltZWxpbmUgPSBfY2FsbChwcm9qZWN0LCAiR2V0Q3VycmVudFRpbWVsaW5l IikKICAgIGlmIHRpbWVsaW5lIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgTm9UaW1lbGluZUVycm9y KCJPcGVuIGEgdGltZWxpbmUgaW4gRGFWaW5jaSBSZXNvbHZlLiIpCiAgICByZXR1cm4gcHJvamVj dCwgdGltZWxpbmUKCgpkZWYgX2ZyYW1lX3JhdGUodGltZWxpbmU6IEFueSkgLT4gRnJhbWVSYXRl OgogICAgc2V0dGluZyA9IHN0cihfY2FsbCh0aW1lbGluZSwgIkdldFNldHRpbmciLCAidGltZWxp bmVGcmFtZVJhdGUiLCBkZWZhdWx0PSIiKSBvciAiMjQiKQogICAgZHJvcCA9IHN0cihfY2FsbCh0 aW1lbGluZSwgIkdldFNldHRpbmciLCAidGltZWxpbmVEcm9wRnJhbWVUaW1lY29kZSIsIGRlZmF1 bHQ9IjAiKSkKICAgIHRyeToKICAgICAgICByZXR1cm4gRnJhbWVSYXRlLnBhcnNlKHNldHRpbmcs IGRyb3BfZnJhbWU9ZHJvcC5zdHJpcCgpLmxvd2VyKCkgaW4gKCIxIiwgInRydWUiKSkKICAgIGV4 Y2VwdCAoVmFsdWVFcnJvciwgSW5kZXhFcnJvcik6CiAgICAgICAgcmV0dXJuIEZyYW1lUmF0ZS5w YXJzZSgiMjQiKQoKCmRlZiBfY2xpcHModGltZWxpbmU6IEFueSwgaW5kZXg6IGludCkgLT4gdHVw bGVbQ2xpcCwgLi4uXToKICAgIGl0ZW1zID0gX2NhbGwodGltZWxpbmUsICJHZXRJdGVtTGlzdElu VHJhY2siLCAiYXVkaW8iLCBpbmRleCwgZGVmYXVsdD1bXSkgb3IgW10KICAgIGNsaXBzID0gWwog ICAgICAgIENsaXAoCiAgICAgICAgICAgIG5hbWU9c3RyKF9jYWxsKGl0ZW0sICJHZXROYW1lIiwg ZGVmYXVsdD0iIikgb3IgIkNsaXAiKSwKICAgICAgICAgICAgc3RhcnQ9aW50KF9jYWxsKGl0ZW0s ICJHZXRTdGFydCIsIGRlZmF1bHQ9MCkpLAogICAgICAgICAgICBlbmQ9aW50KF9jYWxsKGl0ZW0s ICJHZXRFbmQiLCBkZWZhdWx0PTApKSwKICAgICAgICApCiAgICAgICAgZm9yIGl0ZW0gaW4gKGl0 ZW1zLnZhbHVlcygpIGlmIGlzaW5zdGFuY2UoaXRlbXMsIGRpY3QpIGVsc2UgaXRlbXMpCiAgICBd CiAgICByZXR1cm4gdHVwbGUoc29ydGVkKGNsaXBzLCBrZXk9bGFtYmRhIGM6IChjLnN0YXJ0LCBj LmVuZCkpKQoKCmRlZiBfbWFya2Vycyh0aW1lbGluZTogQW55LCBzdGFydF9mcmFtZTogaW50KSAt PiB0dXBsZVtNYXJrZXIsIC4uLl06CiAgICByYXcgPSBfY2FsbCh0aW1lbGluZSwgIkdldE1hcmtl cnMiLCBkZWZhdWx0PXt9KSBvciB7fQogICAgbWFya2VycyA9IFtdCiAgICBmb3IgZnJhbWUsIGlu Zm8gaW4gcmF3Lml0ZW1zKCk6CiAgICAgICAgaW5mbyA9IGluZm8gaWYgaXNpbnN0YW5jZShpbmZv LCBkaWN0KSBlbHNlIHt9CiAgICAgICAgbWFya2Vycy5hcHBlbmQoCiAgICAgICAgICAgIE1hcmtl cigKICAgICAgICAgICAgICAgIGZyYW1lPXN0YXJ0X2ZyYW1lICsgcm91bmQoZmxvYXQoZnJhbWUp KSwKICAgICAgICAgICAgICAgIG5hbWU9c3RyKGluZm8uZ2V0KCJuYW1lIikgb3IgIiIpLAogICAg ICAgICAgICAgICAgbm90ZT1zdHIoaW5mby5nZXQoIm5vdGUiKSBvciAiIiksCiAgICAgICAgICAg ICkKICAgICAgICApCiAgICByZXR1cm4gdHVwbGUoc29ydGVkKG1hcmtlcnMsIGtleT1sYW1iZGEg bTogbS5mcmFtZSkpCgoKZGVmIHJlYWRfdGltZWxpbmVfc3RhdGUocmVzb2x2ZTogQW55KSAtPiBU aW1lbGluZVN0YXRlOgogICAgIiIiU25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgdGltZWxpbmUgYXMg cGxhaW4gZGF0YS4gQ2FsbCBmcm9tIHRoZSBVSSB0aHJlYWQuIiIiCiAgICBwcm9qZWN0LCB0aW1l bGluZSA9IGN1cnJlbnRfdGltZWxpbmUocmVzb2x2ZSkKICAgIHN0YXJ0X2ZyYW1lID0gaW50KF9j YWxsKHRpbWVsaW5lLCAiR2V0U3RhcnRGcmFtZSIsIGRlZmF1bHQ9MCkpCiAgICBjb3VudCA9IGlu dChfY2FsbCh0aW1lbGluZSwgIkdldFRyYWNrQ291bnQiLCAiYXVkaW8iLCBkZWZhdWx0PTApKQog ICAgdHJhY2tzID0gdHVwbGUoCiAgICAgICAgQXVkaW9UcmFjaygKICAgICAgICAgICAgaW5kZXg9 aSwKICAgICAgICAgICAgbmFtZT1zdHIoX2NhbGwodGltZWxpbmUsICJHZXRUcmFja05hbWUiLCAi YXVkaW8iLCBpLCBkZWZhdWx0PSIiKSBvciBmIkF1ZGlvIHtpfSIpLAogICAgICAgICAgICBjbGlw cz1fY2xpcHModGltZWxpbmUsIGkpLAogICAgICAgICkKICAgICAgICBmb3IgaSBpbiByYW5nZSgx LCBjb3VudCArIDEpCiAgICApCiAgICAjIEdldE1hcmtJbk91dCBleGlzdHMgZnJvbSBSZXNvbHZl IDE5LjE7IG9sZGVyIHZlcnNpb25zIHNpbXBseSBoYXZlIG5vIGluL291dC4KICAgIHJhd19tYXJr cyA9IF9jYWxsKHRpbWVsaW5lLCAiR2V0TWFya0luT3V0IiwgZGVmYXVsdD1Ob25lKQogICAgc3Rh dGUgPSBUaW1lbGluZVN0YXRlKAogICAgICAgIHByb2plY3RfbmFtZT1zdHIoX2NhbGwocHJvamVj dCwgIkdldE5hbWUiLCBkZWZhdWx0PSIiKSBvciAiIiksCiAgICAgICAgdGltZWxpbmVfbmFtZT1z dHIoX2NhbGwodGltZWxpbmUsICJHZXROYW1lIiwgZGVmYXVsdD0iIikgb3IgIiIpLAogICAgICAg IHRpbWVsaW5lX2lkPXN0cihfY2FsbCh0aW1lbGluZSwgIkdldFVuaXF1ZUlkIiwgZGVmYXVsdD0i Iikgb3IgIiIpLAogICAgICAgIHN0YXJ0X2ZyYW1lPXN0YXJ0X2ZyYW1lLAogICAgICAgIGVuZF9m cmFtZT1pbnQoX2NhbGwodGltZWxpbmUsICJHZXRFbmRGcmFtZSIsIGRlZmF1bHQ9c3RhcnRfZnJh bWUpKSwKICAgICAgICByYXRlPV9mcmFtZV9yYXRlKHRpbWVsaW5lKSwKICAgICAgICBtYXJrPW1h cmtfcmFuZ2Uoc3RhcnRfZnJhbWUsIHJhd19tYXJrcyksCiAgICAgICAgbWFya2Vycz1fbWFya2Vy cyh0aW1lbGluZSwgc3RhcnRfZnJhbWUpLAogICAgICAgIHRyYWNrcz10cmFja3MsCiAgICApCiAg ICBpZiBsb2cuaXNfdmVyYm9zZSgpOgogICAgICAgIF9sb2dfc3RhdGUoc3RhdGUsIHJhd19tYXJr cywgX2NhbGwodGltZWxpbmUsICJHZXRTZXR0aW5nIiwgInRpbWVsaW5lRnJhbWVSYXRlIikpCiAg ICByZXR1cm4gc3RhdGUKCgpkZWYgX2xvZ19zdGF0ZShzdGF0ZTogVGltZWxpbmVTdGF0ZSwgcmF3 X21hcmtzOiBBbnksIHJhd19yYXRlOiBBbnkpIC0+IE5vbmU6CiAgICAiIiJEZXYgbW9kZTogcHJp bnQgdGhlIHJhdyB2YWx1ZXMgUmVzb2x2ZSByZXR1cm5lZCwgZm9yIGNoZWNraW5nIGFzc3VtcHRp b25zLiIiIgogICAgbG9nLmRlYnVnKAogICAgICAgIGYidGltZWxpbmUge3N0YXRlLnRpbWVsaW5l X25hbWUhcn06IGZyYW1lcyB7c3RhdGUuc3RhcnRfZnJhbWV9Li57c3RhdGUuZW5kX2ZyYW1lfSAi CiAgICAgICAgZiIoZW5kIGV4Y2x1c2l2ZSksIGZyYW1lIHJhdGUge3Jhd19yYXRlIXJ9IC0+IHtz dGF0ZS5yYXRlfSIKICAgICkKICAgIGxvZy5kZWJ1ZyhmIkdldE1hcmtJbk91dCgpIHJhdzoge3Jh d19tYXJrcyFyfSAtPiBtYXJrIHJhbmdlIHtzdGF0ZS5tYXJrfSIpCiAgICBmb3IgdHJhY2sgaW4g c3RhdGUudHJhY2tzOgogICAgICAgIGNsaXBzID0gIiwgIi5qb2luKGYie2MubmFtZSFyfSB7Yy5z dGFydH0uLntjLmVuZH0iIGZvciBjIGluIHRyYWNrLmNsaXBzKSBvciAibm8gY2xpcHMiCiAgICAg ICAgbG9nLmRlYnVnKGYie3RyYWNrLmxhYmVsfToge2NsaXBzfSIpCiAgICBmb3IgbWFya2VyIGlu IHN0YXRlLm1hcmtlcnM6CiAgICAgICAgbG9nLmRlYnVnKGYibWFya2VyIGF0IHttYXJrZXIuZnJh bWV9OiB7bWFya2VyLm5hbWUhcn0iKQoKCmRlZiBjbGVhcl9tYXJrX2luX291dChyZXNvbHZlOiBB bnkpIC0+IGJvb2w6CiAgICAiIiJDbGVhciB0aGUgY3VycmVudCB0aW1lbGluZSdzIGluL291dCBw b2ludHMgKGBgQ2xlYXJNYXJrSW5PdXRgYCwgUmVzb2x2ZSAxOS4xKykuIiIiCiAgICB0cnk6CiAg ICAgICAgXywgdGltZWxpbmUgPSBjdXJyZW50X3RpbWVsaW5lKHJlc29sdmUpCiAgICBleGNlcHQg Tm9UaW1lbGluZUVycm9yOgogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIGJvb2woX2Nh bGwodGltZWxpbmUsICJDbGVhck1hcmtJbk91dCIsICJhbGwiLCBkZWZhdWx0PUZhbHNlKSkKCgpk ZWYgcmVhZF9tYXJrX2luX291dChyZXNvbHZlOiBBbnkpIC0+IEFueToKICAgICIiIlRoZSBjdXJy ZW50IHRpbWVsaW5lJ3MgcmF3IGBgR2V0TWFya0luT3V0KClgYCB2YWx1ZSwgdG8gcmVzdG9yZSBp dCBsYXRlci4iIiIKICAgIHRyeToKICAgICAgICBfLCB0aW1lbGluZSA9IGN1cnJlbnRfdGltZWxp bmUocmVzb2x2ZSkKICAgIGV4Y2VwdCBOb1RpbWVsaW5lRXJyb3I6CiAgICAgICAgcmV0dXJuIE5v bmUKICAgIHJldHVybiBfY2FsbCh0aW1lbGluZSwgIkdldE1hcmtJbk91dCIsIGRlZmF1bHQ9Tm9u ZSkKCgpkZWYgcmVzdG9yZV9tYXJrX2luX291dChyZXNvbHZlOiBBbnksIHNhdmVkOiBBbnkpIC0+ IE5vbmU6CiAgICAiIiJQdXQgdGhlIHRpbWVsaW5lJ3MgaW4vb3V0IHBvaW50cyBiYWNrIHRvIGBg c2F2ZWRgYCAoZnJvbSBgYHJlYWRfbWFya19pbl9vdXRgYCkuCgogICAgTmVlZGVkIGJlY2F1c2Ug UmVzb2x2ZSAyMS4xLjEgY2hhbmdlcyB0aGVtIGJlaGluZCB0aGUgdXNlcidzIGJhY2s6IHRoZSBy ZW5kZXIKICAgIHNldHRpbmdzJyBNYXJrSW4vTWFya091dCBiZWNvbWUgdGhlIHRpbWVsaW5lJ3Mg aW4vb3V0IHBvaW50cywgYW5kIHBsYWNpbmcgYSBjbGlwCiAgICB3aXRoIEFwcGVuZFRvVGltZWxp bmUgY2xlYXJzIHRoZW0uIGBgU2V0TWFya0luT3V0YGAgKFJlc29sdmUgMTkuMSspIGNhbiBvbmx5 IHNldCBhbgogICAgaW4gKmFuZCogYW4gb3V0IHBvaW50LCBzbyBhIGxvbmUgaW4gb3Igb3V0IHBv aW50IGNhbid0IGJlIHJlc3RvcmVkLgogICAgIiIiCiAgICBpZiBub3QgaXNpbnN0YW5jZShzYXZl ZCwgZGljdCk6CiAgICAgICAgcmV0dXJuICAjIG5vIGluL291dCBBUEkgKFJlc29sdmUgPCAxOS4x KSwgb3Igbm90aGluZyB3YXMgcmVhZAogICAgdHJ5OgogICAgICAgIF8sIHRpbWVsaW5lID0gY3Vy cmVudF90aW1lbGluZShyZXNvbHZlKQogICAgZXhjZXB0IE5vVGltZWxpbmVFcnJvcjoKICAgICAg ICByZXR1cm4KICAgIGlmIF9jYWxsKHRpbWVsaW5lLCAiR2V0TWFya0luT3V0IiwgZGVmYXVsdD1O b25lKSA9PSBzYXZlZDoKICAgICAgICByZXR1cm4KICAgIF9jYWxsKHRpbWVsaW5lLCAiQ2xlYXJN YXJrSW5PdXQiLCAiYWxsIikKICAgIHZpZGVvLCBhdWRpbyA9IHNhdmVkLmdldCgidmlkZW8iKSBv ciB7fSwgc2F2ZWQuZ2V0KCJhdWRpbyIpIG9yIHt9CiAgICB0YXJnZXRzID0gWygiYWxsIiwgdmlk ZW8pXSBpZiB2aWRlbyA9PSBhdWRpbyBlbHNlIFsoInZpZGVvIiwgdmlkZW8pLCAoImF1ZGlvIiwg YXVkaW8pXQogICAgZm9yIGtpbmQsIG1hcmtzIGluIHRhcmdldHM6CiAgICAgICAgaWYgaXNpbnN0 YW5jZShtYXJrcywgZGljdCkgYW5kICJpbiIgaW4gbWFya3MgYW5kICJvdXQiIGluIG1hcmtzOgog ICAgICAgICAgICBfY2FsbCh0aW1lbGluZSwgIlNldE1hcmtJbk91dCIsIGludChtYXJrc1siaW4i XSksIGludChtYXJrc1sib3V0Il0pLCBraW5kKQogICAgICAgIGVsaWYgbWFya3M6CiAgICAgICAg ICAgIGxvZy5kZWJ1ZyhmImNhbid0IHJlc3RvcmUgYSBsb25lIHtraW5kfSBpbi9vdXQgcG9pbnQ6 IHttYXJrcyFyfSIpCiAgICBsb2cuZGVidWcoZiJpbi9vdXQgcG9pbnRzIHJlc3RvcmVkIHRvIHtz YXZlZCFyfToge19jYWxsKHRpbWVsaW5lLCAnR2V0TWFya0luT3V0Jykhcn0iKQoKCmRlZiB0aW1l bGluZV9zaWduYXR1cmUocmVzb2x2ZTogQW55KSAtPiB0dXBsZVtBbnksIC4uLl06CiAgICAiIiJD aGVhcCBmaW5nZXJwcmludCBvZiB3aGF0IHRoZSBtYWluIHNjcmVlbiBzaG93cywgcG9sbGVkIHRv IGRldGVjdCBjaGFuZ2VzLiIiIgogICAgdHJ5OgogICAgICAgIHByb2plY3QsIHRpbWVsaW5lID0g Y3VycmVudF90aW1lbGluZShyZXNvbHZlKQogICAgZXhjZXB0IE5vVGltZWxpbmVFcnJvciBhcyBl eGM6CiAgICAgICAgcmV0dXJuICgibm9uZSIsIHN0cihleGMpKQogICAgY291bnQgPSBpbnQoX2Nh bGwodGltZWxpbmUsICJHZXRUcmFja0NvdW50IiwgImF1ZGlvIiwgZGVmYXVsdD0wKSkKICAgIGNs aXBzID0gW10KICAgIGZvciBpbmRleCBpbiByYW5nZSgxLCBjb3VudCArIDEpOgogICAgICAgIGl0 ZW1zID0gX2NhbGwodGltZWxpbmUsICJHZXRJdGVtTGlzdEluVHJhY2siLCAiYXVkaW8iLCBpbmRl eCwgZGVmYXVsdD1bXSkgb3IgW10KICAgICAgICBjbGlwcy5hcHBlbmQoCiAgICAgICAgICAgIHR1 cGxlKAogICAgICAgICAgICAgICAgKF9jYWxsKGl0ZW0sICJHZXRTdGFydCIsIGRlZmF1bHQ9MCks IF9jYWxsKGl0ZW0sICJHZXRFbmQiLCBkZWZhdWx0PTApKQogICAgICAgICAgICAgICAgZm9yIGl0 ZW0gaW4gKGl0ZW1zLnZhbHVlcygpIGlmIGlzaW5zdGFuY2UoaXRlbXMsIGRpY3QpIGVsc2UgaXRl bXMpCiAgICAgICAgICAgICkKICAgICAgICApCiAgICByZXR1cm4gKAogICAgICAgIF9jYWxsKHBy b2plY3QsICJHZXROYW1lIiwgZGVmYXVsdD0iIiksCiAgICAgICAgX2NhbGwodGltZWxpbmUsICJH ZXRVbmlxdWVJZCIsIGRlZmF1bHQ9IiIpLAogICAgICAgIF9jYWxsKHRpbWVsaW5lLCAiR2V0TmFt ZSIsIGRlZmF1bHQ9IiIpLAogICAgICAgIF9jYWxsKHRpbWVsaW5lLCAiR2V0U3RhcnRGcmFtZSIs IGRlZmF1bHQ9MCksCiAgICAgICAgX2NhbGwodGltZWxpbmUsICJHZXRTZXR0aW5nIiwgInRpbWVs aW5lRnJhbWVSYXRlIiwgZGVmYXVsdD0iIiksCiAgICAgICAgY291bnQsCiAgICAgICAgdHVwbGUo X2NhbGwodGltZWxpbmUsICJHZXRUcmFja05hbWUiLCAiYXVkaW8iLCBpLCBkZWZhdWx0PSIiKSBm b3IgaSBpbiByYW5nZSgxLCBjb3VudCArIDEpKSwKICAgICAgICByZXByKF9jYWxsKHRpbWVsaW5l LCAiR2V0TWFya0luT3V0IiwgZGVmYXVsdD1Ob25lKSksCiAgICAgICAgdHVwbGUoc29ydGVkKChf Y2FsbCh0aW1lbGluZSwgIkdldE1hcmtlcnMiLCBkZWZhdWx0PXt9KSBvciB7fSkua2V5cygpKSks CiAgICAgICAgdHVwbGUoY2xpcHMpLAogICAgKQoKCmRlZiBzZWxlY3RlZF9hdWRpb19jbGlwcyhy ZXNvbHZlOiBBbnkpIC0+IGZyb3plbnNldFt0dXBsZVtpbnQsIGludCwgaW50XV0gfCBOb25lOgog ICAgIiIiVGhlIGF1ZGlvIGNsaXBzIHNlbGVjdGVkIGluIFJlc29sdmUncyB0aW1lbGluZSwgYXMg KHRyYWNrLCBzdGFydCwgZW5kKS4KCiAgICBVc2VzIGBgVGltZWxpbmUuR2V0U2VsZWN0ZWRDbGlw cygpYGAgKFJlc29sdmUgMjEuMC40KyksIHdoaWNoIHJldHVybnMgdmlkZW8gaXRlbXMKICAgIGFu ZCB0aGVpciBsaW5rZWQgYXVkaW8gaXRlbXMgdG9vIChtZWFzdXJlZCBpbiAyMS4xLjEpOyBvbmx5 IGF1ZGlvIGlzIGtlcHQuCiAgICBgYE5vbmVgYCB3aGVuIHRoaXMgUmVzb2x2ZSBjYW4ndCB0ZWxs LgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgXywgdGltZWxpbmUgPSBjdXJyZW50X3RpbWVsaW5l KHJlc29sdmUpCiAgICAgICAgbWV0aG9kID0gZ2V0YXR0cih0aW1lbGluZSwgIkdldFNlbGVjdGVk Q2xpcHMiLCBOb25lKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4gTm9uZQog ICAgaWYgbWV0aG9kIGlzIE5vbmU6ICAjIG9sZGVyIFJlc29sdmU6IHRoZSBwcm94eSBoYXMgbm8g c3VjaCBtZXRob2QKICAgICAgICByZXR1cm4gTm9uZQogICAgdHJ5OgogICAgICAgIGl0ZW1zID0g bWV0aG9kKCkKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGlm IGl0ZW1zIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGtleXMgPSBzZXQoKQogICAg Zm9yIGl0ZW0gaW4gaXRlbXMudmFsdWVzKCkgaWYgaXNpbnN0YW5jZShpdGVtcywgZGljdCkgZWxz ZSBpdGVtczoKICAgICAgICB3aGVyZSA9IF9jYWxsKGl0ZW0sICJHZXRUcmFja1R5cGVBbmRJbmRl eCIsIGRlZmF1bHQ9Tm9uZSkKICAgICAgICBpZiBpc2luc3RhbmNlKHdoZXJlLCBkaWN0KTogICMg THVhLXN0eWxlIHRhYmxlIHsxOiB0eXBlLCAyOiBpbmRleH0KICAgICAgICAgICAgd2hlcmUgPSBb d2hlcmUuZ2V0KDEpLCB3aGVyZS5nZXQoMildCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uod2hl cmUsIChsaXN0LCB0dXBsZSkpIG9yIGxlbih3aGVyZSkgIT0gMiBvciB3aGVyZVswXSAhPSAiYXVk aW8iOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGtleXMuYWRkKAogICAgICAgICAgICAo CiAgICAgICAgICAgICAgICBpbnQod2hlcmVbMV0pLAogICAgICAgICAgICAgICAgaW50KF9jYWxs KGl0ZW0sICJHZXRTdGFydCIsIGRlZmF1bHQ9MCkpLAogICAgICAgICAgICAgICAgaW50KF9jYWxs KGl0ZW0sICJHZXRFbmQiLCBkZWZhdWx0PTApKSwKICAgICAgICAgICAgKQogICAgICAgICkKICAg IHJldHVybiBmcm96ZW5zZXQoa2V5cykKCgojIC0tIHJlbmRlcmluZyB0aGUgc2VsZWN0ZWQgYXVk aW8gKFVJIHRocmVhZCwgZHJpdmVuIGJ5IHRoZSBVSSB0aW1lcikgLS0tLS0tLS0tLS0tLS0tLS0K CgpjbGFzcyBSZW5kZXJFcnJvcihFeGNlcHRpb24pOgogICAgIiIiUmVuZGVyaW5nIGZhaWxlZC4g YGBzdHIoZXhjKWBgIGlzIGEgdXNlci1mYWNpbmcgc2VudGVuY2UuIiIiCgoKZGVmIF9hdWRpb19y ZW5kZXJfZm9ybWF0KHByb2plY3Q6IEFueSkgLT4gdHVwbGVbZGljdFtzdHIsIEFueV0sIHN0cl06 CiAgICAiIiJDaG9vc2UgYSBsb3NzbGVzcyBhdWRpby1vbmx5IHJlbmRlcjogYGAoZXh0cmEgc2V0 dGluZ3MsIGZpbGUgZXh0ZW5zaW9uKWBgLgoKICAgIFByZWZlcmVuY2U6IEZMQUMgKGxvc3NsZXNz IGFuZCBhYm91dCBoYWxmIHRoZSBzaXplIG9mIFdBViwgc28gZmFzdGVyIHVwbG9hZHMpLAogICAg dGhlbiBXQVYsIHRoZW4gUXVpY2tUaW1lIHdpdGggTFBDTSBhdWRpby4gTWVhc3VyZWQgaW4gUmVz b2x2ZSAyMS4xLjE6IHRoZSAyMS4xCiAgICBhdWRpbyBBUEkgKGBgQXVkaW9Gb3JtYXRgYCBzZXR0 aW5nKSBsaXN0cyBGTEFDIGFuZCBXQVYgYW5kIHJlbmRlcnMgYSA0OCBrSHovMjQtYml0CiAgICBX QVY7IGBgU2V0Q3VycmVudFJlbmRlckZvcm1hdEFuZENvZGVjKCJ3YXYiLCAiIilgYCByZXR1cm5z IEZhbHNlIHRoZXJlIChubyBXQVYKICAgIGNvZGVjcyBhcmUgbGlzdGVkKTsgUXVpY2tUaW1lIHdp dGggTFBDTSBhdWRpbyB3b3JrcyBhcyBhIGZhbGxiYWNrLgogICAgIiIiCiAgICBmb3JtYXRzID0g X2NhbGwocHJvamVjdCwgIkdldEF1ZGlvUmVuZGVyRm9ybWF0cyIsIGRlZmF1bHQ9Tm9uZSkgICMg UmVzb2x2ZSAyMS4xKwogICAgaWYgaXNpbnN0YW5jZShmb3JtYXRzLCBkaWN0KToKICAgICAgICBm b3IgZXh0ZW5zaW9uLCBwcmVmZXJyZWRfY29kZWMgaW4gKCgiZmxhYyIsICJmbGFjIiksICgid2F2 IiwgImxwY20iKSk6CiAgICAgICAgICAgIGlmIGV4dGVuc2lvbiBub3QgaW4gZm9ybWF0cy52YWx1 ZXMoKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGNvZGVjcyA9IF9jYWxs KHByb2plY3QsICJHZXRBdWRpb1JlbmRlckNvZGVjcyIsIGV4dGVuc2lvbiwgZGVmYXVsdD17fSkg b3Ige30KICAgICAgICAgICAgbmFtZXMgPSBsaXN0KGNvZGVjcy52YWx1ZXMoKSkgaWYgaXNpbnN0 YW5jZShjb2RlY3MsIGRpY3QpIGVsc2UgW10KICAgICAgICAgICAgY29kZWMgPSBwcmVmZXJyZWRf Y29kZWMgaWYgcHJlZmVycmVkX2NvZGVjIGluIG5hbWVzIGVsc2UgbmV4dChpdGVyKG5hbWVzKSwg IiIpCiAgICAgICAgICAgIGlmIGNvZGVjOgogICAgICAgICAgICAgICAgcmV0dXJuIHsiQXVkaW9G b3JtYXQiOiBleHRlbnNpb24sICJBdWRpb0NvZGVjIjogY29kZWN9LCBleHRlbnNpb24KICAgIHdh dl9jb2RlY3MgPSBfY2FsbChwcm9qZWN0LCAiR2V0UmVuZGVyQ29kZWNzIiwgIndhdiIsIGRlZmF1 bHQ9e30pIG9yIHt9CiAgICB3YXZfY29kZWMgPSBuZXh0KGl0ZXIod2F2X2NvZGVjcy52YWx1ZXMo KSksICIiKQogICAgaWYgX2NhbGwocHJvamVjdCwgIlNldEN1cnJlbnRSZW5kZXJGb3JtYXRBbmRD b2RlYyIsICJ3YXYiLCB3YXZfY29kZWMsIGRlZmF1bHQ9RmFsc2UpOgogICAgICAgIHJldHVybiB7 IkF1ZGlvQ29kZWMiOiAibHBjbSJ9LCAid2F2IgogICAgbW92X2NvZGVjcyA9IF9jYWxsKHByb2pl Y3QsICJHZXRSZW5kZXJDb2RlY3MiLCAibW92IiwgZGVmYXVsdD17fSkgb3Ige30KICAgIG1vdl9j b2RlYyA9IG5leHQoaXRlcihtb3ZfY29kZWNzLnZhbHVlcygpKSwgIiIpCiAgICBpZiBtb3ZfY29k ZWMgYW5kIF9jYWxsKHByb2plY3QsICJTZXRDdXJyZW50UmVuZGVyRm9ybWF0QW5kQ29kZWMiLCAi bW92IiwgbW92X2NvZGVjKToKICAgICAgICByZXR1cm4geyJBdWRpb0NvZGVjIjogImxwY20ifSwg Im1vdiIKICAgIHJhaXNlIFJlbmRlckVycm9yKCJEYVZpbmNpIFJlc29sdmUgY291bGRuJ3QgYmUg c2V0IHVwIHRvIHJlbmRlciBhdWRpby4iKQoKCiMgSG93IG1hbnkgY29uc2VjdXRpdmUgcG9sbHMg KGFib3V0IDAuNSBzIGFwYXJ0KSBhIHN0YXJ0ZWQgam9iIG1heSBsb29rIGlkbGUgYmVmb3JlIGl0 CiMgY291bnRzIGFzIHN0b3BwZWQuIFJpZ2h0IGFmdGVyIFN0YXJ0UmVuZGVyaW5nLCBSZXNvbHZl IDIxLjEgcmVwb3J0ZWQgdGhlIGpvYiBhcwojICdSZW5kZXJpbmcnIGF0IDAgJSB3aGlsZSBJc1Jl bmRlcmluZ0luUHJvZ3Jlc3MoKSB3YXMgc3RpbGwgRmFsc2UgKHNlZW4gd2l0aCBGTEFDKS4KSURM RV9QT0xMU19CRUZPUkVfRkFJTElORyA9IDIwCgoKY2xhc3MgUmVuZGVySm9iOgogICAgIiIiUmVu ZGVyIG9uZSBhdWRpbyB0cmFjaydzIHJhbmdlIHRvIGFuIHVuY29tcHJlc3NlZCBhdWRpbyBmaWxl LgoKICAgIGBgc3RhcnQoKWBgLCBgYHBvbGwoKWBgLCBgYGNhbmNlbCgpYGAgYW5kIGBgY2xlYW51 cCgpYGAgbXVzdCBiZSBjYWxsZWQgb24gdGhlIFVJCiAgICB0aHJlYWQuIGBgY2xlYW51cCgpYGAg YWx3YXlzIHJlc3RvcmVzIHRoZSB0cmFja3MnIGVuYWJsZWQgc3RhdGVzIGFuZCB0aGUgcGFnZSwg YW5kCiAgICBkZWxldGVzIHRoZSByZW5kZXIgam9iLCBhbHNvIGFmdGVyIGVycm9ycyBhbmQgY2Fu Y2VsbGF0aW9uLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgIHNlbGYsCiAgICAg ICAgcmVzb2x2ZTogQW55LAogICAgICAgIHRyYWNrczogdHVwbGVbaW50LCAuLi5dLAogICAgICAg IGZyYW1lczogUmFuZ2UsCiAgICAgICAgdGFyZ2V0X2RpcjogUGF0aCwKICAgICAgICBuYW1lOiBz dHIsCiAgICAgICAgc2lsZW5jZTogdHVwbGVbdHVwbGVbaW50LCBpbnQsIGludF0sIC4uLl0gPSAo KSwKICAgICAgICBzb3VuZDogdHVwbGVbdHVwbGVbaW50LCBpbnQsIGludF0sIC4uLl0gPSAoKSwK ICAgICkgLT4gTm9uZToKICAgICAgICBzZWxmLnJlc29sdmUgPSByZXNvbHZlCiAgICAgICAgc2Vs Zi50cmFja3MgPSB0cmFja3MgICMgcmVuZGVyZWQgdG9nZXRoZXIgYXMgYSBtaXhkb3duCiAgICAg ICAgIyAodHJhY2ssIHN0YXJ0LCBlbmQpIG9mIGNsaXBzIHN3aXRjaGVkIG9mZiAvIG9uIGZvciB0 aGUgcmVuZGVyIChyZXN0b3JlZCBhZnRlcikKICAgICAgICBzZWxmLnNpbGVuY2UgPSBzaWxlbmNl CiAgICAgICAgc2VsZi5zb3VuZCA9IHNvdW5kCiAgICAgICAgc2VsZi5jaGFuZ2VkX2NsaXBzOiBs aXN0W3R1cGxlW0FueSwgYm9vbF1dID0gW10gICMgKGl0ZW0sIGl0cyBwcmV2aW91cyBzdGF0ZSkK ICAgICAgICBzZWxmLmZyYW1lcyA9IGZyYW1lcwogICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IHRh cmdldF9kaXIKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5wcm9qZWN0OiBB bnkgPSBOb25lCiAgICAgICAgc2VsZi50aW1lbGluZTogQW55ID0gTm9uZQogICAgICAgIHNlbGYu am9iX2lkOiBzdHIgfCBOb25lID0gTm9uZQogICAgICAgIHNlbGYuZXh0ZW5zaW9uID0gIndhdiIK ICAgICAgICBzZWxmLnBhZ2U6IEFueSA9IE5vbmUKICAgICAgICBzZWxmLnRyYWNrX3N0YXRlczog ZGljdFtpbnQsIGJvb2xdID0ge30KICAgICAgICBzZWxmLmNoYW5nZWRfdHJhY2tzOiBsaXN0W2lu dF0gPSBbXQogICAgICAgIHNlbGYuaWRsZV9wb2xscyA9IDAKICAgICAgICBzZWxmLnJlcG9ydGVk X3BhdGg6IFBhdGggfCBOb25lID0gTm9uZSAgIyB3aGVyZSBSZXNvbHZlIHNheXMgaXQgd2lsbCB3 cml0ZQogICAgICAgIHNlbGYuY2xlYW5lZF91cCA9IEZhbHNlCgogICAgQHByb3BlcnR5CiAgICBk ZWYgb3V0cHV0X3BhdGgoc2VsZikgLT4gUGF0aDoKICAgICAgICByZXR1cm4gc2VsZi50YXJnZXRf ZGlyIC8gZiJ7c2VsZi5uYW1lfS57c2VsZi5leHRlbnNpb259IgoKICAgIGRlZiBzdGFydChzZWxm KSAtPiBOb25lOgogICAgICAgIHNlbGYucHJvamVjdCwgc2VsZi50aW1lbGluZSA9IGN1cnJlbnRf dGltZWxpbmUoc2VsZi5yZXNvbHZlKQogICAgICAgIHNlbGYucGFnZSA9IF9jYWxsKHNlbGYucmVz b2x2ZSwgIkdldEN1cnJlbnRQYWdlIikKICAgICAgICBzZWxmLl9pc29sYXRlX3RyYWNrKCkKICAg ICAgICBleHRyYSwgc2VsZi5leHRlbnNpb24gPSBfYXVkaW9fcmVuZGVyX2Zvcm1hdChzZWxmLnBy b2plY3QpCiAgICAgICAgc2V0dGluZ3MgPSB7CiAgICAgICAgICAgICJTZWxlY3RBbGxGcmFtZXMi OiBGYWxzZSwKICAgICAgICAgICAgIk1hcmtJbiI6IHNlbGYuZnJhbWVzLnN0YXJ0LAogICAgICAg ICAgICAjIFRoZSByZW5kZXIgcmFuZ2UncyBNYXJrT3V0IGlzIHRoZSBsYXN0IGZyYW1lICppbmNs dWRlZCogKHVubGlrZQogICAgICAgICAgICAjIEdldE1hcmtJbk91dCk7IHZlcmlmaWVkIGJ5IG1l YXN1cmluZyB0aGUgcmVuZGVyZWQgbGVuZ3RoIChzZWUgYXVkaW9maWxlKS4KICAgICAgICAgICAg Ik1hcmtPdXQiOiBzZWxmLmZyYW1lcy5lbmQgLSAxLAogICAgICAgICAgICAiVGFyZ2V0RGlyIjog c3RyKHNlbGYudGFyZ2V0X2RpciksCiAgICAgICAgICAgICJDdXN0b21OYW1lIjogc2VsZi5uYW1l LAogICAgICAgICAgICAiRXhwb3J0VmlkZW8iOiBGYWxzZSwKICAgICAgICAgICAgIkV4cG9ydEF1 ZGlvIjogVHJ1ZSwKICAgICAgICAgICAgIkF1ZGlvQml0RGVwdGgiOiAyNCwKICAgICAgICAgICAg IkF1ZGlvU2FtcGxlUmF0ZSI6IDQ4MDAwLAogICAgICAgICAgICAqKmV4dHJhLAogICAgICAgIH0K ICAgICAgICBsb2cuZGVidWcoZiJyZW5kZXIgc2V0dGluZ3M6IHtzZXR0aW5nc30iKQogICAgICAg IGlmIG5vdCBfY2FsbChzZWxmLnByb2plY3QsICJTZXRSZW5kZXJTZXR0aW5ncyIsIHNldHRpbmdz LCBkZWZhdWx0PUZhbHNlKToKICAgICAgICAgICAgcmFpc2UgUmVuZGVyRXJyb3IoIkRhVmluY2kg UmVzb2x2ZSBkaWRuJ3QgYWNjZXB0IHRoZSByZW5kZXIgc2V0dGluZ3MuIikKICAgICAgICBqb2Jf aWQgPSBfY2FsbChzZWxmLnByb2plY3QsICJBZGRSZW5kZXJKb2IiKQogICAgICAgIGlmIG5vdCBp c2luc3RhbmNlKGpvYl9pZCwgc3RyKSBvciBub3Qgam9iX2lkOgogICAgICAgICAgICByYWlzZSBS ZW5kZXJFcnJvcigiRGFWaW5jaSBSZXNvbHZlIGNvdWxkbid0IGFkZCB0aGUgcmVuZGVyIGpvYi4i KQogICAgICAgIHNlbGYuam9iX2lkID0gam9iX2lkCiAgICAgICAgc2VsZi5yZXBvcnRlZF9wYXRo ID0gc2VsZi5fam9iX291dHB1dF9wYXRoKGpvYl9pZCkKICAgICAgICBpZiBub3Qgc2VsZi5fc3Rh cnRfcmVuZGVyaW5nKGpvYl9pZCk6CiAgICAgICAgICAgIHJhaXNlIFJlbmRlckVycm9yKAogICAg ICAgICAgICAgICAgIkRhVmluY2kgUmVzb2x2ZSBjb3VsZG4ndCBzdGFydCByZW5kZXJpbmcuIENo ZWNrIHRoZSBEZWxpdmVyIHBhZ2UgZm9yICIKICAgICAgICAgICAgICAgICJhIHdhcm5pbmcgKGZv ciBleGFtcGxlLCBvZmZsaW5lIG1lZGlhKSBhbmQgdHJ5IGFnYWluLiIKICAgICAgICAgICAgKQog ICAgICAgIGxvZy5kZWJ1ZyhmInJlbmRlciBqb2Ige2pvYl9pZH0gc3RhcnRlZCAtPiB7c2VsZi5y ZXBvcnRlZF9wYXRoIG9yIHNlbGYub3V0cHV0X3BhdGh9IikKCiAgICBkZWYgX3N0YXJ0X3JlbmRl cmluZyhzZWxmLCBqb2JfaWQ6IHN0cikgLT4gYm9vbDoKICAgICAgICAiIiJTdGFydCBvbmx5IG91 ciBqb2IuIExvZ3Mgd2h5IFJlc29sdmUgcmVmdXNlZCwgd2hpY2ggaXQgZG9lc24ndCBleHBsYWlu LiIiIgogICAgICAgICMgRG9jdW1lbnRlZCBmb3JtczogU3RhcnRSZW5kZXJpbmcoW2pvYklkc10s IGlzSW50ZXJhY3RpdmVNb2RlKSBhbmQKICAgICAgICAjIFN0YXJ0UmVuZGVyaW5nKGpvYklkMSwg Li4uKS4gVHJ5IHRoZSBzZWNvbmQgb25lIGlmIHRoZSBmaXJzdCBpcyByZWZ1c2VkLgogICAgICAg IGZvciBhcmdzIGluICgoW2pvYl9pZF0sIEZhbHNlKSwgKGpvYl9pZCwpKToKICAgICAgICAgICAg dHJ5OgogICAgICAgICAgICAgICAgc3RhcnRlZCA9IHNlbGYucHJvamVjdC5TdGFydFJlbmRlcmlu ZygqYXJncykKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAg ICAgICBsb2cuZGVidWcoZiJTdGFydFJlbmRlcmluZ3thcmdzIXJ9IHJhaXNlZCB7ZXhjIXJ9IikK ICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGxvZy5kZWJ1ZyhmIlN0YXJ0UmVu ZGVyaW5ne2FyZ3Mhcn0gLT4ge3N0YXJ0ZWQhcn0iKQogICAgICAgICAgICBpZiBzdGFydGVkOgog ICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBqb2JzID0gX2NhbGwoc2VsZi5wcm9q ZWN0LCAiR2V0UmVuZGVySm9iTGlzdCIsIGRlZmF1bHQ9W10pIG9yIFtdCiAgICAgICAgbG9nLmVy cm9yKAogICAgICAgICAgICAiUmVzb2x2ZSByZWZ1c2VkIHRvIHN0YXJ0IHJlbmRlcmluZzogIgog ICAgICAgICAgICBmInJlbmRlcmluZyBpbiBwcm9ncmVzcyB7X2NhbGwoc2VsZi5wcm9qZWN0LCAn SXNSZW5kZXJpbmdJblByb2dyZXNzJykhcn0sICIKICAgICAgICAgICAgZiJqb2Igc3RhdHVzIHtf Y2FsbChzZWxmLnByb2plY3QsICdHZXRSZW5kZXJKb2JTdGF0dXMnLCBqb2JfaWQpIXJ9LCAiCiAg ICAgICAgICAgIGYie2xlbihqb2JzKSBpZiBpc2luc3RhbmNlKGpvYnMsIGxpc3QpIGVsc2UgJz8n fSBqb2IocykgaW4gdGhlIHJlbmRlciBxdWV1ZSwgIgogICAgICAgICAgICBmInBhZ2Uge19jYWxs KHNlbGYucmVzb2x2ZSwgJ0dldEN1cnJlbnRQYWdlJykhcn0iCiAgICAgICAgKQogICAgICAgIHJl dHVybiBGYWxzZQoKICAgIGRlZiBfam9iX291dHB1dF9wYXRoKHNlbGYsIGpvYl9pZDogc3RyKSAt PiBQYXRoIHwgTm9uZToKICAgICAgICAiIiJUaGUgZmlsZSBSZXNvbHZlJ3MgcmVuZGVyIHF1ZXVl IHNheXMgdGhpcyBqb2Igd3JpdGVzIChUYXJnZXREaXIvT3V0cHV0RmlsZW5hbWUpLiIiIgogICAg ICAgIGpvYnMgPSBfY2FsbChzZWxmLnByb2plY3QsICJHZXRSZW5kZXJKb2JMaXN0IiwgZGVmYXVs dD1bXSkgb3IgW10KICAgICAgICBmb3Igam9iIGluIGpvYnMgaWYgaXNpbnN0YW5jZShqb2JzLCBs aXN0KSBlbHNlIFtdOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGpvYiwgZGljdCkgYW5kIGpv Yi5nZXQoIkpvYklkIikgPT0gam9iX2lkOgogICAgICAgICAgICAgICAgbG9nLmRlYnVnKGYicmVu ZGVyIGpvYiBhcyBxdWV1ZWQ6IHtqb2J9IikKICAgICAgICAgICAgICAgIG5hbWUgPSBzdHIoam9i LmdldCgiT3V0cHV0RmlsZW5hbWUiKSBvciAiIikKICAgICAgICAgICAgICAgIGZvbGRlciA9IHN0 cihqb2IuZ2V0KCJUYXJnZXREaXIiKSBvciBzZWxmLnRhcmdldF9kaXIpCiAgICAgICAgICAgICAg ICByZXR1cm4gUGF0aChmb2xkZXIpIC8gbmFtZSBpZiBuYW1lIGVsc2UgTm9uZQogICAgICAgIHJl dHVybiBOb25lCgogICAgZGVmIGZpbmRfb3V0cHV0KHNlbGYpIC0+IFBhdGggfCBOb25lOgogICAg ICAgICIiIlRoZSByZW5kZXJlZCBmaWxlOiB3aGVyZSBSZXNvbHZlIHNhaWQsIHdoZXJlIHdlIGFz a2VkLCBvciB0aGUgb25seSBmaWxlIHRoZXJlLiIiIgogICAgICAgIGZvciBwYXRoIGluIChzZWxm LnJlcG9ydGVkX3BhdGgsIHNlbGYub3V0cHV0X3BhdGgpOgogICAgICAgICAgICBpZiBwYXRoIGlz IG5vdCBOb25lIGFuZCBwYXRoLmlzX2ZpbGUoKToKICAgICAgICAgICAgICAgIHJldHVybiBwYXRo CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZW5kZXJlZCA9IHNvcnRlZChwIGZvciBwIGluIHNl bGYudGFyZ2V0X2Rpci5pdGVyZGlyKCkgaWYgcC5pc19maWxlKCkpCiAgICAgICAgZXhjZXB0IE9T RXJyb3I6CiAgICAgICAgICAgIHJlbmRlcmVkID0gW10KICAgICAgICBsb2cuZGVidWcoZiJyZW5k ZXIgZm9sZGVyIHtzZWxmLnRhcmdldF9kaXJ9IGNvbnRhaW5zOiB7W3AubmFtZSBmb3IgcCBpbiBy ZW5kZXJlZF19IikKICAgICAgICBuYW1lZCA9IFtwIGZvciBwIGluIHJlbmRlcmVkIGlmIHAubmFt ZS5zdGFydHN3aXRoKHNlbGYubmFtZSldCiAgICAgICAgaWYgbGVuKG5hbWVkKSA9PSAxOgogICAg ICAgICAgICByZXR1cm4gbmFtZWRbMF0KICAgICAgICByZXR1cm4gcmVuZGVyZWRbMF0gaWYgbGVu KHJlbmRlcmVkKSA9PSAxIGVsc2UgTm9uZQoKICAgIGRlZiBfaXNvbGF0ZV90cmFjayhzZWxmKSAt PiBOb25lOgogICAgICAgICIiIkVuYWJsZSBvbmx5IHRoZSBzZWxlY3RlZCB0cmFja3MsIGFuZCBz d2l0Y2ggb2ZmIHVuc2VsZWN0ZWQgY2xpcHMgaW4gdGhlIHJhbmdlLgoKICAgICAgICBFdmVyeSBj aGFuZ2VkIHRyYWNrIGFuZCBjbGlwIGlzIHJlbWVtYmVyZWQsIHRvIGJlIHJlc3RvcmVkIGJ5IGBg Y2xlYW51cCgpYGAuCiAgICAgICAgIiIiCiAgICAgICAgY291bnQgPSBpbnQoX2NhbGwoc2VsZi50 aW1lbGluZSwgIkdldFRyYWNrQ291bnQiLCAiYXVkaW8iLCBkZWZhdWx0PTApKQogICAgICAgIGZv ciBpbmRleCBpbiByYW5nZSgxLCBjb3VudCArIDEpOgogICAgICAgICAgICBlbmFibGVkID0gX2Nh bGwoc2VsZi50aW1lbGluZSwgIkdldElzVHJhY2tFbmFibGVkIiwgImF1ZGlvIiwgaW5kZXgsIGRl ZmF1bHQ9VHJ1ZSkKICAgICAgICAgICAgc2VsZi50cmFja19zdGF0ZXNbaW5kZXhdID0gYm9vbChl bmFibGVkKQogICAgICAgIGZvciBpbmRleCBpbiBzZWxmLnRyYWNrX3N0YXRlczoKICAgICAgICAg ICAgd2FudGVkID0gaW5kZXggaW4gc2VsZi50cmFja3MKICAgICAgICAgICAgaWYgc2VsZi50cmFj a19zdGF0ZXNbaW5kZXhdICE9IHdhbnRlZDoKICAgICAgICAgICAgICAgIHNlbGYuY2hhbmdlZF90 cmFja3MuYXBwZW5kKGluZGV4KQogICAgICAgICAgICAgICAgb2sgPSBfY2FsbChzZWxmLnRpbWVs aW5lLCAiU2V0VHJhY2tFbmFibGUiLCAiYXVkaW8iLCBpbmRleCwgd2FudGVkLCBkZWZhdWx0PUZh bHNlKQogICAgICAgICAgICAgICAgbG9nLmRlYnVnKGYiU2V0VHJhY2tFbmFibGUoYXVkaW8sIHtp bmRleH0sIHt3YW50ZWR9KSAtPiB7b2t9IikKICAgICAgICB0YXJnZXRzID0ge2tleTogRmFsc2Ug Zm9yIGtleSBpbiBzZWxmLnNpbGVuY2V9IHwge2tleTogVHJ1ZSBmb3Iga2V5IGluIHNlbGYuc291 bmR9CiAgICAgICAgZm9yIHRyYWNrIGluIHNvcnRlZCh7a2V5WzBdIGZvciBrZXkgaW4gdGFyZ2V0 c30pOgogICAgICAgICAgICBpdGVtcyA9IF9jYWxsKHNlbGYudGltZWxpbmUsICJHZXRJdGVtTGlz dEluVHJhY2siLCAiYXVkaW8iLCB0cmFjaywgZGVmYXVsdD1bXSkgb3IgW10KICAgICAgICAgICAg Zm9yIGl0ZW0gaW4gaXRlbXMudmFsdWVzKCkgaWYgaXNpbnN0YW5jZShpdGVtcywgZGljdCkgZWxz ZSBpdGVtczoKICAgICAgICAgICAgICAgIGtleSA9ICgKICAgICAgICAgICAgICAgICAgICB0cmFj aywKICAgICAgICAgICAgICAgICAgICBpbnQoX2NhbGwoaXRlbSwgIkdldFN0YXJ0IiwgZGVmYXVs dD0wKSksCiAgICAgICAgICAgICAgICAgICAgaW50KF9jYWxsKGl0ZW0sICJHZXRFbmQiLCBkZWZh dWx0PTApKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4g dGFyZ2V0czoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZW5h YmxlZCA9IGJvb2woX2NhbGwoaXRlbSwgIkdldENsaXBFbmFibGVkIiwgZGVmYXVsdD1UcnVlKSkK ICAgICAgICAgICAgICAgIGlmIGVuYWJsZWQgIT0gdGFyZ2V0c1trZXldIGFuZCBfY2FsbCgKICAg ICAgICAgICAgICAgICAgICBpdGVtLCAiU2V0Q2xpcEVuYWJsZWQiLCB0YXJnZXRzW2tleV0sIGRl ZmF1bHQ9RmFsc2UKICAgICAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5j aGFuZ2VkX2NsaXBzLmFwcGVuZCgoaXRlbSwgZW5hYmxlZCkpCiAgICAgICAgaWYgc2VsZi5jaGFu Z2VkX2NsaXBzOgogICAgICAgICAgICBsb2cuZGVidWcoZiJzd2l0Y2hlZCB7bGVuKHNlbGYuY2hh bmdlZF9jbGlwcyl9IGNsaXAocykgb24gb3Igb2ZmIGZvciB0aGUgcmVuZGVyIikKCiAgICBkZWYg cG9sbChzZWxmKSAtPiBmbG9hdCB8IE5vbmU6CiAgICAgICAgIiIiUHJvZ3Jlc3MgMC4uMSB3aGls ZSByZW5kZXJpbmcsIGBgTm9uZWBgIHdoZW4gZmluaXNoZWQuIFJhaXNlcyBSZW5kZXJFcnJvci4i IiIKICAgICAgICBpZiBzZWxmLmpvYl9pZCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBSZW5k ZXJFcnJvcigKICAgICAgICAgICAgICAgICJEYVZpbmNpIFJlc29sdmUgZGlkbid0IHN0YXJ0IHJl bmRlcmluZy4gQ2hlY2sgdGhlIERlbGl2ZXIgcGFnZSwgdGhlbiB0cnkgYWdhaW4uIgogICAgICAg ICAgICApCiAgICAgICAgc3RhdHVzID0gX2NhbGwoc2VsZi5wcm9qZWN0LCAiR2V0UmVuZGVySm9i U3RhdHVzIiwgc2VsZi5qb2JfaWQsIGRlZmF1bHQ9e30pIG9yIHt9CiAgICAgICAgcGVyY2VudCA9 IGZsb2F0KHN0YXR1cy5nZXQoIkNvbXBsZXRpb25QZXJjZW50YWdlIikgb3IgMCkKICAgICAgICBl cnJvciA9IHN0cihzdGF0dXMuZ2V0KCJFcnJvciIpIG9yICIiKQogICAgICAgIGluX3Byb2dyZXNz ID0gYm9vbChfY2FsbChzZWxmLnByb2plY3QsICJJc1JlbmRlcmluZ0luUHJvZ3Jlc3MiLCBkZWZh dWx0PUZhbHNlKSkKICAgICAgICBpZiBlcnJvcjoKICAgICAgICAgICAgbG9nLmVycm9yKGYicmVu ZGVyIGpvYiBzdGF0dXM6IHtzdGF0dXN9IikKICAgICAgICAgICAgcmFpc2UgUmVuZGVyRXJyb3Io ZiJEYVZpbmNpIFJlc29sdmUgcmVwb3J0ZWQgYSByZW5kZXIgZXJyb3I6IHtlcnJvcn0iKQogICAg ICAgIGlmIHBlcmNlbnQgPj0gMTAwIGFuZCBub3QgaW5fcHJvZ3Jlc3M6CiAgICAgICAgICAgIHJl dHVybiBOb25lCiAgICAgICAgaWYgaW5fcHJvZ3Jlc3M6CiAgICAgICAgICAgIHNlbGYuaWRsZV9w b2xscyA9IDAKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE5vdCByZW5kZXJpbmcgYW5kIG5v dCBmaW5pc2hlZDogdGhlIGpvYiBtYXkgc3RpbGwgYmUgc3RhcnRpbmcgdXAsIHNvIG9ubHkKICAg ICAgICAgICAgIyBnaXZlIHVwIGFmdGVyIGEgd2hpbGUuIChKb2JTdGF0dXMgaXMgbG9jYWxpemVk LCBzbyBpdCBpc24ndCBjaGVja2VkLikKICAgICAgICAgICAgc2VsZi5pZGxlX3BvbGxzICs9IDEK ICAgICAgICAgICAgaWYgc2VsZi5pZGxlX3BvbGxzID49IElETEVfUE9MTFNfQkVGT1JFX0ZBSUxJ Tkc6CiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZiJyZW5kZXIgam9iIHN0b3BwZWQgZWFybHk6 IHtzdGF0dXN9IikKICAgICAgICAgICAgICAgIHJhaXNlIFJlbmRlckVycm9yKAogICAgICAgICAg ICAgICAgICAgICJSZW5kZXJpbmcgc3RvcHBlZCBiZWZvcmUgaXQgd2FzIGZpbmlzaGVkLiBDaGVj ayB0aGUgcmVuZGVyIHF1ZXVlIG9uICIKICAgICAgICAgICAgICAgICAgICAidGhlIERlbGl2ZXIg cGFnZSwgdGhlbiB0cnkgYWdhaW4uIgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBsb2cu ZGVidWcoZiJyZW5kZXIgam9iIG5vdCBydW5uaW5nIHlldCAoe3NlbGYuaWRsZV9wb2xsc30pOiB7 c3RhdHVzfSIpCiAgICAgICAgcmV0dXJuIHBlcmNlbnQgLyAxMDAKCiAgICBkZWYgY2FuY2VsKHNl bGYpIC0+IE5vbmU6CiAgICAgICAgX2NhbGwoc2VsZi5wcm9qZWN0LCAiU3RvcFJlbmRlcmluZyIp CgogICAgZGVmIGNsZWFudXAoc2VsZikgLT4gTm9uZToKICAgICAgICAiIiJEZWxldGUgdGhlIGpv YiwgcmVzdG9yZSB0aGUgdHJhY2tzIGFuZCB0aGUgcGFnZS4gTmV2ZXIgcmFpc2VzLiIiIgogICAg ICAgIGlmIHNlbGYuY2xlYW5lZF91cDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5j bGVhbmVkX3VwID0gVHJ1ZQogICAgICAgIGlmIHNlbGYuam9iX2lkIGlzIG5vdCBOb25lIGFuZCBz ZWxmLnByb2plY3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIF9jYWxsKHNlbGYucHJvamVj dCwgIklzUmVuZGVyaW5nSW5Qcm9ncmVzcyIsIGRlZmF1bHQ9RmFsc2UpOgogICAgICAgICAgICAg ICAgX2NhbGwoc2VsZi5wcm9qZWN0LCAiU3RvcFJlbmRlcmluZyIpCiAgICAgICAgICAgIF9jYWxs KHNlbGYucHJvamVjdCwgIkRlbGV0ZVJlbmRlckpvYiIsIHNlbGYuam9iX2lkKQogICAgICAgICMg UmVzdG9yZSB1bmNvbmRpdGlvbmFsbHk6IGluIFJlc29sdmUgMjEuMSBHZXRJc1RyYWNrRW5hYmxl ZCgpIHN0aWxsIHJlcG9ydGVkIGEKICAgICAgICAjIHRyYWNrIGFzIGVuYWJsZWQgcmlnaHQgYWZ0 ZXIgU2V0VHJhY2tFbmFibGUoRmFsc2UpLCBzbyByZWFkcyBjYW4ndCBiZSB0cnVzdGVkLgogICAg ICAgIGZvciBpbmRleCBpbiBzZWxmLmNoYW5nZWRfdHJhY2tzOgogICAgICAgICAgICBfY2FsbChz ZWxmLnRpbWVsaW5lLCAiU2V0VHJhY2tFbmFibGUiLCAiYXVkaW8iLCBpbmRleCwgc2VsZi50cmFj a19zdGF0ZXNbaW5kZXhdKQogICAgICAgIGZvciBpdGVtLCBlbmFibGVkIGluIHNlbGYuY2hhbmdl ZF9jbGlwczoKICAgICAgICAgICAgX2NhbGwoaXRlbSwgIlNldENsaXBFbmFibGVkIiwgZW5hYmxl ZCkKICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYucGFnZSwgc3RyKSBhbmQgc2VsZi5wYWdlOgog ICAgICAgICAgICBfY2FsbChzZWxmLnJlc29sdmUsICJPcGVuUGFnZSIsIHNlbGYucGFnZSkKUEsD BBQAAAAAABRbal1SCeDMGR0AABkdAAAdAAAAYXVwaG9uaWNfcmVzb2x2ZS9zZWxlY3Rpb24ucHki IiJXaGF0IHRoZSB1c2VyIHNlbGVjdGVkICh0cmFja3MgYW5kIGNsaXBzKSBhbmQgd2hhdCB0aGF0 IG1lYW5zIGZvciBwcm9jZXNzaW5nLgoKVGhlIHVzZXIgdGlja3Mgd2hvbGUgdHJhY2tzIGFuZC9v ciBzaW5nbGUgY2xpcHMsIGluIHRoZSB3aW5kb3cncyB0cmFjay9jbGlwIGxpc3Qgb3IgYnkKc2Vs ZWN0aW5nIGNsaXBzIGluIFJlc29sdmUncyB0aW1lbGluZS4gRXZlcnl0aGluZyBzZWxlY3RlZCBp cyByZW5kZXJlZCB0b2dldGhlciBhcyBvbmUKbWl4ZG93biBhbmQgcHJvY2Vzc2VkIGFzIG9uZSBw cm9kdWN0aW9uIChsaWtlIEF1cGhvbmljJ3MgQWRvYmUgZXh0ZW5zaW9ucykuCgotIEEgKip3aG9s ZSB0cmFjayoqIG1lYW5zIGFsbCBpdHMgY2xpcHMuIFRoZSB0aW1lbGluZSdzIGluL291dCBwb2lu dHMgbGltaXQgaXQsIHVubGVzcwogIHNpbmdsZSBjbGlwcyBhcmUgc2VsZWN0ZWQgdG9vIChjaG9v c2luZyBjbGlwcyBpcyBhbiBleHBsaWNpdCBzZWxlY3Rpb24sIHNvIGluL291dAogIHBvaW50cyBh cmUgaWdub3JlZCB0aGVuLCBhcyBmb3IgYSBzaW5nbGUgY2xpcCBiZWZvcmUpLgotICoqU2luZ2xl IGNsaXBzKiogYXJlIHByb2Nlc3NlZCBjb21wbGV0ZWx5LiBPdGhlciBjbGlwcyBvbiB0aGVpciB0 cmFja3MgdGhhdCBmYWxsIGludG8KICB0aGUgcHJvY2Vzc2VkIHJhbmdlIGFyZSBzd2l0Y2hlZCBv ZmYgZm9yIHRoZSByZW5kZXIuCi0gR2FwcyBpbnNpZGUgdGhlIHJhbmdlIGFyZSByZW5kZXJlZCBh cyBzaWxlbmNlLCB3aGljaCBrZWVwcyB0aGUgcmVzdWx0IGluIHN5bmMuCiIiIgoKZnJvbSBfX2Z1 dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNs YXNzLCBmaWVsZAoKZnJvbSAudGltaW5nIGltcG9ydCBSYW5nZQoKQ2xpcEtleSA9IHR1cGxlW2lu dCwgaW50LCBpbnRdICAjICh0cmFjayBpbmRleCwgc3RhcnQgZnJhbWUsIGVuZCBmcmFtZSk7IGNs aXBzIGRvbid0IG92ZXJsYXAKCgpAZGF0YWNsYXNzKGZyb3plbj1UcnVlKQpjbGFzcyBDaG9pY2U6 CiAgICAiIiJUaGUgdGlja2VkIHRyYWNrcyBhbmQgY2xpcHMuIEEgdHJhY2sgaXMgZWl0aGVyIHdo b2xlIG9yIGhhcyBzaW5nbGUgY2xpcHMgdGlja2VkLiIiIgoKICAgIHdob2xlX3RyYWNrczogZnJv emVuc2V0W2ludF0gPSBmcm96ZW5zZXQoKQogICAgY2xpcHM6IGZyb3plbnNldFtDbGlwS2V5XSA9 IGZyb3plbnNldCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZW1wdHkoc2VsZikgLT4gYm9vbDoK ICAgICAgICByZXR1cm4gbm90IHNlbGYud2hvbGVfdHJhY2tzIGFuZCBub3Qgc2VsZi5jbGlwcwoK ICAgIGRlZiB0cmFja3Moc2VsZikgLT4gc2V0W2ludF06CiAgICAgICAgcmV0dXJuIHNldChzZWxm Lndob2xlX3RyYWNrcykgfCB7dHJhY2sgZm9yIHRyYWNrLCBfLCBfIGluIHNlbGYuY2xpcHN9Cgog ICAgZGVmIGNsaXBzX29uKHNlbGYsIHRyYWNrOiBpbnQpIC0+IHNldFtDbGlwS2V5XToKICAgICAg ICByZXR1cm4ge2tleSBmb3Iga2V5IGluIHNlbGYuY2xpcHMgaWYga2V5WzBdID09IHRyYWNrfQoK ICAgICMgLS0gZWRpdGluZyAodGhlIHJlc3VsdCBpcyBub3JtYWxpemVkIGFnYWluc3QgdGhlIGN1 cnJlbnQgdGltZWxpbmUpIC0tLS0tLS0tLS0tLS0KCiAgICBkZWYgdG9nZ2xlX3RyYWNrKHNlbGYs IHRyYWNrOiBpbnQsIGNoZWNrZWQ6IGJvb2wpIC0+IENob2ljZToKICAgICAgICBjbGlwcyA9IGZy b3plbnNldChrIGZvciBrIGluIHNlbGYuY2xpcHMgaWYga1swXSAhPSB0cmFjaykKICAgICAgICB3 aG9sZSA9IHNlbGYud2hvbGVfdHJhY2tzIHwge3RyYWNrfSBpZiBjaGVja2VkIGVsc2Ugc2VsZi53 aG9sZV90cmFja3MgLSB7dHJhY2t9CiAgICAgICAgcmV0dXJuIENob2ljZShmcm96ZW5zZXQod2hv bGUpLCBjbGlwcykKCiAgICBkZWYgdG9nZ2xlX2NsaXAoc2VsZiwga2V5OiBDbGlwS2V5LCBjaGVj a2VkOiBib29sLCB0cmFja19jbGlwczogbGlzdFtDbGlwS2V5XSkgLT4gQ2hvaWNlOgogICAgICAg IHRyYWNrID0ga2V5WzBdCiAgICAgICAgaWYgdHJhY2sgaW4gc2VsZi53aG9sZV90cmFja3M6ICAj IHVudGlja2luZyBvbmUgY2xpcCBvZiBhIHdob2xlIHRyYWNrCiAgICAgICAgICAgIGNsaXBzID0g c2V0KHNlbGYuY2xpcHMpIHwgc2V0KHRyYWNrX2NsaXBzKQogICAgICAgICAgICB3aG9sZSA9IHNl dChzZWxmLndob2xlX3RyYWNrcykgLSB7dHJhY2t9CiAgICAgICAgZWxzZToKICAgICAgICAgICAg Y2xpcHMsIHdob2xlID0gc2V0KHNlbGYuY2xpcHMpLCBzZXQoc2VsZi53aG9sZV90cmFja3MpCiAg ICAgICAgaWYgY2hlY2tlZDoKICAgICAgICAgICAgY2xpcHMuYWRkKGtleSkKICAgICAgICBlbHNl OgogICAgICAgICAgICBjbGlwcy5kaXNjYXJkKGtleSkKICAgICAgICByZXR1cm4gQ2hvaWNlKGZy b3plbnNldCh3aG9sZSksIGZyb3plbnNldChjbGlwcykpCgogICAgZGVmIG5vcm1hbGl6ZWQoc2Vs ZiwgdHJhY2tfY2xpcHM6IGRpY3RbaW50LCBsaXN0W0NsaXBLZXldXSkgLT4gQ2hvaWNlOgogICAg ICAgICIiIkRyb3Agd2hhdCBubyBsb25nZXIgZXhpc3RzIChhbmQgZW1wdHkgdHJhY2tzOiB0aGVy ZSdzIG5vdGhpbmcgdG8gdGljayk7IGEKICAgICAgICB0cmFjayB3aXRoIGFsbCBpdHMgY2xpcHMg dGlja2VkIGJlY29tZXMgd2hvbGUuIiIiCiAgICAgICAgd2hvbGUgPSB7dCBmb3IgdCBpbiBzZWxm Lndob2xlX3RyYWNrcyBpZiB0cmFja19jbGlwcy5nZXQodCl9CiAgICAgICAgY2xpcHMgPSB7ayBm b3IgayBpbiBzZWxmLmNsaXBzIGlmIGtbMF0gaW4gdHJhY2tfY2xpcHMgYW5kIGsgaW4gdHJhY2tf Y2xpcHNba1swXV19CiAgICAgICAgZm9yIHRyYWNrLCBrZXlzIGluIHRyYWNrX2NsaXBzLml0ZW1z KCk6CiAgICAgICAgICAgIGlmIGtleXMgYW5kIHNldChrZXlzKSA8PSBjbGlwczoKICAgICAgICAg ICAgICAgIHdob2xlLmFkZCh0cmFjaykKICAgICAgICBjbGlwcyA9IHtrIGZvciBrIGluIGNsaXBz IGlmIGtbMF0gbm90IGluIHdob2xlfQogICAgICAgIHJldHVybiBDaG9pY2UoZnJvemVuc2V0KHdo b2xlKSwgZnJvemVuc2V0KGNsaXBzKSkKCgpAZGF0YWNsYXNzKGZyb3plbj1UcnVlKQpjbGFzcyBU cmFja1BhcnQ6CiAgICAiIiJPbmUgc2VsZWN0ZWQgdHJhY2s6IHdoYXQgaXMgcHJvY2Vzc2VkIG9u IGl0IGFuZCBob3cgdG8gZGlzYWJsZSBpdCBhZnRlcndhcmRzLiIiIgoKICAgIHRyYWNrOiBpbnQK ICAgIGxhYmVsOiBzdHIKICAgIHdob2xlOiBib29sCiAgICBjbGlwczogdHVwbGVbQ2xpcEtleSwg Li4uXSAgIyB0aGUgY2xpcHMgdGhhdCBzb3VuZCBpbiB0aGUgcmVuZGVyIChvdmVybGFwcGluZyB0 aGUgcmFuZ2UpCiAgICBsaW1pdGVkOiBib29sID0gRmFsc2UgICMgd2hvbGUsIGJ1dCBsaW1pdGVk IGJ5IHRoZSBpbi9vdXQgcG9pbnRzCiAgICBuYW1lczogdHVwbGVbc3RyLCAuLi5dID0gKCkgICMg Y2xpcCBuYW1lcywgZm9yIHNpbmdsZSBjbGlwcwoKCkBkYXRhY2xhc3MoZnJvemVuPVRydWUpCmNs YXNzIFNlbGVjdGlvbjoKICAgICIiIlRoZSByYW5nZSB0byBwcm9jZXNzLCB0aGUgcGFydHMgaXQg Y29uc2lzdHMgb2YsIGFuZCBhIG5vdGUgZm9yIHRoZSB1c2VyLiIiIgoKICAgIHJhbmdlOiBSYW5n ZSB8IE5vbmUKICAgIG5vdGU6IHN0cgogICAgcGFydHM6IHR1cGxlW1RyYWNrUGFydCwgLi4uXSA9 ICgpCiAgICBzaWxlbmNlOiB0dXBsZVtDbGlwS2V5LCAuLi5dID0gZmllbGQoZGVmYXVsdD0oKSkg ICMgc3dpdGNoZWQgb2ZmIGR1cmluZyB0aGUgcmVuZGVyCgogICAgQHByb3BlcnR5CiAgICBkZWYg b2soc2VsZikgLT4gYm9vbDoKICAgICAgICByZXR1cm4gc2VsZi5yYW5nZSBpcyBub3QgTm9uZSBh bmQgbm90IHNlbGYucmFuZ2UuZW1wdHkgYW5kIGJvb2woc2VsZi5wYXJ0cykKCiAgICBAcHJvcGVy dHkKICAgIGRlZiB0cmFja3Moc2VsZikgLT4gdHVwbGVbaW50LCAuLi5dOgogICAgICAgIHJldHVy biB0dXBsZShwYXJ0LnRyYWNrIGZvciBwYXJ0IGluIHNlbGYucGFydHMpCgogICAgZGVmIGRlc2Ny aWJlKHNlbGYpIC0+IHN0cjoKICAgICAgICAiIiJGb3IgdGhlIHN1bW1hcnksIGUuZy4gIkEyIOKA kyBEaWFsb2cgKGFsbCBjbGlwcykiIG9yICIyIGNsaXBzIG9uIEExIOKAkyDigKYgKyAxIG1vcmUi LiIiIgogICAgICAgIHRleHRzID0gW10KICAgICAgICBmb3IgcGFydCBpbiBzZWxmLnBhcnRzOgog ICAgICAgICAgICBpZiBwYXJ0Lndob2xlOgogICAgICAgICAgICAgICAgdGV4dHMuYXBwZW5kKGYi e3BhcnQubGFiZWx9ICh7J2luL291dCByYW5nZScgaWYgcGFydC5saW1pdGVkIGVsc2UgJ2FsbCBj bGlwcyd9KSIpCiAgICAgICAgICAgIGVsaWYgbGVuKHBhcnQuY2xpcHMpID09IDEgYW5kIHBhcnQu bmFtZXMgYW5kIHBhcnQubmFtZXNbMF06CiAgICAgICAgICAgICAgICB0ZXh0cy5hcHBlbmQoZiLi gJx7cGFydC5uYW1lc1swXX3igJ0gb24ge3BhcnQubGFiZWx9IikKICAgICAgICAgICAgZWxzZToK ICAgICAgICAgICAgICAgIGNvdW50ID0gbGVuKHBhcnQuY2xpcHMpCiAgICAgICAgICAgICAgICB0 ZXh0cy5hcHBlbmQoZiJ7Y291bnR9IGNsaXB7J3MnICogKGNvdW50ICE9IDEpfSBvbiB7cGFydC5s YWJlbH0iKQogICAgICAgIGlmIGxlbih0ZXh0cykgPiAxOgogICAgICAgICAgICByZXR1cm4gIk1p eGRvd24gb2YgIiArICIsICIuam9pbih0ZXh0cykKICAgICAgICByZXR1cm4gdGV4dHNbMF0gaWYg dGV4dHMgZWxzZSAi4oCTIgoKCmRlZiBwbGFuKAogICAgY2hvaWNlOiBDaG9pY2UsCiAgICB0cmFj a3M6IGRpY3RbaW50LCB0dXBsZVtzdHIsIGxpc3RbQ2xpcEtleV1dXSwKICAgIG1hcms6IFJhbmdl IHwgTm9uZSwKICAgIG1hcmtfbGFiZWw6IHN0ciA9ICIiLAogICAgbmFtZXM6IGRpY3RbQ2xpcEtl eSwgc3RyXSB8IE5vbmUgPSBOb25lLAopIC0+IFNlbGVjdGlvbjoKICAgICIiIlR1cm4gdGhlIHRp Y2tzIGludG8gYSByYW5nZSB0byByZW5kZXIuCgogICAgYGB0cmFja3NgYCBtYXBzIGVhY2ggYXVk aW8gdHJhY2sgaW5kZXggdG8gaXRzIGxhYmVsIGFuZCBpdHMgY2xpcHMgKHNvcnRlZCk7CiAgICBg YG5hbWVzYGAgZ2l2ZXMgY2xpcCBuYW1lcyBmb3IgdGhlIHN1bW1hcnkuCiAgICAiIiIKICAgIGlm IG5vdCB0cmFja3M6CiAgICAgICAgcmV0dXJuIFNlbGVjdGlvbihOb25lLCAiVGhlIHRpbWVsaW5l IGhhcyBubyBhdWRpbyB0cmFja3MuIikKICAgIGlmIGNob2ljZS5lbXB0eToKICAgICAgICByZXR1 cm4gU2VsZWN0aW9uKAogICAgICAgICAgICBOb25lLCAiVGljayB0aGUgdHJhY2tzIG9yIGNsaXBz IHRvIHByb2Nlc3MsIG9yIHNlbGVjdCBjbGlwcyBpbiB0aGUgdGltZWxpbmUuIgogICAgICAgICkK ICAgIHdoZXJlID0gZiIgKHttYXJrX2xhYmVsfSkiIGlmIG1hcmtfbGFiZWwgZWxzZSAiIgogICAg dXNlX21hcmsgPSBtYXJrIGlzIG5vdCBOb25lIGFuZCBub3QgY2hvaWNlLmNsaXBzCiAgICBzcGFu czogbGlzdFtSYW5nZV0gPSBbXQogICAgZm9yIHRyYWNrIGluIHNvcnRlZChjaG9pY2Uud2hvbGVf dHJhY2tzKToKICAgICAgICBrZXlzID0gdHJhY2tzLmdldCh0cmFjaywgKCIiLCBbXSkpWzFdCiAg ICAgICAgaWYga2V5czoKICAgICAgICAgICAgc3BhbnMuYXBwZW5kKFJhbmdlKG1pbihrWzFdIGZv ciBrIGluIGtleXMpLCBtYXgoa1syXSBmb3IgayBpbiBrZXlzKSkpCiAgICBzcGFucyArPSBbUmFu Z2Uoa1sxXSwga1syXSkgZm9yIGsgaW4gY2hvaWNlLmNsaXBzXQogICAgaWYgbm90IHNwYW5zOgog ICAgICAgIGxhYmVsID0gdHJhY2tzW21pbihjaG9pY2Uud2hvbGVfdHJhY2tzKV1bMF0gaWYgY2hv aWNlLndob2xlX3RyYWNrcyBlbHNlICIiCiAgICAgICAgcmV0dXJuIFNlbGVjdGlvbihOb25lLCBm IlRyYWNrIHtsYWJlbH0gaGFzIG5vIGNsaXBzLiIpCiAgICBiYXNlID0gUmFuZ2UobWluKHMuc3Rh cnQgZm9yIHMgaW4gc3BhbnMpLCBtYXgocy5lbmQgZm9yIHMgaW4gc3BhbnMpKQogICAgbm90ZSwg bGltaXRlZCA9ICIiLCBGYWxzZQogICAgaWYgdXNlX21hcms6CiAgICAgICAgYXNzZXJ0IG1hcmsg aXMgbm90IE5vbmUKICAgICAgICBlZmZlY3RpdmUgPSBiYXNlLmludGVyc2VjdChtYXJrKQogICAg ICAgIGlmIGVmZmVjdGl2ZS5lbXB0eToKICAgICAgICAgICAgcmV0dXJuIFNlbGVjdGlvbigKICAg ICAgICAgICAgICAgIGVmZmVjdGl2ZSwKICAgICAgICAgICAgICAgIGYiVGhlIHRpbWVsaW5lJ3Mg aW4vb3V0IHJhbmdle3doZXJlfSBkb2Vzbid0IG92ZXJsYXAgdGhlIHNlbGVjdGVkIGF1ZGlvLiAi CiAgICAgICAgICAgICAgICAiTW92ZSB0aGUgaW4vb3V0IHBvaW50cywgb3IgY2xpY2sgQ2xlYXIg SW4vT3V0IHRvIHByb2Nlc3MgYWxsIG9mIGl0LiIsCiAgICAgICAgICAgICkKICAgICAgICBpZiBl ZmZlY3RpdmUgIT0gYmFzZToKICAgICAgICAgICAgbGltaXRlZCA9IFRydWUKICAgICAgICAgICAg bm90ZSA9ICgKICAgICAgICAgICAgICAgIGYiTGltaXRlZCB0byB0aGUgdGltZWxpbmUncyBpbi9v dXQgcmFuZ2V7d2hlcmV9LiAiCiAgICAgICAgICAgICAgICAiVG8gcHJvY2VzcyBldmVyeXRoaW5n LCBjbGljayBDbGVhciBJbi9PdXQuIgogICAgICAgICAgICApCiAgICAgICAgYmFzZSA9IGVmZmVj dGl2ZQogICAgZWxpZiBtYXJrIGlzIG5vdCBOb25lIGFuZCBjaG9pY2UuY2xpcHMgYW5kIG1hcmsu aW50ZXJzZWN0KGJhc2UpICE9IGJhc2U6CiAgICAgICAgbm90ZSA9IGYiVGhlIGluL291dCBwb2lu dHN7d2hlcmV9IGFyZSBpZ25vcmVkLCBiZWNhdXNlIHNpbmdsZSBjbGlwcyBhcmUgc2VsZWN0ZWQu IgoKICAgIHBhcnRzLCBzaWxlbmNlID0gW10sIFtdCiAgICBmb3IgdHJhY2sgaW4gc29ydGVkKGNo b2ljZS50cmFja3MoKSk6CiAgICAgICAgbGFiZWwsIGtleXMgPSB0cmFja3MuZ2V0KHRyYWNrLCAo ZiJBe3RyYWNrfSIsIFtdKSkKICAgICAgICBvdmVybGFwcGluZyA9IFtrIGZvciBrIGluIGtleXMg aWYga1sxXSA8IGJhc2UuZW5kIGFuZCBrWzJdID4gYmFzZS5zdGFydF0KICAgICAgICBpZiB0cmFj ayBpbiBjaG9pY2Uud2hvbGVfdHJhY2tzOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoVHJhY2tQ YXJ0KHRyYWNrLCBsYWJlbCwgVHJ1ZSwgdHVwbGUob3ZlcmxhcHBpbmcpLCBsaW1pdGVkPWxpbWl0 ZWQpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNob3NlbiA9IHR1cGxlKGsgZm9yIGsgaW4g a2V5cyBpZiBrIGluIGNob2ljZS5jbGlwcykKICAgICAgICAgICAgY2hvc2VuX25hbWVzID0gdHVw bGUoKG5hbWVzIG9yIHt9KS5nZXQoaywgIiIpIGZvciBrIGluIGNob3NlbikKICAgICAgICAgICAg cGFydHMuYXBwZW5kKFRyYWNrUGFydCh0cmFjaywgbGFiZWwsIEZhbHNlLCBjaG9zZW4sIG5hbWVz PWNob3Nlbl9uYW1lcykpCiAgICAgICAgICAgIHNpbGVuY2UgKz0gW2sgZm9yIGsgaW4gb3Zlcmxh cHBpbmcgaWYgayBub3QgaW4gY2hvaWNlLmNsaXBzXQogICAgcmV0dXJuIFNlbGVjdGlvbihiYXNl LCBub3RlLCB0dXBsZShwYXJ0cyksIHR1cGxlKHNpbGVuY2UpKQpQSwMEFAAAAAAAFFtqXYFKQ6e8 GAAAvBgAABoAAABhdXBob25pY19yZXNvbHZlL3RpbWluZy5weSIiIkZyYW1lcywgc2Vjb25kcyBh bmQgdGltZWNvZGU7IHJhbmdlczsgbWFya2VycyB0byBjaGFwdGVycy4KCkFsbCBwb3NpdGlvbnMg YXJlICoqYWJzb2x1dGUgdGltZWxpbmUgZnJhbWVzKiogKFJlc29sdmUncyBgYEdldFN0YXJ0RnJh bWUoKWBgIHNwYWNlLAplLmcuIDg2NDAwIGZvciBhIDI0IGZwcyB0aW1lbGluZSBzdGFydGluZyBh dCAwMTowMDowMDowMCkuIFJhbmdlcyBhcmUgaGFsZi1vcGVuCmBgW3N0YXJ0LCBlbmQpYGAsIGxp a2UgUmVzb2x2ZSdzIGBgR2V0RW5kRnJhbWUoKWBgIGFuZCBgYFRpbWVsaW5lSXRlbS5HZXRFbmQo KWBgLgpTZWNvbmRzIGFyZSBvbmx5IGNvbXB1dGVkIGZvciBBdXBob25pYyBhbmQgZm9yIGRpc3Bs YXkuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IG1hdGgK ZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmZyb20gZnJhY3Rpb25zIGltcG9ydCBG cmFjdGlvbgoKCkBkYXRhY2xhc3MoZnJvemVuPVRydWUpCmNsYXNzIEZyYW1lUmF0ZToKICAgICIi IkEgdGltZWxpbmUgZnJhbWUgcmF0ZSwgZXhhY3QgKGUuZy4gMzAwMDAvMTAwMSBmb3IgMjkuOTcp LiIiIgoKICAgIGZwczogRnJhY3Rpb24KICAgIGRyb3BfZnJhbWU6IGJvb2wgPSBGYWxzZQoKICAg IEBwcm9wZXJ0eQogICAgZGVmIG5vbWluYWwoc2VsZikgLT4gaW50OgogICAgICAgICIiIkZyYW1l cyBwZXIgdGltZWNvZGUgc2Vjb25kICgzMCBmb3IgMjkuOTcpLiIiIgogICAgICAgIHJldHVybiBy b3VuZChzZWxmLmZwcykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBwYXJzZShjbHMsIHNldHRp bmc6IHN0ciwgZHJvcF9mcmFtZTogYm9vbCA9IEZhbHNlKSAtPiBGcmFtZVJhdGU6CiAgICAgICAg IiIiUGFyc2UgUmVzb2x2ZSdzIGBgdGltZWxpbmVGcmFtZVJhdGVgYCBzZXR0aW5nLCBlLmcuIGBg IjIzLjk3NiJgYCwgYGAiMjkuOTcgREYiYGAuCgogICAgICAgIE5UU0MgcmF0ZXMgKDIzLjk3Niwg MjkuOTcsIDQ3Ljk1MiwgNTkuOTQsIDExOS44OCkgYmVjb21lIGV4YWN0IGBgbioxMDAwLzEwMDFg YAogICAgICAgIGZyYWN0aW9ucy4gRHJvcC1mcmFtZSBvbmx5IGV4aXN0cyBmb3IgMjkuOTcgYW5k IDU5Ljk0IGFuZCBpcyBpZ25vcmVkIG90aGVyd2lzZS4KICAgICAgICAiIiIKICAgICAgICB0ZXh0 ID0gc3RyKHNldHRpbmcpLnN0cmlwKCkudXBwZXIoKQogICAgICAgIGRyb3BfZnJhbWUgPSBkcm9w X2ZyYW1lIG9yICJERiIgaW4gdGV4dC5zcGxpdCgpCiAgICAgICAgdmFsdWUgPSBmbG9hdCh0ZXh0 LnNwbGl0KClbMF0pCiAgICAgICAgaWYgdmFsdWUgPD0gMDoKICAgICAgICAgICAgcmFpc2UgVmFs dWVFcnJvcihmImludmFsaWQgZnJhbWUgcmF0ZToge3NldHRpbmchcn0iKQogICAgICAgIHdob2xl ID0gcm91bmQodmFsdWUpCiAgICAgICAgaWYgYWJzKHZhbHVlIC0gd2hvbGUpIDwgMWUtNjoKICAg ICAgICAgICAgZnBzID0gRnJhY3Rpb24od2hvbGUpCiAgICAgICAgZWxpZiBhYnModmFsdWUgLSB3 aG9sZSAqIDEwMDAgLyAxMDAxKSA8IDAuMDE6CiAgICAgICAgICAgIGZwcyA9IEZyYWN0aW9uKHdo b2xlICogMTAwMCwgMTAwMSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmcHMgPSBGcmFjdGlv bih2YWx1ZSkubGltaXRfZGVub21pbmF0b3IoMTAwMSkKICAgICAgICBpc19udHNjID0gZnBzLmRl bm9taW5hdG9yID09IDEwMDEgYW5kIHJvdW5kKGZwcykgaW4gKDMwLCA2MCkKICAgICAgICByZXR1 cm4gY2xzKGZwcz1mcHMsIGRyb3BfZnJhbWU9ZHJvcF9mcmFtZSBhbmQgaXNfbnRzYykKCgpkZWYg ZnJhbWVzX3RvX3NlY29uZHMoZnJhbWVzOiBpbnQsIHJhdGU6IEZyYW1lUmF0ZSkgLT4gZmxvYXQ6 CiAgICByZXR1cm4gZmxvYXQoRnJhY3Rpb24oZnJhbWVzKSAvIHJhdGUuZnBzKQoKCmRlZiBmcmFt ZXNfdG9fdGltZWNvZGUoZnJhbWU6IGludCwgcmF0ZTogRnJhbWVSYXRlKSAtPiBzdHI6CiAgICAi IiJUaW1lY29kZSBmb3IgYW4gYWJzb2x1dGUgZnJhbWUgbnVtYmVyOiBgYEhIOk1NOlNTOkZGYGAg KGBgSEg6TU06U1M7RkZgYCBmb3IgREYpLiIiIgogICAgbm9taW5hbCA9IHJhdGUubm9taW5hbAog ICAgZnJhbWUgPSBtYXgoMCwgaW50KGZyYW1lKSkKICAgIGlmIHJhdGUuZHJvcF9mcmFtZToKICAg ICAgICBkcm9wID0gbm9taW5hbCAvLyAxNSAgIyAyIGZyYW1lcyBwZXIgbWludXRlIGF0IDI5Ljk3 LCA0IGF0IDU5Ljk0CiAgICAgICAgcGVyXzEwX21pbiA9IG5vbWluYWwgKiA2MDAgLSBkcm9wICog OQogICAgICAgIHBlcl9taW4gPSBub21pbmFsICogNjAgLSBkcm9wCiAgICAgICAgdGVucywgcmVz dCA9IGRpdm1vZChmcmFtZSwgcGVyXzEwX21pbikKICAgICAgICBmcmFtZSArPSBkcm9wICogOSAq IHRlbnMKICAgICAgICBpZiByZXN0ID4gZHJvcDoKICAgICAgICAgICAgZnJhbWUgKz0gZHJvcCAq ICgocmVzdCAtIGRyb3ApIC8vIHBlcl9taW4pCiAgICBmZiA9IGZyYW1lICUgbm9taW5hbAogICAg dG90YWxfc2Vjb25kcyA9IGZyYW1lIC8vIG5vbWluYWwKICAgIGhoLCByZW0gPSBkaXZtb2QodG90 YWxfc2Vjb25kcywgMzYwMCkKICAgIG1tLCBzcyA9IGRpdm1vZChyZW0sIDYwKQogICAgc2VwYXJh dG9yID0gIjsiIGlmIHJhdGUuZHJvcF9mcmFtZSBlbHNlICI6IgogICAgcmV0dXJuIGYie2hoICUg MjQ6MDJkfTp7bW06MDJkfTp7c3M6MDJkfXtzZXBhcmF0b3J9e2ZmOjAyZH0iCgoKZGVmIGZvcm1h dF9kdXJhdGlvbihzZWNvbmRzOiBmbG9hdCkgLT4gc3RyOgogICAgIiIiYGBISDpNTTpTU2BgLCBy b3VuZGVkIGhhbGYgdXAgdG8gdGhlIG5lYXJlc3Qgc2Vjb25kICgxMi41IHMgLT4gMTMgcykuIiIi CiAgICB0b3RhbCA9IG1heCgwLCBtYXRoLmZsb29yKHNlY29uZHMgKyAwLjUpKQogICAgaGgsIHJl bSA9IGRpdm1vZCh0b3RhbCwgMzYwMCkKICAgIG1tLCBzcyA9IGRpdm1vZChyZW0sIDYwKQogICAg cmV0dXJuIGYie2hoOjAyZH06e21tOjAyZH06e3NzOjAyZH0iCgoKZGVmIGNoYXB0ZXJfdGltZShz ZWNvbmRzOiBmbG9hdCkgLT4gc3RyOgogICAgIiIiQXVwaG9uaWMncyBjaGFwdGVyIHN0YXJ0IGZv cm1hdCBgYEhIOk1NOlNTLm1tbWBgIChtaWxsaXNlY29uZHMsIHJvdW5kZWQpLiIiIgogICAgbWls bGlzID0gbWF4KDAsIHJvdW5kKHNlY29uZHMgKiAxMDAwKSkKICAgIHRvdGFsX3NlY29uZHMsIG1z ID0gZGl2bW9kKG1pbGxpcywgMTAwMCkKICAgIGhoLCByZW0gPSBkaXZtb2QodG90YWxfc2Vjb25k cywgMzYwMCkKICAgIG1tLCBzcyA9IGRpdm1vZChyZW0sIDYwKQogICAgcmV0dXJuIGYie2hoOjAy ZH06e21tOjAyZH06e3NzOjAyZH0ue21zOjAzZH0iCgoKQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkK Y2xhc3MgUmFuZ2U6CiAgICAiIiJIYWxmLW9wZW4gZnJhbWUgcmFuZ2UgYGBbc3RhcnQsIGVuZClg YC4iIiIKCiAgICBzdGFydDogaW50CiAgICBlbmQ6IGludAoKICAgIEBwcm9wZXJ0eQogICAgZGVm IGZyYW1lcyhzZWxmKSAtPiBpbnQ6CiAgICAgICAgcmV0dXJuIG1heCgwLCBzZWxmLmVuZCAtIHNl bGYuc3RhcnQpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZW1wdHkoc2VsZikgLT4gYm9vbDoKICAg ICAgICByZXR1cm4gc2VsZi5lbmQgPD0gc2VsZi5zdGFydAoKICAgIGRlZiBpbnRlcnNlY3Qoc2Vs Ziwgb3RoZXI6IFJhbmdlKSAtPiBSYW5nZToKICAgICAgICByZXR1cm4gUmFuZ2UobWF4KHNlbGYu c3RhcnQsIG90aGVyLnN0YXJ0KSwgbWluKHNlbGYuZW5kLCBvdGhlci5lbmQpKQoKICAgIGRlZiBj b250YWlucyhzZWxmLCBmcmFtZTogZmxvYXQpIC0+IGJvb2w6CiAgICAgICAgcmV0dXJuIHNlbGYu c3RhcnQgPD0gZnJhbWUgPCBzZWxmLmVuZAoKCmRlZiBtYXJrX3JhbmdlKHRpbWVsaW5lX3N0YXJ0 OiBpbnQsIG1hcmtfaW5fb3V0OiBvYmplY3QpIC0+IFJhbmdlIHwgTm9uZToKICAgICIiIlRoZSB0 aW1lbGluZSdzIGluL291dCBzZWxlY3Rpb24gYXMgYW4gYWJzb2x1dGUgcmFuZ2UsIG9yIGBgTm9u ZWBgIGlmIHVuc2V0LgoKICAgIGBgVGltZWxpbmUuR2V0TWFya0luT3V0KClgYCAoUmVzb2x2ZSAx OS4xKykgcmV0dXJucyBmcmFtZXMgcmVsYXRpdmUgdG8gdGhlIHRpbWVsaW5lCiAgICBzdGFydCwg ZS5nLiBgYHsiYXVkaW8iOiB7ImluIjogMCwgIm91dCI6IDEzNH0sICJ2aWRlbyI6IHsuLi59fWBg LCBvbWl0dGluZyB1bnNldAogICAgbWFya3MuIFRoZSBhdWRpbyBtYXJrcyB3aW47IG90aGVyd2lz ZSB0aGUgdmlkZW8gbWFya3MgYXJlIHVzZWQuCgogICAgVGhlIG91dCBwb2ludCBpcyAqKmV4Y2x1 c2l2ZSoqICh0aGUgZnJhbWUgYWZ0ZXIgdGhlIGxhc3QgaW5jbHVkZWQgb25lKS4gVmVyaWZpZWQg aW4KICAgIFJlc29sdmUgMjEuMS4xOiBtYXJraW5nIGEgY2xpcCBzcGFubmluZyBhYnNvbHV0ZSBm cmFtZXMgMTA5NzI4Li4xMDk5NDYgKGVuZAogICAgZXhjbHVzaXZlKSBvbiBhIHRpbWVsaW5lIHN0 YXJ0aW5nIGF0IDg2NDAwIGdhdmUgYGBpbj0yMzMyOCwgb3V0PTIzNTQ2YGAuCiAgICBBbiBvdXQg cG9pbnQgYXQgb3IgYmVmb3JlIHRoZSBpbiBwb2ludCBjb3VudHMgYXMgbm8gc2VsZWN0aW9uLgog ICAgIiIiCiAgICBpZiBub3QgaXNpbnN0YW5jZShtYXJrX2luX291dCwgZGljdCk6CiAgICAgICAg cmV0dXJuIE5vbmUKICAgIGZvciBraW5kIGluICgiYXVkaW8iLCAidmlkZW8iKToKICAgICAgICBt YXJrcyA9IG1hcmtfaW5fb3V0LmdldChraW5kKQogICAgICAgIGlmIGlzaW5zdGFuY2UobWFya3Ms IGRpY3QpIGFuZCAiaW4iIGluIG1hcmtzIGFuZCAib3V0IiBpbiBtYXJrczoKICAgICAgICAgICAg dHJ5OgogICAgICAgICAgICAgICAgbWFya19pbiwgbWFya19vdXQgPSBpbnQobWFya3NbImluIl0p LCBpbnQobWFya3NbIm91dCJdKQogICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVF cnJvcik6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBtYXJrX291dCA8 PSBtYXJrX2luOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgcmV0dXJu IFJhbmdlKHRpbWVsaW5lX3N0YXJ0ICsgbWFya19pbiwgdGltZWxpbmVfc3RhcnQgKyBtYXJrX291 dCkKICAgIHJldHVybiBOb25lCgoKQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKY2xhc3MgTWFya2Vy OgogICAgIiIiQSB0aW1lbGluZSBtYXJrZXIgYXQgYW4gYWJzb2x1dGUgZnJhbWUuIiIiCgogICAg ZnJhbWU6IGludAogICAgbmFtZTogc3RyID0gIiIKICAgIG5vdGU6IHN0ciA9ICIiCgoKZGVmIG1h cmtlcnNfaW5fcmFuZ2UobWFya2VyczogbGlzdFtNYXJrZXJdLCBlZmZlY3RpdmU6IFJhbmdlKSAt PiBsaXN0W01hcmtlcl06CiAgICByZXR1cm4gc29ydGVkKChtIGZvciBtIGluIG1hcmtlcnMgaWYg ZWZmZWN0aXZlLmNvbnRhaW5zKG0uZnJhbWUpKSwga2V5PWxhbWJkYSBtOiBtLmZyYW1lKQoKCkBk YXRhY2xhc3MoZnJvemVuPVRydWUpCmNsYXNzIENoYXB0ZXI6CiAgICBzdGFydF9zZWNvbmRzOiBm bG9hdAogICAgdGl0bGU6IHN0cgoKICAgIGRlZiB0b19hcGkoc2VsZikgLT4gZGljdFtzdHIsIHN0 cl06CiAgICAgICAgcmV0dXJuIHsic3RhcnQiOiBjaGFwdGVyX3RpbWUoc2VsZi5zdGFydF9zZWNv bmRzKSwgInRpdGxlIjogc2VsZi50aXRsZX0KCgpkZWYgY2hhcHRlcnNfZnJvbV9tYXJrZXJzKAog ICAgbWFya2VyczogbGlzdFtNYXJrZXJdLCBlZmZlY3RpdmU6IFJhbmdlLCByYXRlOiBGcmFtZVJh dGUKKSAtPiBsaXN0W0NoYXB0ZXJdOgogICAgIiIiQ2hhcHRlcnMgcmVsYXRpdmUgdG8gdGhlIHN0 YXJ0IG9mIHRoZSByZW5kZXJlZCBhdWRpby4KCiAgICBUaXRsZTogdGhlIG1hcmtlcidzIG5hbWUs IGVsc2UgaXRzIG5vdGUsIGVsc2UgYGBDaGFwdGVyIDxuPmBgLgogICAgIiIiCiAgICBjaGFwdGVy cyA9IFtdCiAgICBmb3IgbnVtYmVyLCBtYXJrZXIgaW4gZW51bWVyYXRlKG1hcmtlcnNfaW5fcmFu Z2UobWFya2VycywgZWZmZWN0aXZlKSwgc3RhcnQ9MSk6CiAgICAgICAgdGl0bGUgPSBtYXJrZXIu bmFtZS5zdHJpcCgpIG9yIG1hcmtlci5ub3RlLnN0cmlwKCkgb3IgZiJDaGFwdGVyIHtudW1iZXJ9 IgogICAgICAgICMgRXhhY3QgYXJpdGhtZXRpYywgcm91bmRlZCB0byBtaWxsaXNlY29uZHM6IDMw IGZyYW1lcyBhdCAyOS45NyBmcHMgaXMgMS4wMDEgcywKICAgICAgICAjIHdoaWNoIGZsb2F0IGRp dmlzaW9uIHdvdWxkIHR1cm4gaW50byAxLjAwMDk5OS4uLgogICAgICAgIG1pbGxpcyA9IHJvdW5k KEZyYWN0aW9uKG1hcmtlci5mcmFtZSAtIGVmZmVjdGl2ZS5zdGFydCkgLyByYXRlLmZwcyAqIDEw MDApCiAgICAgICAgY2hhcHRlcnMuYXBwZW5kKENoYXB0ZXIoc3RhcnRfc2Vjb25kcz1taWxsaXMg LyAxMDAwLCB0aXRsZT10aXRsZSkpCiAgICByZXR1cm4gY2hhcHRlcnMKUEsDBBQAAAAAABRbal2n UFyiEgAAABIAAAAfAAAAYXVwaG9uaWNfcmVzb2x2ZS91aS9fX2luaXRfXy5weSIiInVpIHBhY2th Z2UuIiIiClBLAwQUAAAAAAAUW2pdj3mHsc0YAADNGAAAHAAAAGF1cGhvbmljX3Jlc29sdmUvdWkv bG9naW4ucHkiIiJMb2dpbiBzY3JlZW46IHRoZSBBdXBob25pYyBBUEkga2V5LCAiUmVtZW1iZXIg bWUiLiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKZnJvbSBjb2xsZWN0 aW9ucy5hYmMgaW1wb3J0IENhbGxhYmxlCmZyb20gdHlwaW5nIGltcG9ydCBBbnkKCmZyb20gLi5s aW5rcyBpbXBvcnQgQVBJX0tFWV9VUkwsIFJFR0lTVEVSX1VSTApmcm9tIC53aWRnZXRzIGltcG9y dCAoCiAgICBFUlJPUl9TVFlMRSwKICAgIE1VVEVEX1NUWUxFLAogICAgUFJJTUFSWV9CVVRUT05f U1RZTEUsCiAgICBmb290ZXIsCiAgICBsaW5rLAogICAgbWVzc2FnZV9sYWJlbCwKICAgIHNlY3Rp b24sCiAgICBzZXRfbWVzc2FnZSwKKQoKTG9naW5DYWxsYmFjayA9IENhbGxhYmxlW1tzdHIsIGJv b2xdLCBOb25lXQoKU1RFUFNfSFRNTCA9ICgKICAgICJUaGUgcGx1Z2luIGxvZ3MgaW4gd2l0aCBh biBBUEkga2V5IGZyb20geW91ciBBdXBob25pYyBhY2NvdW50Ljxicj48YnI+IgogICAgZiIxLiBO byBBdXBob25pYyBhY2NvdW50IHlldD8ge2xpbmsoUkVHSVNURVJfVVJMLCAnU2lnbiB1cCcpfS48 YnI+IgogICAgZiIyLiB7bGluayhBUElfS0VZX1VSTCwgJ0NyZWF0ZSB5b3VyIEFQSSBrZXknKX0g aW4geW91ciBhY2NvdW50IHNldHRpbmdzLCBjb3B5IGl0ICIKICAgICJhbmQgcGFzdGUgaXQgYmVs b3cuIgopCk5PX0tFWVJJTkdfTk9URSA9ICgKICAgICJUaGlzIGNvbXB1dGVyIGhhcyBubyBzeXN0 ZW0ga2V5cmluZyB0aGUgcGx1Z2luIGNhbiB1c2UsIHNvIHlvdXIgQVBJIGtleSBjYW4ndCAiCiAg ICAiYmUgc2F2ZWQ6IHlvdSdsbCBwYXN0ZSBpdCBlYWNoIHRpbWUuIFRoZSBDb25zb2xlIHNheXMg aG93IHRvIHNldCBvbmUgdXAuIgopCgoKY2xhc3MgTG9naW5XaW5kb3c6CiAgICBJRCA9ICJBdXBo b25pY0xvZ2luIgoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICBzZWxmLAogICAgICAgIHVpOiBB bnksCiAgICAgICAgZGlzcDogQW55LAogICAgICAgICosCiAgICAgICAgb25fbG9naW46IExvZ2lu Q2FsbGJhY2ssCiAgICAgICAgb25fcmV0cnk6IENhbGxhYmxlW1tdLCBOb25lXSwKICAgICAgICBv bl9jbG9zZTogQ2FsbGFibGVbW10sIE5vbmVdLAogICAgICAgIHBvc2l0aW9uOiBsaXN0W2ludF0g fCBOb25lID0gTm9uZSwKICAgICAgICBsb2dvOiBzdHIgPSAiPGI+YXVwaG9uaWM8L2I+IiwKICAg ICkgLT4gTm9uZToKICAgICAgICBzZWxmLl9vbl9sb2dpbiA9IG9uX2xvZ2luCiAgICAgICAgc2Vs Zi5fY2FuX3JlbWVtYmVyID0gVHJ1ZQogICAgICAgIHgsIHkgPSBwb3NpdGlvbiBvciBbMzAwLCAy MDBdCiAgICAgICAgc2VsZi53aW4gPSBkaXNwLkFkZFdpbmRvdygKICAgICAgICAgICAgeyJJRCI6 IHNlbGYuSUQsICJXaW5kb3dUaXRsZSI6ICJBdXBob25pYzogTG9nIEluIiwgIkdlb21ldHJ5Ijog W3gsIHksIDQ2MCwgNDQwXX0sCiAgICAgICAgICAgIHVpLlZHcm91cCgKICAgICAgICAgICAgICAg IHsiU3BhY2luZyI6IDZ9LAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHVp LkxhYmVsKHsiSUQiOiAiTG9nbyIsICJUZXh0IjogbG9nbywgIldlaWdodCI6IDB9KSwKICAgICAg ICAgICAgICAgICAgICBzZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICB1aSwKICAgICAg ICAgICAgICAgICAgICAgICAgIkxvZyBpbiB0byBBdXBob25pYyIsCiAgICAgICAgICAgICAgICAg ICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpLkxhYmVsKAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIklEIjogIlN0ZXBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRl eHQiOiBTVEVQU19IVE1MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV29y ZFdyYXAiOiBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3BlbkV4 dGVybmFsTGlua3MiOiBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi V2VpZ2h0IjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg ICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWkuTGFiZWwo eyJUZXh0IjogIkFQSSBrZXkiLCAiV2VpZ2h0IjogMCwgIlN0eWxlU2hlZXQiOiBNVVRFRF9TVFlM RX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNYXNrZWQgbGlrZSBhIHBhc3N3b3Jk OiBpdCBnaXZlcyBmdWxsIGFjY2VzcyB0byB0aGUgYWNjb3VudC4KICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHVpLkxpbmVFZGl0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklEIjogIkFwaUtleSIsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvTW9kZSI6ICJQYXNzd29yZCIsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGFjZWhvbGRlclRleHQiOiAiUGFz dGUgeW91ciBBUEkga2V5IGhlcmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAiV2VpZ2h0IjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg ICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWkuQ2hl Y2tCb3goCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAiSUQiOiAiUmVtZW1iZXIiLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAiVGV4dCI6ICJSZW1lbWJlciBtZSIsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICJDaGVja2VkIjogVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIldlaWdodCI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHVpLkxhYmVsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklEIjogIlJlbWVtYmVyTm90ZSIsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXh0IjogTk9fS0VZUklOR19OT1RFLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV29yZFdyYXAiOiBUcnVlLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGlkZGVuIjogVHJ1ZSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlaWdodCI6IDAsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICJTdHlsZVNoZWV0IjogTVVURURfU1RZTEUsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAg ICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAg ICAgICAgICAgIG1lc3NhZ2VfbGFiZWwodWksICJNZXNzYWdlIiksCiAgICAgICAgICAgICAgICAg ICAgdWkuSEdyb3VwKAogICAgICAgICAgICAgICAgICAgICAgICB7IldlaWdodCI6IDB9LAogICAg ICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aS5IR2Fw KDAsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWkuQnV0dG9uKHsiSUQiOiAiUmV0 cnkiLCAiVGV4dCI6ICJUcnkgQWdhaW4iLCAiSGlkZGVuIjogVHJ1ZX0pLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgdWkuQnV0dG9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklEIjogIkxvZ2luIiwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRleHQiOiAiTG9nIEluIiwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlZmF1bHQiOiBUcnVlLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAiU3R5bGVTaGVldCI6IFBSSU1BUllfQlVUVE9OX1NU WUxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAg ICAgKSwKICAgICAgICAgICAgICAgICAgICB1aS5WR2FwKDAsIDEpLAogICAgICAgICAgICAgICAg ICAgIGZvb3Rlcih1aSksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICApLAogICAgICAg ICkKICAgICAgICBzZWxmLml0ZW1zID0gc2VsZi53aW4uR2V0SXRlbXMoKQogICAgICAgIHNlbGYu d2luLk9uLkxvZ2luLkNsaWNrZWQgPSBsYW1iZGEgZXY6IHNlbGYuc3VibWl0KCkKICAgICAgICBz ZWxmLndpbi5Pbi5SZXRyeS5DbGlja2VkID0gbGFtYmRhIGV2OiBvbl9yZXRyeSgpCiAgICAgICAg c2VsZi53aW4uT24uQXBpS2V5LlJldHVyblByZXNzZWQgPSBsYW1iZGEgZXY6IHNlbGYuc3VibWl0 KCkKICAgICAgICBnZXRhdHRyKHNlbGYud2luLk9uLCBzZWxmLklEKS5DbG9zZSA9IGxhbWJkYSBl djogb25fY2xvc2UoKQoKICAgIGRlZiBzaG93KHNlbGYsIHJlbWVtYmVyOiBib29sID0gVHJ1ZSkg LT4gTm9uZToKICAgICAgICBzZWxmLml0ZW1zWyJSZW1lbWJlciJdLkNoZWNrZWQgPSByZW1lbWJl ciBhbmQgc2VsZi5fY2FuX3JlbWVtYmVyCiAgICAgICAgc2VsZi53aW4uU2hvdygpCgogICAgZGVm IGhpZGUoc2VsZikgLT4gTm9uZToKICAgICAgICBzZWxmLndpbi5IaWRlKCkKCiAgICBkZWYgc2V0 X2J1c3koc2VsZiwgYnVzeTogYm9vbCwgbWVzc2FnZTogc3RyID0gIiIpIC0+IE5vbmU6CiAgICAg ICAgZm9yIGl0ZW1faWQgaW4gKCJBcGlLZXkiLCAiTG9naW4iLCAiUmV0cnkiKToKICAgICAgICAg ICAgc2VsZi5pdGVtc1tpdGVtX2lkXS5FbmFibGVkID0gbm90IGJ1c3kKICAgICAgICBzZWxmLml0 ZW1zWyJSZW1lbWJlciJdLkVuYWJsZWQgPSBub3QgYnVzeSBhbmQgc2VsZi5fY2FuX3JlbWVtYmVy CiAgICAgICAgc2V0X21lc3NhZ2Uoc2VsZi53aW4sIHNlbGYuaXRlbXNbIk1lc3NhZ2UiXSwgbWVz c2FnZSwgTVVURURfU1RZTEUpCgogICAgZGVmIHNldF9jYW5fcmVtZW1iZXIoc2VsZiwgY2FuOiBi b29sKSAtPiBOb25lOgogICAgICAgICIiIldpdGhvdXQgYSBzeXN0ZW0ga2V5cmluZywgIlJlbWVt YmVyIG1lIiBpcyBvZmYsIGRpc2FibGVkIGFuZCBleHBsYWluZWQuIiIiCiAgICAgICAgc2VsZi5f Y2FuX3JlbWVtYmVyID0gY2FuCiAgICAgICAgc2VsZi5pdGVtc1siUmVtZW1iZXIiXS5FbmFibGVk ID0gY2FuCiAgICAgICAgaWYgbm90IGNhbjoKICAgICAgICAgICAgc2VsZi5pdGVtc1siUmVtZW1i ZXIiXS5DaGVja2VkID0gRmFsc2UKICAgICAgICBzZWxmLml0ZW1zWyJSZW1lbWJlck5vdGUiXS5I aWRkZW4gPSBjYW4KICAgICAgICBzZWxmLndpbi5SZWNhbGNMYXlvdXQoKQoKICAgIGRlZiBzaG93 X2Vycm9yKHNlbGYsIG1lc3NhZ2U6IHN0cikgLT4gTm9uZToKICAgICAgICBzZWxmLnNldF9idXN5 KEZhbHNlKQogICAgICAgIHNldF9tZXNzYWdlKHNlbGYud2luLCBzZWxmLml0ZW1zWyJNZXNzYWdl Il0sIG1lc3NhZ2UsIEVSUk9SX1NUWUxFKQoKICAgIGRlZiBzaG93X3JldHJ5KHNlbGYsIHZpc2li bGU6IGJvb2wpIC0+IE5vbmU6CiAgICAgICAgIiIiU2hvdyAiVHJ5IEFnYWluIiAoZm9yIHJlLWNo ZWNraW5nIGEgc2F2ZWQgbG9naW4gYWZ0ZXIgYSBuZXR3b3JrIGVycm9yKS4iIiIKICAgICAgICBz ZWxmLml0ZW1zWyJSZXRyeSJdLkhpZGRlbiA9IG5vdCB2aXNpYmxlCiAgICAgICAgc2VsZi53aW4u UmVjYWxjTGF5b3V0KCkKCiAgICBkZWYgY2xlYXJfYXBpX2tleShzZWxmKSAtPiBOb25lOgogICAg ICAgIHNlbGYuaXRlbXNbIkFwaUtleSJdLlRleHQgPSAiIgoKICAgIGRlZiBzdWJtaXQoc2VsZikg LT4gTm9uZToKICAgICAgICBpZiBub3Qgc2VsZi5pdGVtc1siTG9naW4iXS5FbmFibGVkOgogICAg ICAgICAgICByZXR1cm4KICAgICAgICBhcGlfa2V5ID0gc3RyKHNlbGYuaXRlbXNbIkFwaUtleSJd LlRleHQgb3IgIiIpCiAgICAgICAgaWYgbm90IGFwaV9rZXkuc3RyaXAoKToKICAgICAgICAgICAg c2VsZi5zaG93X2Vycm9yKCJQbGVhc2UgcGFzdGUgeW91ciBBdXBob25pYyBBUEkga2V5LiIpCiAg ICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuX29uX2xvZ2luKGFwaV9rZXksIGJvb2woc2Vs Zi5pdGVtc1siUmVtZW1iZXIiXS5DaGVja2VkKSkKUEsDBBQAAAAAABRbal2LLwWCzAYAAMwGAAAb AAAAYXVwaG9uaWNfcmVzb2x2ZS91aS9sb2dvLnB5IiIiVGhlIGxvZ28gYXMgZmlsZXMgUXQgY2Fu IHNob3cuCgpUaGUgcGFja2FnZSBydW5zIGZyb20gYSB6aXAsIGFuZCBRdCdzIHJpY2ggdGV4dCBj YW4ndCByZWFkIGltYWdlcyBmcm9tIGluc2lkZSBpdCwgc28KdGhlIGxvZ28gKGVtYmVkZGVkIGlu IGBgbG9nb19kYXRhLnB5YGApIGlzIHdyaXR0ZW4gdG8gdGhlIHNldHRpbmdzIGZvbGRlciBvbmNl LCBpbiB0d28Kc2l6ZXM6IGBgbG9nby08aGFzaD4ucG5nYGAgYW5kIGBgbG9nby08aGFzaD5AMngu cG5nYGAsIHdoaWNoIFF0IHBpY2tzIGJ5IGl0c2VsZiBvbgpIaURQSSBzY3JlZW5zLiBUaGUgbmFt ZXMgY2FycnkgYSBjb250ZW50IGhhc2gsIHNvIGEgbmV3IGxvZ28gbmV2ZXIgc2hvd3MgYW4gb2xk IGZpbGUuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IGJh c2U2NAppbXBvcnQgaGFzaGxpYgppbXBvcnQgaHRtbApmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgK CmZyb20gLi4gaW1wb3J0IGxvZwpmcm9tIC4gaW1wb3J0IGxvZ29fZGF0YQoKCmRlZiBsb2dvX2Zp bGUoZGlyZWN0b3J5OiBQYXRoKSAtPiBQYXRoIHwgTm9uZToKICAgICIiIlRoZSBsb2dvIFBORydz IHBhdGggaW4gYGBkaXJlY3RvcnlgYCAoaXRzIEAyeCBzaWJsaW5nIG5leHQgdG8gaXQpLCB3cml0 dGVuIGlmCiAgICBuZWVkZWQ7IE5vbmUgaWYgaXQgY2FuJ3QgYmUgd3JpdHRlbi4iIiIKICAgIG9u ZSA9IGJhc2U2NC5iNjRkZWNvZGUobG9nb19kYXRhLlBOR18xWCkKICAgIHR3byA9IGJhc2U2NC5i NjRkZWNvZGUobG9nb19kYXRhLlBOR18yWCkKICAgIHN0ZW0gPSBmImxvZ28te2hhc2hsaWIuc2hh MjU2KG9uZSArIHR3bykuaGV4ZGlnZXN0KClbOjEyXX0iCiAgICBwYXRoID0gZGlyZWN0b3J5IC8g ZiJ7c3RlbX0ucG5nIgogICAgdHJ5OgogICAgICAgIGZvciB0YXJnZXQsIGRhdGEgaW4gKChwYXRo LCBvbmUpLCAoZGlyZWN0b3J5IC8gZiJ7c3RlbX1AMngucG5nIiwgdHdvKSk6CiAgICAgICAgICAg IGlmIG5vdCB0YXJnZXQuaXNfZmlsZSgpIG9yIHRhcmdldC5yZWFkX2J5dGVzKCkgIT0gZGF0YToK ICAgICAgICAgICAgICAgIHRhcmdldC5wYXJlbnQubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9v az1UcnVlKQogICAgICAgICAgICAgICAgdGFyZ2V0LndyaXRlX2J5dGVzKGRhdGEpCiAgICBleGNl cHQgT1NFcnJvciBhcyBleGM6CiAgICAgICAgbG9nLmRlYnVnKGYibG9nbyBub3Qgd3JpdHRlbiAo e2V4YyFyfSk7IHRoZSB3aW5kb3cgc2hvd3MgdGhlIG5hbWUgaW5zdGVhZCIpCiAgICAgICAgcmV0 dXJuIE5vbmUKICAgIHJldHVybiBwYXRoCgoKZGVmIGxvZ29faHRtbChkaXJlY3Rvcnk6IFBhdGgp IC0+IHN0cjoKICAgICIiIkFuIDxpbWc+IGZvciBhIGxhYmVsLCBvciB0aGUgcGxhaW4gbmFtZSBp ZiB0aGUgZmlsZXMgYXJlbid0IGF2YWlsYWJsZS4KCiAgICBObyB3aWR0aCBvciBoZWlnaHQ6IFF0 IHRoZW4gc2hvd3MgdGhlIGltYWdlIGF0IGl0cyBvd24gc2l6ZSwgdW5zY2FsZWQgKHdpdGggdGhl CiAgICBAMnggZmlsZSBvbiBIaURQSSBzY3JlZW5zKS4gU2NhbGVkIGJ5IFF0LCBpdCBsb29rZWQg cGl4ZWxhdGVkLgogICAgIiIiCiAgICBwYXRoID0gbG9nb19maWxlKGRpcmVjdG9yeSkKICAgIGlm IHBhdGggaXMgTm9uZToKICAgICAgICByZXR1cm4gIjxiPmF1cGhvbmljPC9iPiIKICAgIHJldHVy biBmJzxpbWcgc3JjPSJ7aHRtbC5lc2NhcGUocGF0aC5hc19wb3NpeCgpLCBxdW90ZT1UcnVlKX0i PicKUEsDBBQAAAAAABRbal0+fmmH/CgAAPwoAAAgAAAAYXVwaG9uaWNfcmVzb2x2ZS91aS9sb2dv X2RhdGEucHkiIiJUaGUgd2luZG93IGxvZ28gKGdlbmVyYXRlZCBieSB0b29scy9tYWtlX2xvZ28u cHk7IGRvbid0IGVkaXQpLgoKVHdvIHNpemVzOiBRdCBzaG93cyB0aGUgQDJ4IGZpbGUgb24gSGlE UEkgc2NyZWVucyBieSBpdHNlbGYuCiIiIgoKV0lEVEggPSA1MwpIRUlHSFQgPSA0MCAgIyBweCBh cyBzaG93bgpQTkdfMVggPSAoCiAgICAiaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURVQUFBQW9D QVlBQUFCZXJySTFBQUFJSmtsRVFWUjQyczJaZVl4ZVpSWEdmM2VaVGt0b2tVcUZ0alRVQWxLQyIK ICAgICJsQUlCcFFUQ0VwWklORm9WNDBJeFNGZ3NFQllEbEozUWdDVHNxTFJVVUVJa3FJMUVZaFFS dHlnQ1FvRlJISWZTRnFWQXNZVUt0WlRPZlBkK2wzK2VRMDVPIgogICAgIjN2dDFXa1BDVFNaenYz dmY1YXpQZWQ1enM4R2hGV3pqbFFFRlVMbG40NEg5Z1U4Q3M0RTlnWThBMndOak5QWi93RHBnSlRB QVBBRThEYXgzNjVSQVYzOWIiCiAgICAiTDlnMktKVUJPVkRyOTNiQWNjQmM0REJndDIyUTQxWGdV ZUJud0srQXQvUzhrR0xOKzZsVTdxdzNDVGdOK0FidzBUQ3VkZ2JJM0wwSjE3ajdJc3g5R2JnSCIK ICAgICJXS1I3RzFPL0gwcVZDcDgrNEN6Z1c4Q1VvRVR1bE5pYXEzSEdNaVhmQUc0QmJnSTJiWTFp K1ZibXpzSEFuN1hSRkQzcjZuMlJVS2h4dVZHNys2WmxqMEx2IgogICAgIkt1RER3RFhBNDhBUm1q OHFvK1dqVUNqVGd1Y0FmNUppbFRZdnd4cU54dHA3eTc5Y0F1ZE9NQk8rRGtwbVd0ZmU3d3Y4RnJq VUdTVGZVa2oxVXNnRVhRU2MiCiAgICAiN2tLdGJQRklFWEprSTdCV2lUOE05QU03S0IvSGgzV2lK ektIZ2htd0VOaGJPVHdjOG50VVNtWE95dmNCWDVUVmlrUmkxKzU1SlcvK1JtaTJVdkE5NHNiMyIK ICAgICJLYlJtQUljQXh5aTgrc042UHBvYW9BTjhWUWI1SFBCT20ySXBvUENRZlQvd0pTM1lsL0NP aGNLYndBK0F1NEhuZWhpcURaby9CcHdzTk4wcHJPMHZrK01oIgogICAgIjRETnRPWnFLVFVPWm0z c28xSFhLMzZPQ2U3NFVzckFwWERobElRSU1HQ3dubHl0bjlnTytsNmlGM3NzZDRIaGdTY0tyU2FV c2hPWUI1N1lvWkxHL1ZnWDMiCiAgICAiNjhDL25JQ05TLzdjb2FJUDZjS3QxZFd6VWtWNHZrTHlw UllZTjhWT2xveFZWTXlIbndrMEEzaFdUQ0VMRUdxVytidmllbVdnTkcwVzduVjUxdURMeDJUZyIK ICAgICJwOENoK2wyMmxJcURKZTk3QmloRHpIZUJPOFRWNnVCSlUrZ3B1ZjhOVjVBOTJ6Q0ZEZ1Rt QUxPQXFRS0NFZUExR2VWUjRFazN2bkRsb0FUV2lINzlIRGc2IgogICAgImhGcm12SGFuOWpHak51 WXBXL0FMc2s2TVZRdVJWYkxjYXlFMENnZjFKd0ZuQWdlTndrc0R5bzI3aFdhcE5TY0FmMURlZG9P aHpRQm5BSXR0VGpZNHRNSnIiCiAgICAiUFFEc0ZaREhYTjJSUlo0SkhyTE5Ed0Z1RGNwVXdiSUV6 bWZQbndQT0F4NXBVV3dHc0V3SytwUXc3N3lxR3JZUmw3UU44SGxnWnNJYVZsUVhKQlFxdGVucCIK ICAgICJ3QitsVU9WcVIrbVFzSENJVjdwd3I0Q1BxN1pkR0tMRXZMOUtmRFBXSmZzOVZZRFZBSVVm ZEU2aWp2Zzh1aTFZMFpRN1Q0eWpkRUxrTFl5alNhQ3ZCNXJyIgogICAgImdhc0RhN0VRKzVFVWo0 aG85ZStiSm9NcE5Vc29FbzhDNXViTG5QS05RNmk1SXJkVllxNkg5aXpCK1pxZ1hLYm5Wd0NuQktp MnNaZTRrSXVvUFZQcDBaaEYiCiAgICAiUDV1QVlrTy92d0lQdS9mZTVVdGMvc1c4eVZ6ZXJBZity ZjlaQ0wvSTFHdmdPMklaM2JEdlUwRVdueUtXUXUrRnlUR0poTGJycmdBY1p1MkZ3TVFFOURkdSIK ICAgICJuUjhDUjhtS013VkNod3VwNmtTTzJOcmpnQnRhdkxtazViU1JBVWNDWlRZNHRHSUtNQ2oy M0xpRk02SEpYa0tYM0ZsbFR5RldtVUNqWENUMkswS3p0bXVPIgogICAgIjhtUjZDempsU29rblE0 R2VBTHlnM2tlVWR4aVluU3VmZGdnV051czk0eFR5RzUra1JrbzNIRkVBM2daT2tFSjlDWnBVNlBs ZlZGelhoL2wrLzFPQ0J3dGciCiAgICAiZ3dxM0gyZWgzQThja09zUVJnZ0QyK0N4d0JGckxYQkNn a1diMGxmTHVtTlUyMnJIdWcwOE9ucS9YRENlZ21xQVkxMFh5aHZtc1lRaDdIN2ZITmk5UjRnTSIK ICAgICJKbEJtaWdwZEZyeFVpT1F1MXRqT0Z0aEVSK1B1VlIwcW5HS20xSFJnaitDdEJoanFnUUc3 NTRyTnl2R3V5aFhGMVluazM5VXhaWnN6NGc2SUd4SldiR3UyIgogICAgIlpKcjdTRmpIN3J1dVUr WFBZNnRkV2FpQy9KTktXYVB0QkR5U2VEWTFNYjUwSGFDczExRzc1WVM5eGpHTmVPMmFVR3B6RDVu M0tJSHZxZ0daRW1KbDRGZ0EiCiAgICAiendQWHVqaTM5MzNxTkRXZU1XOUJLVU8wWHp1RzRsRzJW SDRTR01sL2dDdURZcGJUYTdQL28rMzhnYjNLQUxreEYrb1d2cGEzOUIrNkFXWkgyeTdPZTdTOSIK ICAgICJVajMxTEhXTU4vbHo1OWFPL256dkxpSk1GcExUei9YTW9rK1U1dnJRaThqRGlUZHl4Yml1 YjhEa0NaNVloVkxSNEpxR2RhSVBua0t3Sm1IRktKUUJ4UUhBIgogICAgIjMxcU85bG1DdTBXUHQr M2I3YkZPYlZydkRmeGVoSE8xdU5XT0dyUlVwMUs3NXFzTmpKcUtTMFYxVnV0enpEeG4yZGQxV24w QVdDRXdtT1dFUEVLdHJoZUEiCiAgICAiMzdtQ3ZwMWFjd3UwL2hEd0lMQ1A1bDZzNTMwYWZ4endT K0NmT3RPZG5Rc2VIOUFoNnpyZ1ZMRUM0MmV6blZMVGdVL29mckpZOGV2cWVhOVR1K3hFcmRrQSIK ICAgICIwMVNRbDRvMDM2VzVoOG1RT3dJMzZ0a3Z4Q0NHMWRTNVNpWGxZZURUanNqTzBiNlZlaVVQ cWNHNVJMMlBtU1h3b2c2QUU0Ri9BSmVyRDJGdDQ0MkJCZFRoIgogICAgInZMUkFYeVh1QkY1Ui8r OG5JcDczdW5iMVJCa000QUt0ZTdpVVdDU1l2bFJLQUh4ZmtXRnBZdXY4VngvdUdzSDZtdGdQeVdX ZDVWSnVRQXlqRStoS0VZN20iCiAgICAidmhXd2k0aGtyaENZN001Rlk5eThqY3FCZnJHRVZWTElX bkZEaWdRTHEzNDNkMFBpNkZPb2QvRzBubzNUbkRFNThHT0Z5elFKdEV3Ym9RN1BlSWVHbTBKUyIK ICAgICJvN0FiMXZQcDZqVFZMb2tyQnlDMVF1b1Z4eFEyU2NqZE5MY0tqWnNxTUpTdUE0VjFPa3cy a25VWUdDbmx5cDBWcXhQRjJsL1N4R1hxaEY2bnplYzdTTFhGIgogICAgIno1ZTF2aXh5ZklXejNE Z240RmpuOFZzRUhQY0xpRTZVVWhkcWJMLzdZSUNMQlBzY08wSDN0eXQwRnl0Y3B3RWZLcFYwTnlu SkIrUTVnOUNGY3ZHWk9sZmQiCiAgICAicDg2UC80WTBGemhiNFhXdXhveFZHMkM1RSt4Rm5jL0dL Vy9teVFDZkV0aWNvVndjcTFLd3lzMWQ0NWo1eStySWxsSm1rcG8vWDVPbkh2UTBxZGZueHpLRSIK ICAgICJCY0MzZ1l2azNiY2QrUjBOay9CakpqaG0zelkzQzh3KzlqZnM4OUNid0diL1phOE9EZjFZ dmMwN2ZZNHBiNUxsUjBJUGtTMTh4bXdjNEd4d1JtMTZqRzhTIgogICAgIjM0ZHRYa2Y1dUJuSTN3 Vy82ZDQxMzRiWFRRQUFBQUJKUlU1RXJrSmdnZz09IgopClBOR18yWCA9ICgKICAgICJpVkJPUncw S0dnb0FBQUFOU1VoRVVnQUFBR29BQUFCUUNBWUFBQUR4d09CY0FBQVRVMGxFUVZSNDJ0MmRlN1Jj VlgzSFArZk1oSkFROHlRaEpDRWtLZ2dsIgogICAgIkJBaWswR0pMSUNCV2VadUNGZEJDVzBycDZr TmF0YTFhdWl4ZFZxdkxGcEFscXo2Z1doOFVBb3FwYVN2UWlwQllYZzFTNUJFRElaUklFdktHUE82 ZE9mMWoiCiAgICAiZjMrWjM5MmN1WFBPbWJrM2lXZXRXYm01Yzg3WmUvL2V2Ky92dC9kTm5ucDZK ZnZZbGVyVEFMTG91M0hBTE9BSTRLM0FiR0E2TUJZWUQ0d0JSdWplQnZBNiIKICAgICJzQm5ZQXZ3 TVdBVThEenlybnpma2pGL1h1TTJjOGZmYVZkK0htSk9JdUUxOUFHWUFKd0svQk13SDNnSk1CVVoy T1Y0RFdBZThBRHdHUEFROElnYjJ1L3RxIgogICAgImptbDc5VXIyc2taNUJ0bDFQUEF1NEIxaTBw aWM1ekwzU1d3dGJjYklvbjhUalJ0ZmZjQ1R3SDhBM3dXV09hYlpQUGVhbHUwdFJzV1Nlamp3SHVE WGdWK00iCiAgICAiQ0drYWxrU2ZicS9NelNIUm5QejFZK0JPNEhiZ0o5SGNoNTFodzgybzFCRWY0 RlRnZDRBTDVXZnM2bmVTbnd6VDNEemphbTdjbmNCUzRBdkF2MFVNYS95OCIKICAgICJNU3B4QVFM QTZjQUhnWE1qdjlGTGplbjJNazMyZnZ5SHdBM0FIV0pxTEhoREx1SERZZVlhTW10M0FmYzVKbGww Vnh0bURTcENtN3FiZXdhOFhhYndBZURYIgogICAgIkhETnIrek9qdkJZZENueGVFbm1CV3p5Um1k a1hyOFROMFJoekt2Q3Z3TGVBbzV3MVNQYzNSdmxnNFhMZ3Y0RnJsT00wMmpqdi9lR0tjN3lMZ2VY QW56Z1QiCiAgICAiV050ZkdGWFhRcVlDM3dUK1NmbFF2ek54Ky90VmMybkZPT0F6Q3V2ZnB0LzEz RXFrUFRZUnFSanlEdVVobDdna3RyNlBtN2h1L2U5Q0pjN3ZkMlk5M2RjWSIKICAgICJsVHBUOXlI Z2U0SjYrbDJRTUpUaGRFT2YvdWpUY0lLU0RWSHVrN2hRZlNKd0cvQTVyYmxucGpEdDBUdWF3SUhB cmNDbm5lT3Q5NWd4VGNlQXhHbHhUWjk2IgogICAgIjlLbEYwV1FTdlNNYkl1MzZZMkFKTU1tWndx NzlTYmVUTTBtNlhlcmZTeTN5NkVVdEo3TGFDTHhNQUZjM0U4RFhIZnJ1UUFKUU8wN3ptNlovYXpu SVI5YWoiCiAgICAiMU1DMHF4ODRHN2hYQWNlem9uWC8zbUNVTVdrYWNEY0JOTzN2a1JZMVhlQmgw dmlhc0xobHdJK0FsY0FhTWFsUlFPc25LY0NacmJtK0haZ3I1dm1rbXg1byIKICAgICJnREhsT09E N3dEbkFFOTB3cXlveVlVdzZUUG5FbkI0eHFSbVo1RzJTeWp2bHFGY05Jc2w1aUViV3dUZE5VeEwr SG1uQTVFaVR1MldZbWIyMXdMdUJ4NnRDIgogICAgIlQxVVlaVDVwc3FSbGJnK1lGRFBvU2ZtN3U0 R2Y1Z2dKRVFPeUFpWXBabWpzbzZaSzhqOGdiY3ViVjdmTU9ndjQzeXJNS3Nzb2krN0dLTEk3dFFk TThzNzIiCiAgICAiRWVCRytidWRic3lFb2FrTGVaL25DWGMrQVlzOHpYM1hqUSt6TmI0QUxBQldP NEh2ZWRUbnBmR3JQV0NTRHhKV0ExY0F2NndFZWFmZW03cndleWlBejh5RiIKICAgICI4QjR0K2JZ SWVpSHdQMUdDMjQycm1FVUFkTWN5c0piV1UwYlpZSDhuaWV1R1NRM0hoSnZrSjI0bEZPK01LUDBN YjJVMUQzKzhXOEp6SGJDZDdrb2JGZzJlIgogICAgInBGeXJWS1NabGh6a011QmFGNEozWXdhZWs4 MytBMEpadk5iR2QreU55eVA2TzRCUGlHRVAwbDNoMEtLK0M4VDhSbEVlcEFYdmFRQy9BTnpNR3d0 clpYT2kiCiAgICAibXRUL1ZFSzVvNzRQTVNpUFlZbm0rR1BsaVRjd3NEUmYxUXhlQjd5emFFTGNp VkhHakpIQUY0RTNsYld0VVZTV0FoOGpsTnpYTzAydHlpQ1BUTlRiZkxxdCIKICAgICJjMldhWXdy c0F2NUllTjRPQmhaRHEvajZXNEFwWW5qYURhUE1qM3lVMEFsVUJRN0puTVpjQmZ3TkE4c0ZWVEwv ZWhRSjV1RjhIdTlydW5uVUsxcUVwbnYrIgogICAgInEvTFRtNXdwTEJzOU40Q1p3Z1U3Q3Y5ZzRi a3g2VVFsbTFVazB5YndPbkNwbkhPOWdwbEwyakIyZ2hZN1c4bjNRY0FvM2Z1YXBINHRvWmZ2UmVD Vk52aGMiCiAgICAiV1VLYnI1bFBxRmhQTDZJVmcvanJpL1NldHNGS08wWjV3UE4rSllCbHRTbHpr ZFFpNERzVklKU1lRYWswZTZIbWRBeHdTTUY1YlFDZUpsU1o3OWUvcjNmQiIKICAgICJNRnZMWFBu YVNSV1laVnI2Z2hSaVN6c2twUjJqakxOWEFsK3F5Q1FMSEs0RXZrS283dlpWY0xxSUdaY0Q3OVdD Mm1HRDJTQUNGMS9QQXYraVVQazVOMmFaIgogICAgImlNNll0VUFBd01qSXQ1ZlJxcjhGL3J5ZFZ1 VXh5Z1lacDJSdkpnTTdib3BjbG1OOUhMaStwQ2FsanVoVGdOOEhmbHU0bkgrL1owQlNRSEJpc05l ZTJTcWYiCiAgICAiOC9jQ2VpbUpHdGphRmdsUmFaWjBFYmJXSFJMQ1ovTWl5blFRUWwxRGFJd3Nx ODROVGY2YllsS1pKTkZMOUJYQXc4QmZpa2tlbmZBQlFWTFFoTWFCaUFVaCIKICAgICJZeVVNRHdN ZkFRNG9DY2lhVU41UlliMjRvT2dnYVZSV3hFZlpvaWNKR0oxU1VwdU1xU3VCa3drMUlncEtwMG5t ZE9WcjV6bENER1duVW95VUx3ZXVCbGFVIgogICAgIklMclg3bjhIemlqcExreXIrb0I1aE03Y0FW cVZ0b21DcnBKZktLTk5KZ203cFEwYlN5U0Z4cVF6RldHZXgvRDFXaVFNck02ZUF2eUFWdTlEcmFC cHRlZXYiCiAgICAiRU5LU2xQQjFkdTlJUWl2REc4TDFOTHE1SVJXOHFrSmlhMHk5VVJGVnZhQTBH cFBlTDRjODB4Rm9PQnBFWTRhWk9ieE55WGxSNU55MDhrV1pzRkxvdUhNNSIKICAgICJseWpkR0FB dnBUbmF0S2lDYjdKN1g1Q2RUa3N5NlJvUnBzWXdkWjRXOEpNTjRLK0JUNVZnbGduWXJkTEtNc213 S2Nvb1JjcTBZNVM5OERjclFqb0o4QmZ5IgogICAgIlMwWFUzdUNqeXdsZHRNMEswZVZRWFlhYzlB TWZkZ0JxRVFFeW4vZW5ncHdvUVU5Yis2WEFhQmZkN3ZuQzFIU3V3RkpLRU15azdTRkZla1ZVM2t6 TW1jQ1giCiAgICAiNlUwbGRTaE40VjlKeW90VURjd2lQQXg4bzZRSnRIdG5FeW9MZTJpU1JnUmF4 TUMyNDZJTEF2aXM4MnRaQVp4cnVzeGR2VWRNTWtuMm42d0h6UEoxczNrVSIKICAgICJLMDBZSFQ0 bnJVcEx6TVhtZmJIWFJyL2pyKzVDNHJLKzZUSGduZ0pSbmtjS2JuSDVVZG9GY3hvT2lrbWpqKy9q YTNiQkxPUTdiaVZVRURvbDJUYWZKd3JTIgogICAgIkpiWTJpVFRxWUh1WDcwZVlTK2dtcXVJbmJx SlZuUzJpVFI4Z2RPVlViVTdNR0ZnK1Q1WFpyeWJValo0UUVQczZyZTB6S2RWclh2YnNzZkxEUlFJ dFkrUS8iCiAgICAibEF6TWpLbVRCVTBCMUZMM2d0TkxadFhHMFBXU0dqbzg2eWR3UGRYcVdsNWFh eHI3SzRSMnI3a2k1QWt5VWNkSzhNNlJJSzJodTk0SE00Ri9xUGQySXI0SiIKICAgICIwakpDbTFp WmNjMzhMVFJhZTBlM3NDU2dhTTk5VjhoMEVXM0t0TkJwVkM4THBNTG5Qa0hZbUgwbHNGaG95RFph elNxdlNhdVdFTXI5eHlrU2U0VnF2UTltIgogICAgImVVWXJDc3dLbXJHR3dOK3lRcEVBdnlKSXEy R01HaThwcEtTS0lpQXlLWEJ2UTlwMFZVWHphbWJ5aDRSU3gzV0VkdWE4L3ZLOHZ2Uk5DbmptRStw aVZaaGwiCiAgICAiOURwZjlPcVU4NWt3TDVacHJoVmtzTkh6Q0VXQWU0aDFsTVAxa29MYWxNcWNQ RURuV280dDVuSmFwZWNxcFFEcmIzK0tnYjBXOFk2TnZKMGVWcDFkUTJnRCIKICAgICIrMlJGQUxX cHlQajNTcGpwNTRCSFMrQ2V0cTREWk1yM01PcjRrcEdKU2NXUFpHSTZoWjlHNk1zcU9ITjc5aTdn ZmNJU3EvUmErTjZIbW9LQ1QxZGdsZ25kIgogICAgImViUjJheVFGN3Y5QnllVFg3cHZuR1RXbjVF dUlCazhMK0thVDVDY29FZW1aYVhuU2dhUlZlaTNpZDlwN1AwSTRtcUFNczB6YXB4QU9MdW0wZnFQ cC9SVmQiCiAgICAieXh6LzBORWxBd2tqL3ZJQzZteGpuRk9TeUI2TnY0cFdBMlF2bWpKOU5maHFB dEtmVnREUWN3b0l1SDIzb3VRNHhvdlp3S2lVZ0pZZlZvSlJabmZYMFNwaCIKICAgICJkeko3QUw5 YUlhcE1nYThyeE8zMUFSeW1WYXNKMWQweXB0K0NsWk5GdjhGOHJyMXpBd0cwcGlTakRnR21wb3JF SnBVa0lzQkxoR2FNcEVCSU8xVjVUVkhWIgogICAgInQ2aXdUd25qVUJZTnJiOXVmWW1vek5Zd3M2 QTFzdmV1cXVCaXhnS0hwdUxZMkpLTFF6bEsxa0dWYlVHekNLMWRaYlYydVV3R0RNMXhOcWExNjVR UGxobkgiCiAgICAiZ29pakN3aWdyZm1aa2hwbC9SMHpVdUZKOVJKRXRFRldGWGpHdm50elNTTFlH UGN5UEVjZUpJUVNlaG1yWW5NOHNzUTRxeXBvUE1BVU0zMUY0M3QvdlZyaSIKICAgICIzbGtsVmQ2 azg5R0swV2lWd09KSldtV01NdVBOTGhGUXJDOForZGsxcFU2cm43em85bjY3YjFlSmdjcU00VnVn MXd3VG95QjAxSzRqSEFkVUZON0tuTnNvIgogICAgIk1zY2RKV2x0THVBUVkxU1pJMjlHdUxDNUtC R21hWXdSSmFLZHBPQVl2YnAyYUx5aXREQjNNYkVFbzNhV3BMV044YVk2clhOWGR6TndHMmFXUXp4 a0hnNmciCiAgICAiMWNkZGRJTGJSSXg2RzJZbVVkaHNUZjdEZGZWSnE4YlRLdGwwQ2laR0ZIUUJ0 c2J0d2h6OU9SbmswTkUzakI0QWJFNmVlbnJsYUVKWGJDUG53U3g2WWVZaSIKICAgICJ2VTBsSkg2 c1B2MFJVN0pCdENxVk1Bd1hzeEpweDRobzNWbUhaN1pMQ0l0YW80UEpQNXN3eTBuR0xiVGZhaHIx K2hBVFlhcysrL0tWbFF5UXV0SGEwbGMzIgogICAgInpZMWx0ODBrRlo0Wjd0T1JoNHNXbFJpVkRa TzBaajFhZkJJbGhGbVA1emtjdEtqRXFQM3R5b2FScVB2TWxlNG44MHljWS8waVllUFlVc0pHdHYx cEhULzMiCiAgICAialBMelBadlFpSE0yQWFmc3hyZnNOMWM5Q29kamYrSWJFSnM1UlBPaFpaN2py MFY1Ui94N3YxcytibWx1OTg1dDdsMTl0TnJCOHJMNlR1Ri9FcTExc0wvSiIKICAgICJFUjhBYkIx YzhmT05uTEg4ZWh0VjVsUHY4QUpQckxnMXQwaEUxaWo0KytZZ0RHMUVDNnE3aFZ1dnhLNlNXdGxr Y0lBNHJ3MjVrUk9STnRzUVBVNWUrN3VkIgogICAgImo0ZEJUaVljMHZSbUFsQ2JDZnQ2aE5CVC9s S2tRYjlGT00wa0kvVDFmWnVCMnpvbkVEcUZSaFA2S3E1WG5qS0cwSzh3a1hDNHhuWkNLL1Y4SmQ1 YkNLYzYiCiAgICAiTHlZVTlRWXphd2NSZWdvV2FONWpOTlovRVZxMDRoYnJ1RDF1SVFIYmcxRFll NUR3MXdKMlJQZldhZTBaK3daaDAvWTh6ZmtZd2lHT1d3aG8vOUpvck1NSiIKICAgICJ6VFFRUU5t djU4eW5walhNSjdSNko2TFY0NFIyaDQyMjQvQ2pJbVM3NjJlRXhwUjdCV25zRmlFVzZmdlBFbnJt Nms3U1poRDJDdmxTeC9QS3pKOFhVVmZUIgogICAgIk9xVXl2allSOWlmZDdEUnJCQUhsUGxKanJI VTRZbnpkVHVoNjZuTW10VWtvWU41STYrU3crSHFTY05Ub3ZXN2NVWVRxN0JRSjdscEN2MFFlelBR RndsWlQiCiAgICAiMnczeUxrSnZJUkwyV2JRYWRocUV5dmRueEtTOGF6VndtMm5VY3NJNWNnL3Bp eWFoS251K0NENlZzT3ZpZUVrT3dnZE5wVi9OQ1o5M2ljR1RkVytmTTNPYiIKICAgICJKSVdIT3cz WUtJS2NxR2NtRUxiajdDTHN6RTl5ek9SMC9idFdtbm13bnVzbk5ObmZBM3pOQ2RjeGhETUdwempF NUFHOTh4U05PMGVFZmJlWVpXdmFKQ3R3IgogICAgIlV1UXZ0MnJja1JyM2FqMTNoL09qRFNkOHZq cHdodVk0V3QvdmxxQnNsdlllSmhvZFlveTZUNm9jWTNkZklqUThIa1FvTzU4bFNUWGNxajVJVHBP NGUycVIiCiAgICAidXRlZDlsMUVxMmlISm5hekpMRkphT2xhQ3Z4ZnBEa0o4SStFbHVhZnlseE5W dmkrUU05ZUlrYVpCSDllVEdvUStqM2VTNnVDUEZ2clBWMUV2NFhRVTdjdCIKICAgICJXa3VEMWwv QmVVTEVuMFZvbTU3dnhyM0RyYmVXZzNHTzEzaWphZFhEZnBld1hhZGZjNWhKNkpaZDRzUHpQSWYz aEI0MDN6TzNSR2hmYTJNYWZJU1pTdXQ4IgogICAgImtMQmFKdXRsQjVSZUZFVmU5cDZiQ0kwdjY2 UlJxd2lObFRiR1VSSXlNekduMGRyZGNhbVlaRUx6dk16N2VxMzFMZEtxR0dwTDVIdnZGTE0zeUJ4 K3lFV0MiCiAgICAiUjlFNmN5SU9MR3p0RjRyQlRWbVRDN1FXQTJ4MzZmMWZCbDZKVDVjY1JUaEZi SjVNMER5WkRadmd1QUtNaW84RmJSZnllMFRaZDdYV05mR2xibTRudVBkNCIKICAgICJyUnBINjBn Q0k5SnFaMlpIYTAwUTJxQnQzc3NJVzRWc2E2b2RRZkN5Z2drYmQyRWJqRzZzRzdmbXh0M3Vnck94 YlhJOG84T1pqbkdMSldRam9uV2FOaWFHIgogICAgIjlVMG1iSUU4VjA0L0x2RDFSMkZ4MFNRenI4 WXlXQjNHdi9zWjkvTWhiY1p0T0xNV3R6Q1BjQjh6cVhZOTB3WWt0dlpqKzNsYXpoeDl2dVQvTEpF UHNRL1UiCiAgICAiaHpiNUhmTDl0cGJIY3JETEFUaG1YZUhwOTJoMXNTSlRZaThjVDM1bHR1aEJI SGtMTGZLZVhUMUFwNU1JZm9wem9yeXgrMHVPUVFjQnpOcXN3OSs3bzlNNiIKICAgICJVOW5XNHpU Qnh3bUhRUjJ0Q09sdGNzNjFuQmU5NW40K01FSXF6UGttQmREenBJMG1lbWxlbDRPR0RNYmtKTWZN cm5Gem1ORm1Udkc0Rzlva3NWWFJjbSs2IgogICAgInQ3anZqcUQ5Qm8wOW02M053ZFlWWVQyb2wx aXhiMTJiUWRlNS84K0tNdlZNSVdaV1lQSU5CaDZNYUkzODczUVRmZHd4S3Eyb1hTc2N3VStsVldr MTgyam0iCiAgICAiM2U4VGU3UUxqY3J6NWY2ZVI5MTh6bmQ1VlQzeWYzdjI4SHBWUDhVUnI5OUpY OTYxMGtFcDV5cXNOVWhuQ3VFWWhORUZOR0dpbnR1dE1VY3JtcHVyZDIwViIKICAgICI2Z0hsZHls NlRmaSsvRTlDNkF5K2dkYUpaeFo4ZkZJUlcxT0Nka2ZPdUVrQk0rdC9ycmVaejEyMERuNmNRemhV T1hPL3MzL0hHSVMwbUhCS3NoM01NVm5oIgogICAgIjVsZ1IvelJhalM5ZUUrNlRINmtyeVZ3cXlX OG9Kem5VMlh6Zm01MUd3T3ZYbEdDdUZ0UE9rdGsxVGJ0ZUNBY2RjTWs4N013bng5c0pmNURyTy9y L2IyaWUiCiAgICAiUzJqOVdhR0ZMaEw3TTBXQjNuUVgyZnJhaU5icjhVcmZjN0pDd25LdEJPV0Rj a0czQzBDWXFNajdkT0REZGNFcDh3bjdZQ0hzUVhwZkJLbk1jZGdhQ3RsWCIKICAgICJ5MVIrM1Az dVpQZmNlaVdEUnlvZ1NkcVlpS25DRGZNSS9pbEpXczFGV1JPZHp4elJKbjhiNWNKM0h6amRveHp0 QmduWEtjNksrQ0RtWTBwNGF5NnZHZS9HIgogICAgInJiV3BSRmhJUHNIZE05TDlQTll4MUlSaG5G di9HZnJFMTJYVzNIS3hUTlc1Q29YN1pDWVdFL2IxWEtzc2VZa3pqUW5oaUxhWENJZjVqbmVPZnpu aEREd0kiCiAgICAiaDJsc2RkQlRIR0ZkSjJhZVFHdC83Z3JnbndWcCtkNkpuUXB1Wm1nT0wrVUVL eHMxOW1oQlM1dmRuRk5wOERMQ241VmRJQXVTS0hCWXBnUnpSUVRLN2xhQyIKICAgICJPMHYwZWpr SHp0b3FRUmdqRkdXVGZ2OGk4SjlpMWsraWFMQ1BjQmJoVXNKaFY4ZlNPcnplOWlBdkJiNlZQUFgw eW00aUdpcjRpMm5TMGdraTNsc0ZlRnFVIgogICAgInVMdER1YUVYeGNkbWxMd2FicGNONGJoRjBw Y0pFYU5lOWVycXMrRDQ3elhCd1BiZXZHSmVmTHhuT2tnaE1NdVpuSmtVdjlXelZyQVkyYTdJbHc1 U04vTW4iCiAgICAiVkRZWTJNWTIyTGhwVkRiSk9xUUZ6UTdJQk5GNkRhemVsTFBlUVF1SGpRSUZ3 THprc2RtbUVPaVBGVDJBTjU2VDV4bGVaTHpCcm1iQjc1TVM3MjRXU0w0NyIKICAgICJKYmxGYUpq a0JUQzkvdE4yUmE0KzJlMkRwVVc3Q3lURlEzWHRhNTFNYldudy8rUUdYcjl5dXdDeUFBQUFBRWxG VGtTdVFtQ0MiCikKUEsDBBQAAAAAABRbal29qKPS9JMAAPSTAAAbAAAAYXVwaG9uaWNfcmVzb2x2 ZS91aS9tYWluLnB5IiIiTWFpbiBzY3JlZW4gKGFmdGVyIGxvZ2luKTogYSBwYXNzaXZlIHZpZXc7 IHRoZSBsb2dpYyBsaXZlcyBpbiBgYG1haW5fc2NyZWVuLnB5YGAuIiIiCgpmcm9tIF9fZnV0dXJl X18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgdGV4dHdyYXAK ZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IENhbGxhYmxlCmZyb20gZGF0YWNsYXNzZXMgaW1w b3J0IGRhdGFjbGFzcwpmcm9tIHR5cGluZyBpbXBvcnQgQW55Cgpmcm9tIC53aWRnZXRzIGltcG9y dCAoCiAgICBDQVJEX1BBRERJTkdfUFgsCiAgICBDQVJEX1NUWUxFLAogICAgQ09OVEVOVF9TUEFD SU5HLAogICAgRVJST1IsCiAgICBFUlJPUl9TVFlMRSwKICAgIElORk8sCiAgICBNVVRFRCwKICAg IE1VVEVEX1NUWUxFLAogICAgTk9USUNFX1NUWUxFLAogICAgT0ssCiAgICBQUklNQVJZX0JVVFRP Tl9TVFlMRSwKICAgIFBST0dSRVNTX0JBUl9TSVpFLAogICAgV0FSTiwKICAgIGNhcmRfZmllbGQs CiAgICBlbGlkZSwKICAgIGZvb3RlciwKICAgIGxpbmtfYnV0dG9uLAogICAgbWVzc2FnZV9sYWJl bCwKICAgIHBlcmNlbnRfdGV4dCwKICAgIHByb2dyZXNzX3N0eWxlLAogICAgcmVzdWx0X2h0bWws CiAgICByZXN1bHRfc3R5bGUsCiAgICBzZWN0aW9uLAogICAgc2V0X2NhcmQsCiAgICBzZXRfbWVz c2FnZSwKICAgIHN0ZXBzX2h0bWwsCiAgICB0YWJsZV9odG1sLAogICAgdGV4dF9odG1sLAopCgpM QUJFTF9XSURUSCA9IDY0ClRSRUVfTUlOX0hFSUdIVCA9IDExMCAgIyB0aGUgbGlzdCBncm93cyB3 aXRoIHRoZSB3aW5kb3cKIyBUaGUgVHJhY2sgLyBjbGlwIGNvbHVtbjsgUXQncyBkZWZhdWx0ICgx MDAgcHgpIGN1dCBvZmYgYWxtb3N0IGV2ZXJ5IG5hbWUuIFRoZQojIHRpbWVjb2RlIGNvbHVtbiBh ZnRlciBpdCB0YWtlcyBhYm91dCAxOTAgcHgsIHdoaWNoIGZpdHMgdGhlIGRlZmF1bHQgd2luZG93 IHdpZHRoLgpUUkFDS19DT0xVTU5fV0lEVEggPSAzMDAKUlVOX0RFVEFJTF9DSEFSUyA9IDUyICAj IHBlciB2YWx1ZSBpbiB0aGUgcnVuIGRldGFpbHMgY2FyZCwgdG8gc3RheSBvbiBvbmUgbGluZQoj IFRoZSBzdW1tYXJ5IGNhcmQgaXMgYSBsYWJlbCwgYW5kIGxhYmVscyBkb24ndCBncm93IHdpdGgg d3JhcHBlZCB0ZXh0IGluIFVJTWFuYWdlcjoKIyBhIHR3by1saW5lIEF1ZGlvIHZhbHVlIHdhcyBk cmF3biBvdmVyIHRoZSBjYXJkJ3MgYm90dG9tIGVkZ2UuIFNvIGl0cyBoZWlnaHQgaXMgc2V0CiMg ZnJvbSB0aGUgbGluZSBjb3VudC4gQ2hhcmFjdGVycyBwZXIgbGluZSBvZiBhIHZhbHVlIGF0IHRo ZSBzbWFsbGVzdCB3aW5kb3cgd2lkdGgKIyAoY29uc2VydmF0aXZlOiBhIGxpbmUgdG9vIG1hbnkg bGVhdmVzIGEgbGl0dGxlIHJvb20sIG9uZSB0b28gZmV3IGN1dHMgdGV4dCBvZmYpLgpTVU1NQVJZ X1ZBTFVFX0NIQVJTID0gNDYKU1VNTUFSWV9ST1dfUFggPSAyMCAgIyBvbmUgbGluZSBvZiBhIHRh YmxlIHJvdyAoaXRzIGNlbGwgcGFkZGluZyBpbmNsdWRlZCkKS0VFUF9PUl9ERUxFVEVfU1BBQ0Vf QUJPVkUgPSAxNCAgIyBweCBiZXR3ZWVuIHRoZSBDYW5jZWxsZWQgY2FyZCBhbmQgS2VlcCAvIERl bGV0ZQpBQ1RJT05TX1NQQUNFX0FCT1ZFID0gMTAgICMgcHggYmV0d2VlbiB0aGUgc3VtbWFyeSAo b3IgdGhlIHJlc3VsdCkgYW5kIHRoZSBidXR0b25zCiMgVUlNYW5hZ2VyIHdpbmRvd3MgZG9uJ3Qg Z3JvdyB0byBmaXQgdGhlaXIgY29udGVudDsgdG9vIHNtYWxsLCBhbmQgY29udHJvbHMgYXJlIGRy YXduCiMgb24gdG9wIG9mIGVhY2ggb3RoZXIgKHNlZW4gaW4gUmVzb2x2ZSAyMS4xLjEpLiBTYXZl ZCBzaXplcyBhcmUgcmFpc2VkIHRvIHRoaXMuCk1JTl9XSU5ET1dfU0laRSA9ICg0ODAsIDgxMCkK Q0hFQ0tFRCwgVU5DSEVDS0VELCBQQVJUTFkgPSAiQ2hlY2tlZCIsICJVbmNoZWNrZWQiLCAiUGFy dGlhbGx5Q2hlY2tlZCIKREVGQVVMVF9HRU9NRVRSWSA9IFszMDAsIDEyMCwgNTYwLCA4MDBdCkZP TExPV19UT09MVElQID0gKAogICAgIldoZW4gb24sIGNsaXBzIHlvdSBzZWxlY3QgaW4gRGFWaW5j aSBSZXNvbHZlJ3MgdGltZWxpbmUgYXJlIHRpY2tlZCBoZXJlICIKICAgICJhdXRvbWF0aWNhbGx5 LiBUdXJuIGl0IG9mZiB3aGlsZSBlZGl0aW5nLCBzbyB5b3VyIHRpY2tzIHN0YXkgYXMgdGhleSBh cmUuIgopCkVESVRfQUdBSU5fVE9PTFRJUCA9ICgKICAgICJPcGVucyB0aGUgcHJvZHVjdGlvbiBv biBhdXBob25pYy5jb20uIENoYW5nZSBpdHMgc2V0dGluZ3MgYW5kIHN0YXJ0IGl0IGFnYWluICIK ICAgICJ0aGVyZTsgdGhlIG5ldyByZXN1bHQgdGhlbiByZXBsYWNlcyB0aGlzIG9uZSBvbiB0aGUg dGltZWxpbmUuIgopCkVESVRfVE9PTFRJUCA9ICgKICAgICJVcGxvYWRzIHRoZSBhdWRpbyBhbmQg b3BlbnMgdGhlIHByb2R1Y3Rpb24gb24gYXVwaG9uaWMuY29tLCB3aGVyZSB5b3UgY2FuIGNoYW5n ZSAiCiAgICAiaXRzIHNldHRpbmdzIGFuZCBzdGFydCBpdC4gVGhlIHJlc3VsdCBpcyB0aGVuIGFk ZGVkIHRvIHRoZSB0aW1lbGluZSBhcyB1c3VhbC4iCikKTk9fQ0xJUFMgPSAibm8gY2xpcHMiClNF VFVQLCBSVU5OSU5HLCBSRVNVTFQgPSAic2V0dXAiLCAicnVubmluZyIsICJyZXN1bHQiClNVTU1B UllfS0VZUyA9ICgiQXVkaW9TdW1tYXJ5IiwgIkluIiwgIk91dCIsICJEdXJhdGlvbiIsICJNYXJr ZXJzIiwgIkVzdGltYXRlIikKUkVTVUxUX0NPTE9VUlMgPSB7Im9rIjogT0ssICJub3RpY2UiOiBX QVJOLCAiZXJyb3IiOiBFUlJPUiwgSU5GTzogTVVURUR9ClNJTEVOQ0VfSEVBRExJTkUgPSAiVGhl IHJlbmRlcmVkIGF1ZGlvIGlzIHNpbGVudCIKU0lMRU5DRV9URVhUID0gKAogICAgIkluIERhVmlu Y2kgUmVzb2x2ZSwgYSBzb2xvZWQgdHJhY2sgb3IgZGlzYWJsZWQgY2xpcHMgb24gdGhlIHRpY2tl ZCB0cmFja3MgY2FuICIKICAgICJjYXVzZSB0aGlzLiBHbyBiYWNrIHRvIGNoZWNrIHRoZW0gYW5k IHN0YXJ0IGFnYWluLCBvciBjb250aW51ZSBpZiB0aGUgc2lsZW5jZSAiCiAgICAiaXMgaW50ZW5k ZWQuIgopCk9QRU5fVEVYVCA9ICJPcGVuIFByb2R1Y3Rpb24iCkVESVRfVEVYVCA9ICJFZGl0IG9u IEF1cGhvbmljIgoKCkBkYXRhY2xhc3MKY2xhc3MgTWFpbkNhbGxiYWNrczoKICAgIG9uX2xvZ291 dDogQ2FsbGFibGVbW10sIE5vbmVdCiAgICBvbl9yZWZyZXNoX2FjY291bnQ6IENhbGxhYmxlW1td LCBOb25lXQogICAgb25fY2xvc2U6IENhbGxhYmxlW1tdLCBOb25lXQogICAgb25fdHJhY2tfY2hl Y2tlZDogQ2FsbGFibGVbW2ludCwgYm9vbF0sIE5vbmVdICAjIHBvc2l0aW9uIGluIHRoZSBsaXN0 LCBjaGVja2VkCiAgICBvbl9jbGlwX2NoZWNrZWQ6IENhbGxhYmxlW1tpbnQsIGludCwgYm9vbF0s IE5vbmVdICAjIHRyYWNrIHBvc2l0aW9uLCBjbGlwIHBvc2l0aW9uCiAgICBvbl9wcmVzZXRfY2hh bmdlZDogQ2FsbGFibGVbW2ludF0sIE5vbmVdCiAgICBvbl9yZWZyZXNoX3ByZXNldHM6IENhbGxh YmxlW1tdLCBOb25lXQogICAgb25fcmVmcmVzaF90aW1lbGluZTogQ2FsbGFibGVbW10sIE5vbmVd CiAgICBvbl9jbGVhcl9pbl9vdXQ6IENhbGxhYmxlW1tdLCBOb25lXQogICAgb25fbXV0ZV9jaGFu Z2VkOiBDYWxsYWJsZVtbYm9vbF0sIE5vbmVdCiAgICBvbl9mb2xsb3dfY2hhbmdlZDogQ2FsbGFi bGVbW2Jvb2xdLCBOb25lXQogICAgb25fc3RhcnQ6IENhbGxhYmxlW1tdLCBOb25lXQogICAgb25f ZWRpdF9zdGFydDogQ2FsbGFibGVbW10sIE5vbmVdCiAgICBvbl9jYW5jZWw6IENhbGxhYmxlW1td LCBOb25lXQogICAgb25fa2VlcF9wcm9kdWN0aW9uOiBDYWxsYWJsZVtbXSwgTm9uZV0KICAgIG9u X2RlbGV0ZV9wcm9kdWN0aW9uOiBDYWxsYWJsZVtbXSwgTm9uZV0KICAgIG9uX2JhY2tfdG9fc2V0 dGluZ3M6IENhbGxhYmxlW1tdLCBOb25lXSAgIyB0aGUgcmVuZGVyIHdhcyBzaWxlbnQ6IGZpeCBp dCBmaXJzdAogICAgb25fY29udGludWVfc2lsZW50OiBDYWxsYWJsZVtbXSwgTm9uZV0gICMgdGhl IHJlbmRlciB3YXMgc2lsZW50OiBwcm9jZXNzIGl0IGFueXdheQogICAgb25fbmV3X3Byb2R1Y3Rp b246IENhbGxhYmxlW1tdLCBOb25lXQogICAgb25fZWRpdF9hZ2FpbjogQ2FsbGFibGVbW10sIE5v bmVdCiAgICBvbl9vcGVuX3VybDogQ2FsbGFibGVbW3N0cl0sIE5vbmVdCiAgICBvbl9zaG93X2Zp bGU6IENhbGxhYmxlW1tdLCBOb25lXQoKCmRlZiBfcm93KHVpOiBBbnksIGxhYmVsOiBzdHIsIHdp ZGdldDogQW55KSAtPiBBbnk6CiAgICByZXR1cm4gdWkuSEdyb3VwKAogICAgICAgIHsiV2VpZ2h0 IjogMH0sCiAgICAgICAgWwogICAgICAgICAgICB1aS5MYWJlbCgKICAgICAgICAgICAgICAgIHsK ICAgICAgICAgICAgICAgICAgICAiVGV4dCI6IGxhYmVsLAogICAgICAgICAgICAgICAgICAgICJX ZWlnaHQiOiAwLAogICAgICAgICAgICAgICAgICAgICJTdHlsZVNoZWV0IjogTVVURURfU1RZTEUs CiAgICAgICAgICAgICAgICAgICAgIk1pbmltdW1TaXplIjogW0xBQkVMX1dJRFRILCAwXSwKICAg ICAgICAgICAgICAgICAgICAiTWF4aW11bVNpemUiOiBbTEFCRUxfV0lEVEgsIDEwMF0sCiAgICAg ICAgICAgICAgICB9CiAgICAgICAgICAgICksCiAgICAgICAgICAgIHdpZGdldCwKICAgICAgICBd LAogICAgKQoKCmRlZiBfaGVhZGVyKHVpOiBBbnksIGxvZ286IHN0cikgLT4gQW55OgogICAgIiIi TG9nbyBvbiB0aGUgbGVmdDsgYWNjb3VudCwgY3JlZGl0cywgUmVmcmVzaCBhbmQgTG9nIE91dCBv biB0aGUgcmlnaHQuIiIiCiAgICByZXR1cm4gdWkuSEdyb3VwKAogICAgICAgIHsiV2VpZ2h0Ijog MH0sCiAgICAgICAgWwogICAgICAgICAgICB1aS5MYWJlbCh7IklEIjogIkxvZ28iLCAiVGV4dCI6 IGxvZ28sICJXZWlnaHQiOiAwfSksCiAgICAgICAgICAgIHVpLkhHYXAoMTIsIDApLAogICAgICAg ICAgICB1aS5WR3JvdXAoCiAgICAgICAgICAgICAgICB7IldlaWdodCI6IDEsICJTcGFjaW5nIjog MH0sCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgIyBXcmFwcywgc28gbG9u ZyBuYW1lcyBjYW4ndCBwdXNoIHRoZSBidXR0b25zIG91dCBvZiB0aGUgd2luZG93LgogICAgICAg ICAgICAgICAgICAgIHVpLkxhYmVsKAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAiSUQiOiAiQWNjb3VudCIsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAiVGV4dCI6ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIldvcmRXcmFw IjogVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZWlnaHQiOiAwLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgIkFsaWdubWVudCI6IHsiQWxpZ25SaWdodCI6IFRydWUsICJB bGlnblZDZW50ZXIiOiBUcnVlfSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAg ICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgdWkuSEdyb3VwKAogICAgICAgICAgICAg ICAgICAgICAgICB7IldlaWdodCI6IDB9LAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICB1aS5IR2FwKDAsIDEpLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgdWkuTGFiZWwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUQiOiAiQ3JlZGl0cyIsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXh0IjogIiIsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICJXZWlnaHQiOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAiU3R5bGVTaGVldCI6IE1VVEVEX1NUWUxFLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICBsaW5rX2J1dHRvbih1aSwgIlJlZnJlc2hBY2NvdW50IiwgIlJlZnJl c2giLCAiUmVsb2FkIHlvdXIgY3JlZGl0cyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg bGlua19idXR0b24odWksICJMb2dvdXQiLCAiTG9nIE91dCIpLAogICAgICAgICAgICAgICAgICAg ICAgICBdLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBdLAogICAgICAg ICAgICApLAogICAgICAgIF0sCiAgICApCgoKZGVmIF9zZXR1cF9wYW5lKHVpOiBBbnkpIC0+IEFu eToKICAgIGF1ZGlvID0gWwogICAgICAgICMgVHJhY2tzIHdpdGggdGhlaXIgY2xpcHMsIGVhY2gg d2l0aCBhIGNoZWNrYm94LiBDbGlja2luZyBhIGNsaXAgaW4KICAgICAgICAjIFJlc29sdmUncyB0 aW1lbGluZSB0aWNrcyBpdCBoZXJlIHRvbyAoUmVzb2x2ZSAyMS4wLjQrKS4KICAgICAgICB1aS5U cmVlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiSUQiOiAiQXVkaW8iLAogICAgICAg ICAgICAgICAgIldlaWdodCI6IDEsCiAgICAgICAgICAgICAgICAiTWluaW11bVNpemUiOiBbMCwg VFJFRV9NSU5fSEVJR0hUXSwKICAgICAgICAgICAgICAgICJFdmVudHMiOiB7Ikl0ZW1DaGFuZ2Vk IjogVHJ1ZX0sCiAgICAgICAgICAgIH0KICAgICAgICApLAogICAgICAgIHVpLkhHcm91cCgKICAg ICAgICAgICAgeyJXZWlnaHQiOiAwfSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgdWku Q2hlY2tCb3goCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAi SUQiOiAiRm9sbG93U2VsZWN0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlRleHQiOiAi Rm9sbG93IHRpbWVsaW5lIGNsaXAgc2VsZWN0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAg IlRvb2xUaXAiOiBGT0xMT1dfVE9PTFRJUCwKICAgICAgICAgICAgICAgICAgICAgICAgIkNoZWNr ZWQiOiBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAiV2VpZ2h0IjogMCwKICAgICAgICAg ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgdWkuSEdhcCgw LCAxKSwKICAgICAgICAgICAgICAgIGxpbmtfYnV0dG9uKHVpLCAiUmVmcmVzaFRpbWVsaW5lIiwg IlJlZnJlc2ggVGltZWxpbmUiKSwKICAgICAgICAgICAgXSwKICAgICAgICApLAogICAgXQogICAg cHJvY2Vzc2luZyA9IFsKICAgICAgICBfcm93KAogICAgICAgICAgICB1aSwKICAgICAgICAgICAg IlByZXNldCIsCiAgICAgICAgICAgIHVpLkhHcm91cCgKICAgICAgICAgICAgICAgIHsiV2VpZ2h0 IjogMX0sCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgdWkuQ29tYm9Cb3go eyJJRCI6ICJQcmVzZXQiLCAiV2VpZ2h0IjogMX0pLAogICAgICAgICAgICAgICAgICAgIGxpbmtf YnV0dG9uKHVpLCAiUmVmcmVzaFByZXNldHMiLCAiUmVmcmVzaCIsICJSZWxvYWQgeW91ciBwcmVz ZXRzIiksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICApLAogICAgICAgICksCiAgICAg ICAgX3Jvdyh1aSwgIlRpdGxlIiwgdWkuTGluZUVkaXQoeyJJRCI6ICJUaXRsZSIsICJXZWlnaHQi OiAxfSkpLAogICAgICAgIHVpLkNoZWNrQm94KAogICAgICAgICAgICB7CiAgICAgICAgICAgICAg ICAiSUQiOiAiTXV0ZSIsCiAgICAgICAgICAgICAgICAiVGV4dCI6ICJEaXNhYmxlIHRoZSBvcmln aW5hbCBhdWRpbyBhZnRlcndhcmRzIiwKICAgICAgICAgICAgICAgICJUb29sVGlwIjogKAogICAg ICAgICAgICAgICAgICAgICJEYVZpbmNpIFJlc29sdmUncyBzY3JpcHRpbmcgY2FuJ3QgbXV0ZSwg c28gdGhlIG9yaWdpbmFsICIKICAgICAgICAgICAgICAgICAgICAiaXMgZGlzYWJsZWQgaW5zdGVh ZDogdGhlIHRpY2tlZCBjbGlwcywgdGhlIHRpY2tlZCB3aG9sZSAiCiAgICAgICAgICAgICAgICAg ICAgInRyYWNrcywgb3IgdGhlIGNsaXBzIGluIHRoZSBpbi9vdXQgcmFuZ2UuIgogICAgICAgICAg ICAgICAgKSwKICAgICAgICAgICAgICAgICJDaGVja2VkIjogRmFsc2UsCiAgICAgICAgICAgICAg ICAiV2VpZ2h0IjogMCwKICAgICAgICAgICAgfQogICAgICAgICksCiAgICBdCiAgICBzdW1tYXJ5 ID0gWwogICAgICAgIHVpLkxhYmVsKAogICAgICAgICAgICB7IklEIjogIlN1bW1hcnkiLCAiVGV4 dCI6ICIiLCAiV2VpZ2h0IjogMCwgIldvcmRXcmFwIjogVHJ1ZSwgIlN0eWxlU2hlZXQiOiBDQVJE X1NUWUxFfQogICAgICAgICksCiAgICAgICAgbWVzc2FnZV9sYWJlbCh1aSwgIlNlbGVjdGlvbk5v dGUiKSwKICAgICAgICBtZXNzYWdlX2xhYmVsKHVpLCAiV2FybmluZ3MiKSwKICAgIF0KICAgIHJl dHVybiB1aS5WR3JvdXAoCiAgICAgICAgeyJJRCI6ICJTZXR1cFBhbmUiLCAiV2VpZ2h0IjogMSwg IlNwYWNpbmciOiAwfSwKICAgICAgICBbCiAgICAgICAgICAgIHNlY3Rpb24odWksICJBdWRpbyIs IGF1ZGlvLCB3ZWlnaHQ9MSksCiAgICAgICAgICAgIHNlY3Rpb24odWksICJQcm9jZXNzaW5nIiwg cHJvY2Vzc2luZyksCiAgICAgICAgICAgIHNlY3Rpb24odWksICJTdW1tYXJ5Iiwgc3VtbWFyeSks CiAgICAgICAgXSwKICAgICkKCgpkZWYgX3J1bl9wYW5lKHVpOiBBbnkpIC0+IEFueToKICAgICIi IldoYXQgcnVucywgaXRzIHN0ZXBzIGFuZCBwcm9ncmVzczsgYWZ0ZXJ3YXJkcywgdGhlIG91dGNv bWUuIiIiCiAgICByZXR1cm4gdWkuVkdyb3VwKAogICAgICAgIHsiSUQiOiAiUnVuUGFuZSIsICJX ZWlnaHQiOiAxLCAiU3BhY2luZyI6IDAsICJIaWRkZW4iOiBUcnVlfSwKICAgICAgICBbCiAgICAg ICAgICAgIHNlY3Rpb24oCiAgICAgICAgICAgICAgICB1aSwKICAgICAgICAgICAgICAgICJQcm9n cmVzcyIsCiAgICAgICAgICAgICAgICBbdWkuTGFiZWwoeyJJRCI6ICJSdW5EZXRhaWxzIiwgIlRl eHQiOiAiIiwgIldlaWdodCI6IDAsICJTdHlsZVNoZWV0IjogQ0FSRF9TVFlMRX0pXSwKICAgICAg ICAgICAgICAgIGl0ZW1faWQ9IlJ1blRpdGxlIiwKICAgICAgICAgICAgKSwKICAgICAgICAgICAg dWkuVkdhcChDT05URU5UX1NQQUNJTkcsIDApLAogICAgICAgICAgICBjYXJkX2ZpZWxkKHVpLCAi UmVzdWx0Q2FyZCIsIGhpZGRlbj1UcnVlKSwKICAgICAgICAgICAgIyBBZnRlciBhIGNhbmNlbDog dGhlIGFuc3dlciB0byB0aGUgY2FyZCdzICJrZWVwIGl0LCBvciBkZWxldGUgaXQ/Ii4KICAgICAg ICAgICAgdWkuVkdyb3VwKAogICAgICAgICAgICAgICAgeyJJRCI6ICJLZWVwT3JEZWxldGUiLCAi V2VpZ2h0IjogMCwgIlNwYWNpbmciOiAwLCAiSGlkZGVuIjogVHJ1ZX0sCiAgICAgICAgICAgICAg ICBbCiAgICAgICAgICAgICAgICAgICAgdWkuVkdhcChLRUVQX09SX0RFTEVURV9TUEFDRV9BQk9W RSwgMCksICAjIGluc2lkZTogaXQgZ29lcyB3aXRoIHRoZSByb3cKICAgICAgICAgICAgICAgICAg ICB1aS5IR3JvdXAoCiAgICAgICAgICAgICAgICAgICAgICAgIHsiV2VpZ2h0IjogMH0sCiAgICAg ICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpLkJ1dHRv bih7IklEIjogIktlZXBQcm9kdWN0aW9uIiwgIlRleHQiOiAiS2VlcCBQcm9kdWN0aW9uIn0pLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgdWkuSEdhcCgwLCAxKSwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHVpLkJ1dHRvbih7IklEIjogIkRlbGV0ZVByb2R1Y3Rpb24iLCAiVGV4dCI6 ICJEZWxldGUgUHJvZHVjdGlvbiJ9KSwKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAg ICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgKSwKICAgICAg ICAgICAgIyBUaGUgcmVuZGVyIHdhcyBzaWxlbnQ6IHByb2Nlc3MgaXQgYW55d2F5LCBvciBnbyBi YWNrIGFuZCBmaXggdGhlIHRyYWNrcz8KICAgICAgICAgICAgIyBUaGUgYW5zd2VycyBhcmUgaW4g dGhlIG1haW4gYnV0dG9uIHJvdzogYSByb3cgb2YgYnV0dG9ucyBoZXJlIHdhcyBkcmF3bgogICAg ICAgICAgICAjIG92ZXIgdGhlIGNhcmQgYW5kIHRoZSBzdGVwcyAoc2VlbiB0d2ljZSBpbiBSZXNv bHZlIDIxLjEuMSkuCiAgICAgICAgICAgIGNhcmRfZmllbGQodWksICJTaWxlbmNlQ2FyZCIsIGhp ZGRlbj1UcnVlKSwKICAgICAgICAgICAgdWkuVkdhcChDT05URU5UX1NQQUNJTkcsIDApLAogICAg ICAgICAgICB1aS5MYWJlbCh7IklEIjogIlN0ZXBzIiwgIlRleHQiOiAiIiwgIldlaWdodCI6IDAs ICJTdHlsZVNoZWV0IjogQ0FSRF9TVFlMRX0pLAogICAgICAgICAgICB1aS5WR2FwKENPTlRFTlRf U1BBQ0lORywgMCksCiAgICAgICAgICAgIHVpLkhHcm91cCgKICAgICAgICAgICAgICAgIHsiSUQi OiAiUHJvZ3Jlc3NSb3ciLCAiV2VpZ2h0IjogMCwgIkhpZGRlbiI6IFRydWV9LAogICAgICAgICAg ICAgICAgWwogICAgICAgICAgICAgICAgICAgIHVpLkxhYmVsKAogICAgICAgICAgICAgICAgICAg ICAgICB7IklEIjogIlByb2dyZXNzIiwgIlRleHQiOiAiIiwgIldlaWdodCI6IDEsICJTdHlsZVNo ZWV0IjogTVVURURfU1RZTEV9CiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAg ICAgICB1aS5MYWJlbCgKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAg ICAgICAgICAgICAgIklEIjogIlByb2dyZXNzQmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICJUZXh0IjogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2VpZ2h0IjogMCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIaWRkZW4iOiBUcnVlLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgIk1pbmltdW1TaXplIjogbGlzdChQUk9HUkVTU19CQVJfU0laRSksCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4aW11bVNpemUiOiBsaXN0KFBST0dSRVNTX0JB Ul9TSVpFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHlsZVNoZWV0IjogcHJvZ3Jl c3Nfc3R5bGUoMCksCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAg ICApLAogICAgICAgICAgICAgICAgICAgIHVpLkxhYmVsKAogICAgICAgICAgICAgICAgICAgICAg ICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUQiOiAiUHJvZ3Jlc3NQZXJjZW50IiwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXh0IjogIiIsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAiV2VpZ2h0IjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIaWRk ZW4iOiBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsaWdubWVudCI6IHsiQWxp Z25SaWdodCI6IFRydWUsICJBbGlnblZDZW50ZXIiOiBUcnVlfSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICJNaW5pbXVtU2l6ZSI6IFs0NCwgMF0sCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAiTWF4aW11bVNpemUiOiBbNDQsIDE2Nzc3MjE1XSwKICAgICAgICAgICAgICAgICAgICAg ICAgfQogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAg ICApLAogICAgICAgICAgICB1aS5WR2FwKDAsIDEpLAogICAgICAgIF0sCiAgICApCgoKZGVmIF9y ZXN1bHRfYnV0dG9ucyh1aTogQW55KSAtPiBBbnk6CiAgICAiIiJJbiB0aGUgcmVzdWx0IHZpZXcg d2l0aCBhIGRvd25sb2FkZWQgZmlsZSwgYWJvdmUgdGhlIG1haW4gYnV0dG9uczogdGhlCiAgICBw cm9kdWN0aW9uIG9uIHRoZSBsZWZ0LCB0aGUgZmlsZSBvbiB0aGUgcmlnaHQuIChXaXRob3V0IGEg ZmlsZSwgT3BlbiBQcm9kdWN0aW9uCiAgICBnb2VzIGludG8gdGhlIG1haW4gcm93IGluc3RlYWQu KSIiIgogICAgcmV0dXJuIHVpLkhHcm91cCgKICAgICAgICB7IklEIjogIlJlc3VsdEJ1dHRvbnMi LCAiV2VpZ2h0IjogMCwgIkhpZGRlbiI6IFRydWV9LAogICAgICAgIFsKICAgICAgICAgICAgdWku QnV0dG9uKHsiSUQiOiAiUHJvZHVjdGlvbkxpbmsiLCAiVGV4dCI6IE9QRU5fVEVYVCwgIkhpZGRl biI6IFRydWV9KSwKICAgICAgICAgICAgdWkuSEdhcCgwLCAxKSwKICAgICAgICAgICAgdWkuQnV0 dG9uKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJJRCI6ICJTaG93Rmls ZSIsCiAgICAgICAgICAgICAgICAgICAgIlRleHQiOiAiU2hvdyBGaWxlIiwKICAgICAgICAgICAg ICAgICAgICAiSGlkZGVuIjogVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAiVG9vbFRpcCI6ICJT aG93IHRoZSBwcm9jZXNzZWQgYXVkaW8gZmlsZSBpbiBpdHMgZm9sZGVyIiwKICAgICAgICAgICAg ICAgIH0KICAgICAgICAgICAgKSwKICAgICAgICBdLAogICAgKQoKCmRlZiBfYWN0aW9ucyh1aTog QW55KSAtPiBBbnk6CiAgICAiIiJUaGUgbWFpbiBidXR0b25zOiBlZGl0aW5nIG9uIGF1cGhvbmlj LmNvbSAoYW5kLCB3aGlsZSBydW5uaW5nLCB0aGUgcHJvZHVjdGlvbikKICAgIG9uIHRoZSBsZWZ0 OyBDYW5jZWwsIFN0YXJ0IG9yIE5ldyBQcm9kdWN0aW9uIG9uIHRoZSByaWdodC4gRWFjaCB2aWV3 IHNob3dzIG9ubHkKICAgIGl0cyBvd24uIiIiCiAgICByZXR1cm4gdWkuSEdyb3VwKAogICAgICAg IHsiV2VpZ2h0IjogMH0sCiAgICAgICAgWwogICAgICAgICAgICB1aS5CdXR0b24oCiAgICAgICAg ICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIklEIjogIkVkaXRTdGFydCIsCiAgICAgICAg ICAgICAgICAgICAgIlRleHQiOiAiQ3JlYXRlIGFuZCBFZGl0IFByb2R1Y3Rpb24iLAogICAgICAg ICAgICAgICAgICAgICJUb29sVGlwIjogRURJVF9UT09MVElQLAogICAgICAgICAgICAgICAgICAg ICJFbmFibGVkIjogRmFsc2UsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICksCiAgICAg ICAgICAgIHVpLkJ1dHRvbigKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAi SUQiOiAiRWRpdEFnYWluIiwKICAgICAgICAgICAgICAgICAgICAiVGV4dCI6ICJFZGl0IEFnYWlu IG9uIEF1cGhvbmljIiwKICAgICAgICAgICAgICAgICAgICAiVG9vbFRpcCI6IEVESVRfQUdBSU5f VE9PTFRJUCwKICAgICAgICAgICAgICAgICAgICAiSGlkZGVuIjogVHJ1ZSwKICAgICAgICAgICAg ICAgIH0KICAgICAgICAgICAgKSwKICAgICAgICAgICAgdWkuQnV0dG9uKHsiSUQiOiAiQ2xlYXJJ bk91dCIsICJUZXh0IjogIkNsZWFyIEluL091dCIsICJIaWRkZW4iOiBUcnVlfSksCiAgICAgICAg ICAgICMgVGhlIHJlbmRlciB3YXMgc2lsZW50OiB0aGVzZSB0d28gaW5zdGVhZCBvZiBDYW5jZWwu CiAgICAgICAgICAgIHVpLkJ1dHRvbih7IklEIjogIkJhY2tUb1NldHRpbmdzIiwgIlRleHQiOiAi QmFjayB0byBTZXR0aW5ncyIsICJIaWRkZW4iOiBUcnVlfSksCiAgICAgICAgICAgICMgVGhlIHNh bWUgYXMgUHJvZHVjdGlvbkxpbmssIGluIHRoZSBtYWluIHJvdzogbmV4dCB0byBDYW5jZWwgd2hp bGUgYQogICAgICAgICAgICAjIHByb2R1Y3Rpb24gcnVucywgYW5kIG5leHQgdG8gTmV3IFByb2R1 Y3Rpb24gd2hlbiB0aGVyZSdzIG5vIGZpbGUuCiAgICAgICAgICAgIHVpLkJ1dHRvbih7IklEIjog IlJ1blByb2R1Y3Rpb25MaW5rIiwgIlRleHQiOiBPUEVOX1RFWFQsICJIaWRkZW4iOiBUcnVlfSks CiAgICAgICAgICAgIHVpLkhHYXAoMCwgMSksCiAgICAgICAgICAgIHVpLkJ1dHRvbih7IklEIjog IkNhbmNlbCIsICJUZXh0IjogIkNhbmNlbCIsICJIaWRkZW4iOiBUcnVlfSksCiAgICAgICAgICAg IHVpLkJ1dHRvbih7IklEIjogIkNvbnRpbnVlU2lsZW50IiwgIlRleHQiOiAiQ29udGludWUgQW55 d2F5IiwgIkhpZGRlbiI6IFRydWV9KSwKICAgICAgICAgICAgdWkuQnV0dG9uKAogICAgICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgICAgICJJRCI6ICJTdGFydCIsCiAgICAgICAgICAgICAg ICAgICAgIlRleHQiOiAiU3RhcnQgUHJvZHVjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgIkVu YWJsZWQiOiBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAiU3R5bGVTaGVldCI6IFBSSU1BUllf QlVUVE9OX1NUWUxFLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLAogICAgICAgICAg ICB1aS5CdXR0b24oCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIklEIjog Ik5ld1Byb2R1Y3Rpb24iLAogICAgICAgICAgICAgICAgICAgICJUZXh0IjogIk5ldyBQcm9kdWN0 aW9uIiwKICAgICAgICAgICAgICAgICAgICAiSGlkZGVuIjogVHJ1ZSwKICAgICAgICAgICAgICAg ICAgICAiU3R5bGVTaGVldCI6IFBSSU1BUllfQlVUVE9OX1NUWUxFLAogICAgICAgICAgICAgICAg fQogICAgICAgICAgICApLAogICAgICAgIF0sCiAgICApCgoKY2xhc3MgTWFpbldpbmRvdzoKICAg IElEID0gIkF1cGhvbmljTWFpbiIKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgc2VsZiwKICAg ICAgICB1aTogQW55LAogICAgICAgIGRpc3A6IEFueSwKICAgICAgICBjYWxsYmFja3M6IE1haW5D YWxsYmFja3MsCiAgICAgICAgZ2VvbWV0cnk6IGxpc3RbaW50XSB8IE5vbmUgPSBOb25lLAogICAg ICAgIGxvZ286IHN0ciA9ICI8Yj5hdXBob25pYzwvYj4iLAogICAgKSAtPiBOb25lOgogICAgICAg IHNlbGYuY2FsbGJhY2tzID0gY2FsbGJhY2tzCiAgICAgICAgIyBQcm9ncmFtbWF0aWMgY2hhbmdl cyB0byB0aGUgZHJvcGRvd25zIGZpcmUgQ3VycmVudEluZGV4Q2hhbmdlZCB0b287IGlnbm9yZQog ICAgICAgICMgdGhvc2Ugd2hpbGUgdGhlIHZpZXcgaXMgYmVpbmcgZmlsbGVkLgogICAgICAgIHNl bGYuX2ZpbGxpbmcgPSBGYWxzZQogICAgICAgICMgVGhlIGF1ZGlvIHRyZWUncyBpdGVtcywgYW5k IHRoZSBjaGVjayBzdGF0ZXMgdGhlIHZpZXcgc2V0IGxhc3QgKHRvIGZpbmQgd2hhdAogICAgICAg ICMgdGhlIHVzZXIgY2hhbmdlZDogVUlNYW5hZ2VyJ3MgaXRlbSBvYmplY3RzIGNhbid0IGJlIGNv bXBhcmVkIHJlbGlhYmx5KS4KICAgICAgICBzZWxmLl90cmVlX2l0ZW1zOiBsaXN0W3R1cGxlW0Fu eSwgbGlzdFtBbnldXV0gPSBbXQogICAgICAgIHNlbGYuX3RyZWVfc3RhdGVzOiBsaXN0W3R1cGxl W3N0ciwgbGlzdFtzdHJdXV0gPSBbXQogICAgICAgIHNlbGYuX3RyZWVfc2hhcGU6IGxpc3RbdHVw bGVbc3RyLCBsaXN0W3R1cGxlW3N0ciwgc3RyXV1dXSB8IE5vbmUgPSBOb25lCiAgICAgICAgIyBQ cmVzZXQgZHJvcGRvd24gcm93cyAtPiBwcmVzZXQgaW5kZXggKE5vbmU6IHRoZSBkaXZpZGVyKSwg b3IgTm9uZQogICAgICAgICMgd2hpbGUgdGhlIGRyb3Bkb3duIHNob3dzIGEgc3RhdHVzIHRleHQg aW5zdGVhZCBvZiBwcmVzZXRzLgogICAgICAgIHNlbGYuX3ByZXNldF9yb3dzOiBsaXN0W2ludCB8 IE5vbmVdIHwgTm9uZSA9IE5vbmUKICAgICAgICAjIFRoZSBzdW1tYXJ5J3MgdmFsdWVzIChzaG93 biB0b2dldGhlciBpbiBvbmUgY2FyZCksIGFuZCB3aGV0aGVyIGNyZWRpdHMgd2Fybi4KICAgICAg ICBzZWxmLnN1bW1hcnk6IGRpY3Rbc3RyLCBzdHJdID0gZGljdC5mcm9ta2V5cyhTVU1NQVJZX0tF WVMsICLigJMiKQogICAgICAgIHNlbGYuc3VtbWFyeV93YXJuID0gRmFsc2UKICAgICAgICBzZWxm LnN1bW1hcnlfaGVpZ2h0ID0gMCAgIyBweCwgc2V0IHdoZW4gYSB2YWx1ZSB3cmFwcyAoMDogdGhl IGxhYmVsJ3Mgb3duKQogICAgICAgIHNlbGYubW9kZSA9IFNFVFVQCiAgICAgICAgc2VsZi5fY2xl YXJfaW5fb3V0X3dhbnRlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5fZWRpdF9hZ2Fpbl93YW50ZWQg PSBGYWxzZQogICAgICAgIHNlbGYucHJvZHVjdGlvbl91cmwgPSAiIgogICAgICAgIHNlbGYucmVz dWx0X3RleHQgPSAiIiAgIyB0aGUgcmVzdWx0IGNhcmQgYXMgcGxhaW4gdGV4dCAoZm9yIHRlc3Rz IGFuZCBsb2dzKQogICAgICAgIHNlbGYuX2ZpbGVfd2FudGVkID0gRmFsc2UKICAgICAgICBzZWxm Ll9rZWVwX29yX2RlbGV0ZV93YW50ZWQgPSBGYWxzZQogICAgICAgIHNlbGYud2luID0gZGlzcC5B ZGRXaW5kb3coCiAgICAgICAgICAgIHsiSUQiOiBzZWxmLklELCAiV2luZG93VGl0bGUiOiAiQXVw aG9uaWMiLCAiR2VvbWV0cnkiOiBnZW9tZXRyeSBvciBERUZBVUxUX0dFT01FVFJZfSwKICAgICAg ICAgICAgdWkuVkdyb3VwKAogICAgICAgICAgICAgICAgeyJTcGFjaW5nIjogNn0sCiAgICAgICAg ICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgX2hlYWRlcih1aSwgbG9nbyksCiAgICAgICAg ICAgICAgICAgICAgX3NldHVwX3BhbmUodWkpLAogICAgICAgICAgICAgICAgICAgIF9ydW5fcGFu ZSh1aSksCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9sYWJlbCh1aSwgIlN0YXR1cyIpLAog ICAgICAgICAgICAgICAgICAgIHVpLlZHYXAoQUNUSU9OU19TUEFDRV9BQk9WRSwgMCksCiAgICAg ICAgICAgICAgICAgICAgX3Jlc3VsdF9idXR0b25zKHVpKSwKICAgICAgICAgICAgICAgICAgICBf YWN0aW9ucyh1aSksCiAgICAgICAgICAgICAgICAgICAgZm9vdGVyKHVpKSwKICAgICAgICAgICAg ICAgIF0sCiAgICAgICAgICAgICksCiAgICAgICAgKQogICAgICAgIHNlbGYuaXRlbXMgPSBzZWxm Lndpbi5HZXRJdGVtcygpCiAgICAgICAgc2VsZi5fcmVuZGVyX3N1bW1hcnkoKQogICAgICAgIG9u ID0gc2VsZi53aW4uT24KICAgICAgICBvbi5Mb2dvdXQuQ2xpY2tlZCA9IGxhbWJkYSBldjogY2Fs bGJhY2tzLm9uX2xvZ291dCgpCiAgICAgICAgb24uUmVmcmVzaEFjY291bnQuQ2xpY2tlZCA9IGxh bWJkYSBldjogY2FsbGJhY2tzLm9uX3JlZnJlc2hfYWNjb3VudCgpCiAgICAgICAgb24uQXVkaW8u SXRlbUNoYW5nZWQgPSBsYW1iZGEgZXY6IHNlbGYuX2F1ZGlvX2NoYW5nZWQoKQogICAgICAgIG9u LlByZXNldC5DdXJyZW50SW5kZXhDaGFuZ2VkID0gbGFtYmRhIGV2OiBzZWxmLl9wcmVzZXRfY2hh bmdlZChjYWxsYmFja3Mub25fcHJlc2V0X2NoYW5nZWQpCiAgICAgICAgb24uUmVmcmVzaFByZXNl dHMuQ2xpY2tlZCA9IGxhbWJkYSBldjogY2FsbGJhY2tzLm9uX3JlZnJlc2hfcHJlc2V0cygpCiAg ICAgICAgb24uUmVmcmVzaFRpbWVsaW5lLkNsaWNrZWQgPSBsYW1iZGEgZXY6IGNhbGxiYWNrcy5v bl9yZWZyZXNoX3RpbWVsaW5lKCkKICAgICAgICBvbi5DbGVhckluT3V0LkNsaWNrZWQgPSBsYW1i ZGEgZXY6IGNhbGxiYWNrcy5vbl9jbGVhcl9pbl9vdXQoKQogICAgICAgIG9uLk11dGUuQ2xpY2tl ZCA9IGxhbWJkYSBldjogY2FsbGJhY2tzLm9uX211dGVfY2hhbmdlZChib29sKHNlbGYuaXRlbXNb Ik11dGUiXS5DaGVja2VkKSkKICAgICAgICBvbi5Gb2xsb3dTZWxlY3Rpb24uQ2xpY2tlZCA9IGxh bWJkYSBldjogY2FsbGJhY2tzLm9uX2ZvbGxvd19jaGFuZ2VkKAogICAgICAgICAgICBib29sKHNl bGYuaXRlbXNbIkZvbGxvd1NlbGVjdGlvbiJdLkNoZWNrZWQpCiAgICAgICAgKQogICAgICAgIG9u LlN0YXJ0LkNsaWNrZWQgPSBsYW1iZGEgZXY6IGNhbGxiYWNrcy5vbl9zdGFydCgpCiAgICAgICAg b24uRWRpdFN0YXJ0LkNsaWNrZWQgPSBsYW1iZGEgZXY6IGNhbGxiYWNrcy5vbl9lZGl0X3N0YXJ0 KCkKICAgICAgICBvbi5DYW5jZWwuQ2xpY2tlZCA9IGxhbWJkYSBldjogY2FsbGJhY2tzLm9uX2Nh bmNlbCgpCiAgICAgICAgb24uS2VlcFByb2R1Y3Rpb24uQ2xpY2tlZCA9IGxhbWJkYSBldjogY2Fs bGJhY2tzLm9uX2tlZXBfcHJvZHVjdGlvbigpCiAgICAgICAgb24uRGVsZXRlUHJvZHVjdGlvbi5D bGlja2VkID0gbGFtYmRhIGV2OiBjYWxsYmFja3Mub25fZGVsZXRlX3Byb2R1Y3Rpb24oKQogICAg ICAgIG9uLkJhY2tUb1NldHRpbmdzLkNsaWNrZWQgPSBsYW1iZGEgZXY6IGNhbGxiYWNrcy5vbl9i YWNrX3RvX3NldHRpbmdzKCkKICAgICAgICBvbi5Db250aW51ZVNpbGVudC5DbGlja2VkID0gbGFt YmRhIGV2OiBjYWxsYmFja3Mub25fY29udGludWVfc2lsZW50KCkKICAgICAgICBvbi5OZXdQcm9k dWN0aW9uLkNsaWNrZWQgPSBsYW1iZGEgZXY6IGNhbGxiYWNrcy5vbl9uZXdfcHJvZHVjdGlvbigp CiAgICAgICAgb24uRWRpdEFnYWluLkNsaWNrZWQgPSBsYW1iZGEgZXY6IGNhbGxiYWNrcy5vbl9l ZGl0X2FnYWluKCkKICAgICAgICBvbi5Qcm9kdWN0aW9uTGluay5DbGlja2VkID0gbGFtYmRhIGV2 OiBjYWxsYmFja3Mub25fb3Blbl91cmwoc2VsZi5wcm9kdWN0aW9uX3VybCkKICAgICAgICBvbi5S dW5Qcm9kdWN0aW9uTGluay5DbGlja2VkID0gbGFtYmRhIGV2OiBjYWxsYmFja3Mub25fb3Blbl91 cmwoc2VsZi5wcm9kdWN0aW9uX3VybCkKICAgICAgICBvbi5TaG93RmlsZS5DbGlja2VkID0gbGFt YmRhIGV2OiBjYWxsYmFja3Mub25fc2hvd19maWxlKCkKICAgICAgICBnZXRhdHRyKG9uLCBzZWxm LklEKS5DbG9zZSA9IGxhbWJkYSBldjogY2FsbGJhY2tzLm9uX2Nsb3NlKCkKCiAgICAjIC0tIHdp bmRvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZGVmIHNob3coc2VsZikgLT4gTm9uZToKICAgICAgICBz ZWxmLndpbi5TaG93KCkKCiAgICBkZWYgaGlkZShzZWxmKSAtPiBOb25lOgogICAgICAgIHNlbGYu d2luLkhpZGUoKQoKICAgICMgLS0gYWNjb3VudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBkZWYgc2V0X2Fj Y291bnQoc2VsZiwgZGlzcGxheV9uYW1lOiBzdHIpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5pdGVt c1siQWNjb3VudCJdLlRleHQgPSBmIjxiPnt0ZXh0X2h0bWwoZGlzcGxheV9uYW1lKX08L2I+IgoK ICAgIGRlZiBzZXRfY3JlZGl0cyhzZWxmLCB0ZXh0OiBzdHIpIC0+IE5vbmU6CiAgICAgICAgc2Vs Zi5pdGVtc1siQ3JlZGl0cyJdLlRleHQgPSB0ZXh0CgogICAgZGVmIHNldF9hY2NvdW50X2J1c3ko c2VsZiwgYnVzeTogYm9vbCkgLT4gTm9uZToKICAgICAgICBzZWxmLml0ZW1zWyJSZWZyZXNoQWNj b3VudCJdLkVuYWJsZWQgPSBub3QgYnVzeQogICAgICAgIHNlbGYuaXRlbXNbIkxvZ291dCJdLkVu YWJsZWQgPSBub3QgYnVzeQoKICAgICMgLS0gaW5wdXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBkZWYg X2NoYW5nZWQoc2VsZiwgaXRlbV9pZDogc3RyLCBjYWxsYmFjazogQ2FsbGFibGVbW2ludF0sIE5v bmVdKSAtPiBOb25lOgogICAgICAgIGlmIG5vdCBzZWxmLl9maWxsaW5nOgogICAgICAgICAgICBj YWxsYmFjayhpbnQoc2VsZi5pdGVtc1tpdGVtX2lkXS5DdXJyZW50SW5kZXgpKQoKICAgIGRlZiBf ZmlsbChzZWxmLCBpdGVtX2lkOiBzdHIsIGxhYmVsczogbGlzdFtzdHJdLCBpbmRleDogaW50LCBl bmFibGVkOiBib29sID0gVHJ1ZSkgLT4gTm9uZToKICAgICAgICBjb21ibyA9IHNlbGYuaXRlbXNb aXRlbV9pZF0KICAgICAgICBzZWxmLl9maWxsaW5nID0gVHJ1ZQogICAgICAgIHRyeToKICAgICAg ICAgICAgY29tYm8uQ2xlYXIoKQogICAgICAgICAgICBmb3IgbGFiZWwgaW4gbGFiZWxzOgogICAg ICAgICAgICAgICAgY29tYm8uQWRkSXRlbShsYWJlbCkKICAgICAgICAgICAgaWYgbGFiZWxzOgog ICAgICAgICAgICAgICAgY29tYm8uQ3VycmVudEluZGV4ID0gbWF4KDAsIG1pbihpbmRleCwgbGVu KGxhYmVscykgLSAxKSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLl9maWxsaW5n ID0gRmFsc2UKICAgICAgICBjb21iby5FbmFibGVkID0gZW5hYmxlZCBhbmQgYm9vbChsYWJlbHMp CgogICAgZGVmIHNldF9hdWRpb190cmVlKHNlbGYsIHRyYWNrczogbGlzdFt0dXBsZVtzdHIsIGxp c3RbdHVwbGVbc3RyLCBzdHJdXV1dKSAtPiBOb25lOgogICAgICAgICIiIlJlYnVpbGQgdGhlIHRy ZWU6IHBlciB0cmFjayBpdHMgbGFiZWwgYW5kIGl0cyBjbGlwcycgKG5hbWUsIHRpbWVjb2RlIHJh bmdlKS4KCiAgICAgICAgU2tpcHBlZCB3aGVuIG5vdGhpbmcgY2hhbmdlZCwgc28gdGhlIGxpc3Qg ZG9lc24ndCBqdW1wIHdoaWxlIHRoZSB1c2VyIHNjcm9sbHMuCiAgICAgICAgIiIiCiAgICAgICAg dHJlZSA9IHNlbGYuaXRlbXNbIkF1ZGlvIl0KICAgICAgICB0cmVlLkVuYWJsZWQgPSBib29sKHRy YWNrcykKICAgICAgICBpZiB0cmFja3MgPT0gc2VsZi5fdHJlZV9zaGFwZToKICAgICAgICAgICAg cmV0dXJuCiAgICAgICAgc2VsZi5fZmlsbGluZyA9IFRydWUKICAgICAgICB0cnk6CiAgICAgICAg ICAgIF9jbGVhcl90cmVlKHRyZWUpCiAgICAgICAgICAgIF9jYWxsKHRyZWUsICJTZXRIZWFkZXJM YWJlbHMiLCB7MTogIlRyYWNrIC8gY2xpcCIsIDI6ICJJbiDigJMgT3V0In0pCiAgICAgICAgICAg IHdpdGggY29udGV4dGxpYi5zdXBwcmVzcyhFeGNlcHRpb24pOgogICAgICAgICAgICAgICAgdHJl ZS5Db2x1bW5Db3VudCA9IDIKICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLnN1cHByZXNzKEV4 Y2VwdGlvbik6CiAgICAgICAgICAgICAgICB0cmVlLkNvbHVtbldpZHRoWzBdID0gVFJBQ0tfQ09M VU1OX1dJRFRICiAgICAgICAgICAgIHNlbGYuX3RyZWVfaXRlbXMgPSBbXQogICAgICAgICAgICBm b3IgbGFiZWwsIGNsaXBzIGluIHRyYWNrczoKICAgICAgICAgICAgICAgIHRvcCA9IHRyZWUuTmV3 SXRlbSgpCiAgICAgICAgICAgICAgICB0b3AuVGV4dFswXSA9IGxhYmVsCiAgICAgICAgICAgICAg ICBpZiBjbGlwczoKICAgICAgICAgICAgICAgICAgICBfY2hlY2thYmxlKHRvcCkKICAgICAgICAg ICAgICAgIGVsc2U6ICAjIG5vdGhpbmcgdG8gcHJvY2Vzczogbm8gY2hlY2tib3gKICAgICAgICAg ICAgICAgICAgICB0b3AuVGV4dFsxXSA9IE5PX0NMSVBTCiAgICAgICAgICAgICAgICAgICAgdG9w LkZsYWdzID0geyJJdGVtSXNFbmFibGVkIjogVHJ1ZX0KICAgICAgICAgICAgICAgIHRyZWUuQWRk VG9wTGV2ZWxJdGVtKHRvcCkKICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gW10KICAgICAgICAg ICAgICAgIGZvciBuYW1lLCBzcGFuIGluIGNsaXBzOgogICAgICAgICAgICAgICAgICAgIGNoaWxk ID0gdHJlZS5OZXdJdGVtKCkKICAgICAgICAgICAgICAgICAgICBjaGlsZC5UZXh0WzBdID0gbmFt ZQogICAgICAgICAgICAgICAgICAgIGNoaWxkLlRleHRbMV0gPSBzcGFuCiAgICAgICAgICAgICAg ICAgICAgX2NoZWNrYWJsZShjaGlsZCkKICAgICAgICAgICAgICAgICAgICB0b3AuQWRkQ2hpbGQo Y2hpbGQpCiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uYXBwZW5kKGNoaWxkKQogICAgICAg ICAgICAgICAgd2l0aCBjb250ZXh0bGliLnN1cHByZXNzKEV4Y2VwdGlvbik6CiAgICAgICAgICAg ICAgICAgICAgdG9wLkV4cGFuZGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgc2VsZi5fdHJlZV9p dGVtcy5hcHBlbmQoKHRvcCwgY2hpbGRyZW4pKQogICAgICAgICAgICBzZWxmLl90cmVlX3N0YXRl cyA9IFsKICAgICAgICAgICAgICAgIChVTkNIRUNLRUQgaWYgYyBlbHNlICIiLCBbVU5DSEVDS0VE XSAqIGxlbihjKSkgZm9yIF8sIGMgaW4gc2VsZi5fdHJlZV9pdGVtcwogICAgICAgICAgICBdCiAg ICAgICAgZmluYWxseToKICAgICAgICAgICAgc2VsZi5fZmlsbGluZyA9IEZhbHNlCiAgICAgICAg c2VsZi5fdHJlZV9zaGFwZSA9IHRyYWNrcwogICAgICAgIHNlbGYud2luLlJlY2FsY0xheW91dCgp CgogICAgZGVmIHNldF9hdWRpb19jaGVja3Moc2VsZiwgc3RhdGVzOiBsaXN0W3R1cGxlW3N0ciwg bGlzdFtzdHJdXV0pIC0+IE5vbmU6CiAgICAgICAgIiIiQ2hlY2sgc3RhdGVzIHBlciB0cmFjayAo Q0hFQ0tFRC9VTkNIRUNLRUQvUEFSVExZKSBhbmQgcGVyIGNsaXAuIiIiCiAgICAgICAgc2VsZi5f ZmlsbGluZyA9IFRydWUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN0YXRlcyA9IFsKICAgICAg ICAgICAgICAgICh0cmFja19zdGF0ZSBpZiBjaGlsZHJlbiBlbHNlICIiLCBjbGlwX3N0YXRlcykK ICAgICAgICAgICAgICAgIGZvciAoXywgY2hpbGRyZW4pLCAodHJhY2tfc3RhdGUsIGNsaXBfc3Rh dGVzKSBpbiB6aXAoCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdHJlZV9pdGVtcywgc3RhdGVz LCBzdHJpY3Q9RmFsc2UKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgXQogICAgICAgICAg ICBmb3IgKHRvcCwgY2hpbGRyZW4pLCAodHJhY2tfc3RhdGUsIGNsaXBfc3RhdGVzKSBpbiB6aXAo CiAgICAgICAgICAgICAgICBzZWxmLl90cmVlX2l0ZW1zLCBzdGF0ZXMsIHN0cmljdD1GYWxzZQog ICAgICAgICAgICApOgogICAgICAgICAgICAgICAgaWYgY2hpbGRyZW46ICAjIGVtcHR5IHRyYWNr cyBoYXZlIG5vIGNoZWNrYm94CiAgICAgICAgICAgICAgICAgICAgX3NldF9jaGVjayh0b3AsIHRy YWNrX3N0YXRlKQogICAgICAgICAgICAgICAgZm9yIGNoaWxkLCBzdGF0ZSBpbiB6aXAoY2hpbGRy ZW4sIGNsaXBfc3RhdGVzLCBzdHJpY3Q9RmFsc2UpOgogICAgICAgICAgICAgICAgICAgIF9zZXRf Y2hlY2soY2hpbGQsIHN0YXRlKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuX2Zp bGxpbmcgPSBGYWxzZQogICAgICAgIHNlbGYuX3RyZWVfc3RhdGVzID0gc3RhdGVzCgogICAgZGVm IF9hdWRpb19jaGFuZ2VkKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgIiIiRmluZCB0aGUgb25lIGl0 ZW0gdGhlIHVzZXIgKHVuKXRpY2tlZCBhbmQgcmVwb3J0IGl0LiIiIgogICAgICAgIGlmIHNlbGYu X2ZpbGxpbmc6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGZvciBwb3NpdGlvbiwgKCh0b3As IGNoaWxkcmVuKSwgKHRyYWNrX3N0YXRlLCBjbGlwX3N0YXRlcykpIGluIGVudW1lcmF0ZSgKICAg ICAgICAgICAgemlwKHNlbGYuX3RyZWVfaXRlbXMsIHNlbGYuX3RyZWVfc3RhdGVzLCBzdHJpY3Q9 RmFsc2UpCiAgICAgICAgKToKICAgICAgICAgICAgbm93ID0gX2dldF9jaGVjayh0b3ApIGlmIGNo aWxkcmVuIGVsc2UgTm9uZQogICAgICAgICAgICBpZiBub3cgaXMgbm90IE5vbmUgYW5kIG5vdyAh PSB0cmFja19zdGF0ZToKICAgICAgICAgICAgICAgIHNlbGYuY2FsbGJhY2tzLm9uX3RyYWNrX2No ZWNrZWQocG9zaXRpb24sIG5vdyA9PSBDSEVDS0VEKQogICAgICAgICAgICAgICAgcmV0dXJuCiAg ICAgICAgICAgIGZvciBjbGlwX3Bvc2l0aW9uLCAoY2hpbGQsIHN0YXRlKSBpbiBlbnVtZXJhdGUo CiAgICAgICAgICAgICAgICB6aXAoY2hpbGRyZW4sIGNsaXBfc3RhdGVzLCBzdHJpY3Q9RmFsc2Up CiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICBub3cgPSBfZ2V0X2NoZWNrKGNoaWxkKQog ICAgICAgICAgICAgICAgaWYgbm93IGlzIG5vdCBOb25lIGFuZCBub3cgIT0gc3RhdGU6CiAgICAg ICAgICAgICAgICAgICAgc2VsZi5jYWxsYmFja3Mub25fY2xpcF9jaGVja2VkKHBvc2l0aW9uLCBj bGlwX3Bvc2l0aW9uLCBub3cgPT0gQ0hFQ0tFRCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4K CiAgICBkZWYgc2V0X3ByZXNldHMoc2VsZiwgbGFiZWxzOiBsaXN0W3N0cl0sIGluZGV4OiBpbnQs IGVuYWJsZWQ6IGJvb2wgPSBUcnVlKSAtPiBOb25lOgogICAgICAgICIiIkEgcGxhaW4gbGlzdCwg dXNlZCBmb3Igc3RhdHVzIHRleHRzIHN1Y2ggYXMgIkxvYWRpbmcgcHJlc2V0c+KApiIuIiIiCiAg ICAgICAgc2VsZi5fcHJlc2V0X3Jvd3MgPSBOb25lCiAgICAgICAgc2VsZi5fZmlsbCgiUHJlc2V0 IiwgbGFiZWxzLCBpbmRleCwgZW5hYmxlZCkKCiAgICBkZWYgc2V0X3ByZXNldF9ncm91cHMoc2Vs ZiwgZ3JvdXBzOiBsaXN0W2xpc3Rbc3RyXV0sIGluZGV4OiBpbnQpIC0+IE5vbmU6CiAgICAgICAg IiIiR3JvdXBzIG9mIHByZXNldHMgd2l0aCBhIGRpdmlkZXIgYmV0d2VlbiB0aGVtIChubyBoZWFk ZXJzOiBVSU1hbmFnZXIgY2FuJ3QKICAgICAgICBzdHlsZSBvciBkaXNhYmxlIHNpbmdsZSByb3dz LCBzbyBoZWFkZXJzIGxvb2tlZCBhbmQgYmVoYXZlZCBsaWtlIHByZXNldHMpLgoKICAgICAgICBg YGluZGV4YGAgY291bnRzIHByZXNldHMgb25seS4gSWYgdGhlIGRpdmlkZXIgaXMgYSB0ZXh0IHJv dyAobm8gc2VwYXJhdG9yCiAgICAgICAgc3VwcG9ydCksIGNob29zaW5nIGl0IHNlbGVjdHMgdGhl IG5lYXJlc3QgcHJlc2V0IChzZWUgYGBfcHJlc2V0X2NoYW5nZWRgYCkuCiAgICAgICAgIiIiCiAg ICAgICAgY29tYm8gPSBzZWxmLml0ZW1zWyJQcmVzZXQiXQogICAgICAgIHJvd3M6IGxpc3RbaW50 IHwgTm9uZV0gPSBbXQogICAgICAgIGNvdW50ID0gMAogICAgICAgIHNlbGYuX2ZpbGxpbmcgPSBU cnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb21iby5DbGVhcigpCiAgICAgICAgICAgIGZv ciBsYWJlbHMgaW4gZ3JvdXBzOgogICAgICAgICAgICAgICAgaWYgbm90IGxhYmVsczoKICAgICAg ICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgcm93czoKICAgICAgICAg ICAgICAgICAgICBfYWRkX2RpdmlkZXIoY29tYm8sIGxlbihyb3dzKSkKICAgICAgICAgICAgICAg ICAgICByb3dzLmFwcGVuZChOb25lKQogICAgICAgICAgICAgICAgZm9yIGxhYmVsIGluIGxhYmVs czoKICAgICAgICAgICAgICAgICAgICBjb21iby5BZGRJdGVtKGxhYmVsKQogICAgICAgICAgICAg ICAgICAgIHJvd3MuYXBwZW5kKGNvdW50KQogICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEK ICAgICAgICAgICAgc2VsZi5fcHJlc2V0X3Jvd3MgPSByb3dzCiAgICAgICAgICAgIGlmIGNvdW50 OgogICAgICAgICAgICAgICAgY29tYm8uQ3VycmVudEluZGV4ID0gcm93cy5pbmRleChtYXgoMCwg bWluKGluZGV4LCBjb3VudCAtIDEpKSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxm Ll9maWxsaW5nID0gRmFsc2UKICAgICAgICBjb21iby5FbmFibGVkID0gY291bnQgPiAwCgogICAg ZGVmIF9wcmVzZXRfY2hhbmdlZChzZWxmLCBjYWxsYmFjazogQ2FsbGFibGVbW2ludF0sIE5vbmVd KSAtPiBOb25lOgogICAgICAgIGlmIHNlbGYuX2ZpbGxpbmc6CiAgICAgICAgICAgIHJldHVybgog ICAgICAgIGNvbWJvLCByb3dzID0gc2VsZi5pdGVtc1siUHJlc2V0Il0sIHNlbGYuX3ByZXNldF9y b3dzCiAgICAgICAgcm93ID0gaW50KGNvbWJvLkN1cnJlbnRJbmRleCkKICAgICAgICBpZiByb3dz IGlzIE5vbmUgb3Igbm90IDAgPD0gcm93IDwgbGVuKHJvd3MpOgogICAgICAgICAgICBjYWxsYmFj ayhyb3cpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIHJvd3Nbcm93XSBpcyBOb25lOiAg IyB0aGUgZGl2aWRlcjogbW92ZSB0byB0aGUgbmVhcmVzdCBwcmVzZXQKICAgICAgICAgICAgYmVs b3cgPSBbciBmb3IgciBpbiByYW5nZShyb3cgKyAxLCBsZW4ocm93cykpIGlmIHJvd3Nbcl0gaXMg bm90IE5vbmVdCiAgICAgICAgICAgIGFib3ZlID0gW3IgZm9yIHIgaW4gcmFuZ2Uocm93IC0gMSwg LTEsIC0xKSBpZiByb3dzW3JdIGlzIG5vdCBOb25lXQogICAgICAgICAgICBpZiBub3QgYmVsb3cg YW5kIG5vdCBhYm92ZToKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICByb3cgPSAo YmVsb3cgb3IgYWJvdmUpWzBdCiAgICAgICAgICAgIHNlbGYuX2ZpbGxpbmcgPSBUcnVlCiAgICAg ICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNvbWJvLkN1cnJlbnRJbmRleCA9IHJvdwogICAg ICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgc2VsZi5fZmlsbGluZyA9IEZhbHNlCiAg ICAgICAgcHJlc2V0ID0gcm93c1tyb3ddCiAgICAgICAgaWYgcHJlc2V0IGlzIG5vdCBOb25lOgog ICAgICAgICAgICBjYWxsYmFjayhwcmVzZXQpCgogICAgZGVmIHNldF9wcmVzZXRzX2J1c3koc2Vs ZiwgYnVzeTogYm9vbCkgLT4gTm9uZToKICAgICAgICBzZWxmLml0ZW1zWyJSZWZyZXNoUHJlc2V0 cyJdLkVuYWJsZWQgPSBub3QgYnVzeQoKICAgIGRlZiBzZXRfdGl0bGVfcGxhY2Vob2xkZXIoc2Vs ZiwgdGV4dDogc3RyKSAtPiBOb25lOgogICAgICAgIHNlbGYuaXRlbXNbIlRpdGxlIl0uUGxhY2Vo b2xkZXJUZXh0ID0gdGV4dAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHRpdGxlKHNlbGYpIC0+IHN0 cjoKICAgICAgICByZXR1cm4gc3RyKHNlbGYuaXRlbXNbIlRpdGxlIl0uVGV4dCBvciAiIikuc3Ry aXAoKQoKICAgIGRlZiBzZXRfbXV0ZShzZWxmLCBjaGVja2VkOiBib29sKSAtPiBOb25lOgogICAg ICAgIHNlbGYuaXRlbXNbIk11dGUiXS5DaGVja2VkID0gY2hlY2tlZAoKICAgIGRlZiBzZXRfZm9s bG93KHNlbGYsIGNoZWNrZWQ6IGJvb2wsIGF2YWlsYWJsZTogYm9vbCkgLT4gTm9uZToKICAgICAg ICAiIiJUaGUgInRpY2sgdGhlIHRpbWVsaW5lIHNlbGVjdGlvbiIgc3dpdGNoOyB1bmF2YWlsYWJs ZSBiZWZvcmUgUmVzb2x2ZSAyMS4wLjQuIiIiCiAgICAgICAgYm94ID0gc2VsZi5pdGVtc1siRm9s bG93U2VsZWN0aW9uIl0KICAgICAgICBib3guQ2hlY2tlZCA9IGNoZWNrZWQKICAgICAgICBib3gu RW5hYmxlZCA9IGF2YWlsYWJsZQogICAgICAgIGJveC5Ub29sVGlwID0gKAogICAgICAgICAgICBG T0xMT1dfVE9PTFRJUAogICAgICAgICAgICBpZiBhdmFpbGFibGUKICAgICAgICAgICAgZWxzZSAi VGhpcyB2ZXJzaW9uIG9mIERhVmluY2kgUmVzb2x2ZSBjYW4ndCB0ZWxsIHNjcmlwdHMgd2hpY2gg Y2xpcHMgYXJlICIKICAgICAgICAgICAgInNlbGVjdGVkIChSZXNvbHZlIDIxLjAuNCBhbmQgbmV3 ZXIgY2FuKS4iCiAgICAgICAgKQoKICAgICMgLS0gc3VtbWFyeSAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBk ZWYgc2V0X3N1bW1hcnkoCiAgICAgICAgc2VsZiwKICAgICAgICBhdWRpbzogc3RyLAogICAgICAg IG1hcmtfaW46IHN0ciwKICAgICAgICBtYXJrX291dDogc3RyLAogICAgICAgIGR1cmF0aW9uOiBz dHIsCiAgICAgICAgbWFya2Vyczogc3RyLAogICAgICAgIGVzdGltYXRlOiBzdHIsCiAgICAgICAg d2FybjogYm9vbCwKICAgICkgLT4gTm9uZToKICAgICAgICB2YWx1ZXMgPSAoYXVkaW8sIG1hcmtf aW4sIG1hcmtfb3V0LCBkdXJhdGlvbiwgbWFya2VycywgZXN0aW1hdGUpCiAgICAgICAgc2VsZi5z dW1tYXJ5ID0gZGljdCh6aXAoU1VNTUFSWV9LRVlTLCB2YWx1ZXMsIHN0cmljdD1UcnVlKSkKICAg ICAgICBzZWxmLnN1bW1hcnlfd2FybiA9IHdhcm4KICAgICAgICBzZWxmLl9yZW5kZXJfc3VtbWFy eSgpCgogICAgZGVmIF9yZW5kZXJfc3VtbWFyeShzZWxmKSAtPiBOb25lOgogICAgICAgIHMsIGVz YyA9IHNlbGYuc3VtbWFyeSwgdGV4dF9odG1sCiAgICAgICAgaWYgc1siSW4iXSA9PSAi4oCTIjoK ICAgICAgICAgICAgc3BhbiA9ICLigJMiCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3BhbiA9 IGYie2VzYyhzWydJbiddKX0g4oaSIHtlc2Moc1snT3V0J10pfSAmbmJzcDvCtyZuYnNwOyB7ZXNj KHNbJ0R1cmF0aW9uJ10pfSIKICAgICAgICBzZWxmLml0ZW1zWyJTdW1tYXJ5Il0uVGV4dCA9IHRh YmxlX2h0bWwoCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICgiQXVkaW8iLCBlc2Moc1si QXVkaW9TdW1tYXJ5Il0pLCAiIiksCiAgICAgICAgICAgICAgICAoIlJhbmdlIiwgc3BhbiwgIiIp LAogICAgICAgICAgICAgICAgKCJDaGFwdGVycyIsIGVzYyhzWyJNYXJrZXJzIl0pLCAiIiksCiAg ICAgICAgICAgICAgICAoIkNyZWRpdHMiLCBlc2Moc1siRXN0aW1hdGUiXSksIEVSUk9SX1NUWUxF IGlmIHNlbGYuc3VtbWFyeV93YXJuIGVsc2UgIiIpLAogICAgICAgICAgICBdCiAgICAgICAgKQog ICAgICAgICMgT25seSB0aGUgQXVkaW8gYW5kIENyZWRpdHMgdmFsdWVzIGdldCBsb25nIGVub3Vn aCB0byB3cmFwLiBXaXRoIG9uZSBsaW5lCiAgICAgICAgIyBlYWNoLCB0aGUgbGFiZWwncyBvd24g aGVpZ2h0IGZpdHMsIHNvIGl0J3Mga2VwdC4KICAgICAgICBleHRyYSA9IHN1bSgKICAgICAgICAg ICAgbGVuKHRleHR3cmFwLndyYXAoc1trZXldLCBTVU1NQVJZX1ZBTFVFX0NIQVJTKSkgLSAxCiAg ICAgICAgICAgIGZvciBrZXkgaW4gKCJBdWRpb1N1bW1hcnkiLCAiRXN0aW1hdGUiKQogICAgICAg ICAgICBpZiBsZW4oc1trZXldKSA+IFNVTU1BUllfVkFMVUVfQ0hBUlMKICAgICAgICApCiAgICAg ICAgaGVpZ2h0ID0gKDQgKyBleHRyYSkgKiBTVU1NQVJZX1JPV19QWCArIDIgKiBDQVJEX1BBRERJ TkdfUFggKyAyIGlmIGV4dHJhIGVsc2UgMAogICAgICAgIGlmIGhlaWdodCAhPSBzZWxmLnN1bW1h cnlfaGVpZ2h0OgogICAgICAgICAgICBzZWxmLnN1bW1hcnlfaGVpZ2h0ID0gaGVpZ2h0CiAgICAg ICAgICAgIHNlbGYuaXRlbXNbIlN1bW1hcnkiXS5NaW5pbXVtU2l6ZSA9IFswLCBoZWlnaHRdCiAg ICAgICAgICAgIHNlbGYud2luLlJlY2FsY0xheW91dCgpCgogICAgZGVmIHNldF9zZWxlY3Rpb25f bm90ZShzZWxmLCB0ZXh0OiBzdHIsIHdhcm46IGJvb2wgPSBGYWxzZSkgLT4gTm9uZToKICAgICAg ICBzZXRfbWVzc2FnZSgKICAgICAgICAgICAgc2VsZi53aW4sIHNlbGYuaXRlbXNbIlNlbGVjdGlv bk5vdGUiXSwgdGV4dCwgRVJST1JfU1RZTEUgaWYgd2FybiBlbHNlIE1VVEVEX1NUWUxFCiAgICAg ICAgKQoKICAgIGRlZiBzZXRfd2FybmluZ3Moc2VsZiwgd2FybmluZ3M6IGxpc3Rbc3RyXSkgLT4g Tm9uZToKICAgICAgICAiIiJUaGluZ3MgdGhhdCBtYXkgc3VycHJpc2UgdGhlIHVzZXIgaW4gdGhl IHJlc3VsdCAobm9uZTogaGlkZGVuKS4iIiIKICAgICAgICB0ZXh0ID0gIlxuIi5qb2luKGYi4pqg IHt3fSIgZm9yIHcgaW4gd2FybmluZ3MpCiAgICAgICAgc2V0X21lc3NhZ2Uoc2VsZi53aW4sIHNl bGYuaXRlbXNbIldhcm5pbmdzIl0sIHRleHQsIE5PVElDRV9TVFlMRSkKCiAgICBkZWYgc2hvd19j bGVhcl9pbl9vdXQoc2VsZiwgdmlzaWJsZTogYm9vbCkgLT4gTm9uZToKICAgICAgICBzZWxmLl9j bGVhcl9pbl9vdXRfd2FudGVkID0gdmlzaWJsZQogICAgICAgIHNlbGYuX3Nob3coIkNsZWFySW5P dXQiLCB2aXNpYmxlIGFuZCBzZWxmLm1vZGUgPT0gU0VUVVApCgogICAgZGVmIHNldF9zdGFydF9l bmFibGVkKHNlbGYsIGVuYWJsZWQ6IGJvb2wpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5pdGVtc1si U3RhcnQiXS5FbmFibGVkID0gZW5hYmxlZAogICAgICAgIHNlbGYuaXRlbXNbIkVkaXRTdGFydCJd LkVuYWJsZWQgPSBlbmFibGVkCgogICAgIyAtLSBtb2Rlczogc2V0dXAg4oaSIHJ1bm5pbmcg4oaS IHJlc3VsdCDihpIgc2V0dXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CgogICAgSU5QVVRTID0gKAogICAgICAgICJBdWRpbyIsCiAgICAgICAgIlByZXNldCIsCiAgICAg ICAgIlJlZnJlc2hQcmVzZXRzIiwKICAgICAgICAiVGl0bGUiLAogICAgICAgICJNdXRlIiwKICAg ICAgICAiRm9sbG93U2VsZWN0aW9uIiwKICAgICAgICAiUmVmcmVzaFRpbWVsaW5lIiwKICAgICAg ICAiQ2xlYXJJbk91dCIsCiAgICAgICAgIkxvZ291dCIsCiAgICAgICAgIlJlZnJlc2hBY2NvdW50 IiwKICAgICkKCiAgICBkZWYgX3Nob3coc2VsZiwgaXRlbV9pZDogc3RyLCB2aXNpYmxlOiBib29s KSAtPiBOb25lOgogICAgICAgIGlmIGJvb2woc2VsZi5pdGVtc1tpdGVtX2lkXS5IaWRkZW4pID09 IHZpc2libGU6CiAgICAgICAgICAgIHNlbGYuaXRlbXNbaXRlbV9pZF0uSGlkZGVuID0gbm90IHZp c2libGUKICAgICAgICAgICAgc2VsZi53aW4uUmVjYWxjTGF5b3V0KCkKCiAgICBkZWYgX3NldF9t b2RlKHNlbGYsIG1vZGU6IHN0cikgLT4gTm9uZToKICAgICAgICBzZWxmLm1vZGUgPSBtb2RlCiAg ICAgICAgc2VsZi5fc2hvdygiU2V0dXBQYW5lIiwgbW9kZSA9PSBTRVRVUCkKICAgICAgICBzZWxm Ll9zaG93KCJSdW5QYW5lIiwgbW9kZSAhPSBTRVRVUCkKICAgICAgICBzZWxmLl9zaG93KCJTdGVw cyIsIG1vZGUgPT0gUlVOTklORykKICAgICAgICBzZWxmLl9zaG93KCJQcm9ncmVzc1JvdyIsIG1v ZGUgPT0gUlVOTklORykKICAgICAgICBzZWxmLl9zaG93KCJDbGVhckluT3V0IiwgbW9kZSA9PSBT RVRVUCBhbmQgc2VsZi5fY2xlYXJfaW5fb3V0X3dhbnRlZCkKICAgICAgICBmb3IgaXRlbV9pZCBp biAoIlN0YXJ0IiwgIkVkaXRTdGFydCIpOgogICAgICAgICAgICBzZWxmLl9zaG93KGl0ZW1faWQs IG1vZGUgPT0gU0VUVVApCiAgICAgICAgc2VsZi5fc2hvdygiQ2FuY2VsIiwgbW9kZSA9PSBSVU5O SU5HKQogICAgICAgIHNlbGYuaXRlbXNbIkNhbmNlbCJdLkVuYWJsZWQgPSBtb2RlID09IFJVTk5J TkcKICAgICAgICBmb3IgaXRlbV9pZCBpbiAoIlNpbGVuY2VDYXJkIiwgIkJhY2tUb1NldHRpbmdz IiwgIkNvbnRpbnVlU2lsZW50Iik6CiAgICAgICAgICAgIHNlbGYuX3Nob3coaXRlbV9pZCwgRmFs c2UpCiAgICAgICAgc2VsZi5fc2hvdygiTmV3UHJvZHVjdGlvbiIsIG1vZGUgPT0gUkVTVUxUKQog ICAgICAgIHNlbGYuX3Nob3coIkVkaXRBZ2FpbiIsIG1vZGUgPT0gUkVTVUxUIGFuZCBzZWxmLl9l ZGl0X2FnYWluX3dhbnRlZCkKICAgICAgICBzZWxmLml0ZW1zWyJSdW5UaXRsZSJdLlRleHQgPSAi UFJPR1JFU1MiIGlmIG1vZGUgPT0gUlVOTklORyBlbHNlICJSRVNVTFQiCiAgICAgICAgaWYgbW9k ZSAhPSBSRVNVTFQ6CiAgICAgICAgICAgIHNlbGYucmVzdWx0X3RleHQgPSAiIgogICAgICAgICAg ICBzZWxmLl9zaG93KCJSZXN1bHRDYXJkIiwgRmFsc2UpCiAgICAgICAgc2VsZi5fdXBkYXRlX3By b2R1Y3Rpb25fcm93KCkKCiAgICBkZWYgX3VwZGF0ZV9wcm9kdWN0aW9uX3JvdyhzZWxmKSAtPiBO b25lOgogICAgICAgIHJlc3VsdCA9IHNlbGYubW9kZSA9PSBSRVNVTFQKICAgICAgICBsaW5rID0g Ym9vbChzZWxmLnByb2R1Y3Rpb25fdXJsKQogICAgICAgIHNob3dfZmlsZSA9IHNlbGYuX2ZpbGVf d2FudGVkIGFuZCByZXN1bHQKICAgICAgICBrZWVwID0gc2VsZi5fa2VlcF9vcl9kZWxldGVfd2Fu dGVkIGFuZCByZXN1bHQKICAgICAgICBpbl9tYWluX3JvdyA9IHNlbGYubW9kZSA9PSBSVU5OSU5H IG9yIChyZXN1bHQgYW5kIG5vdCBzaG93X2ZpbGUpCiAgICAgICAgc2VsZi5fc2hvdygiUnVuUHJv ZHVjdGlvbkxpbmsiLCBsaW5rIGFuZCBpbl9tYWluX3JvdykKICAgICAgICBzZWxmLl9zaG93KCJQ cm9kdWN0aW9uTGluayIsIGxpbmsgYW5kIHJlc3VsdCBhbmQgc2hvd19maWxlKQogICAgICAgIHNl bGYuX3Nob3coIlNob3dGaWxlIiwgc2hvd19maWxlKQogICAgICAgIHNlbGYuX3Nob3coIktlZXBP ckRlbGV0ZSIsIGtlZXApCiAgICAgICAgZm9yIGl0ZW1faWQgaW4gKCJLZWVwUHJvZHVjdGlvbiIs ICJEZWxldGVQcm9kdWN0aW9uIik6CiAgICAgICAgICAgIHNlbGYuaXRlbXNbaXRlbV9pZF0uRW5h YmxlZCA9IGtlZXAKICAgICAgICBzZWxmLl9zaG93KCJSZXN1bHRCdXR0b25zIiwgc2hvd19maWxl KQoKICAgIGRlZiBzZXRfcnVubmluZyhzZWxmLCBydW5uaW5nOiBib29sKSAtPiBOb25lOgogICAg ICAgICIiIkxvY2sgdGhlIGlucHV0cyBhbmQgc2hvdyB0aGUgc3RlcHMgd2hpbGUgYSBwcm9kdWN0 aW9uIHJ1bnM7IGFmdGVyd2FyZHMsIHRoZQogICAgICAgIHJlc3VsdCAodW50aWwgdGhlIHVzZXIg Y2xpY2tzIE5ldyBQcm9kdWN0aW9uKS4KCiAgICAgICAgQWZ0ZXIgYSBydW4sIHRoZSBzY3JlZW4g bG9naWMgcmUtYXBwbGllcyB0aGUgaW5wdXRzJyBvd24gZW5hYmxlZCBzdGF0ZXMuCiAgICAgICAg IiIiCiAgICAgICAgZm9yIGl0ZW1faWQgaW4gc2VsZi5JTlBVVFM6CiAgICAgICAgICAgIHNlbGYu aXRlbXNbaXRlbV9pZF0uRW5hYmxlZCA9IG5vdCBydW5uaW5nCiAgICAgICAgaWYgbm90IHJ1bm5p bmc6CiAgICAgICAgICAgIHNlbGYuc2V0X3Byb2dyZXNzKCIiLCBOb25lKQogICAgICAgIHNlbGYu X3NldF9tb2RlKFJVTk5JTkcgaWYgcnVubmluZyBlbHNlIFJFU1VMVCkKCiAgICBkZWYgc2hvd19l ZGl0X2FnYWluKHNlbGYsIHZpc2libGU6IGJvb2wpIC0+IE5vbmU6CiAgICAgICAgIiIiT2ZmZXIg RWRpdCBBZ2FpbiBpbiB0aGUgcmVzdWx0IHZpZXcgKGFmdGVyIGEgcHJvZHVjdGlvbiBmaW5pc2hl ZCkuIiIiCiAgICAgICAgc2VsZi5fZWRpdF9hZ2Fpbl93YW50ZWQgPSB2aXNpYmxlCiAgICAgICAg c2VsZi5fc2hvdygiRWRpdEFnYWluIiwgdmlzaWJsZSBhbmQgc2VsZi5tb2RlID09IFJFU1VMVCkK CiAgICBkZWYgc2hvd19zZXR1cChzZWxmKSAtPiBOb25lOgogICAgICAgICIiIkJhY2sgdG8gdGhl IGlucHV0cywgd2l0aG91dCB0aGUgbGFzdCBydW4ncyBtZXNzYWdlcy4iIiIKICAgICAgICBzZWxm LnNldF9zdGF0dXMoIiIpCiAgICAgICAgc2VsZi5zZXRfcHJvZHVjdGlvbl9saW5rKCIiKQogICAg ICAgIHNlbGYuc2hvd19rZWVwX29yX2RlbGV0ZShGYWxzZSkKICAgICAgICBzZWxmLnNob3dfZmls ZV9idXR0b24oRmFsc2UpCiAgICAgICAgc2VsZi5fc2V0X21vZGUoU0VUVVApCgogICAgZGVmIHNl dF9ydW5fZGV0YWlscyhzZWxmLCByb3dzOiBsaXN0W3R1cGxlW3N0ciwgc3RyXV0pIC0+IE5vbmU6 CiAgICAgICAgIiIiV2hhdCBydW5zLCBhcyAobGFiZWwsIHZhbHVlKSByb3dzOiB0aXRsZSwgYXVk aW8sIHByZXNldCwgbGVuZ3RoLgoKICAgICAgICBBIGxhYmVsIGRvZXNuJ3QgZ3JvdyB3aXRoIHdy YXBwZWQgdGV4dCwgc28gbG9uZyB2YWx1ZXMgYXJlIHNob3J0ZW5lZCBpbiB0aGUKICAgICAgICBt aWRkbGU7IHRoZSB0b29sdGlwIGhhcyB0aGVtIGluIGZ1bGwuCiAgICAgICAgIiIiCiAgICAgICAg c2VsZi5pdGVtc1siUnVuRGV0YWlscyJdLlRleHQgPSB0YWJsZV9odG1sKAogICAgICAgICAgICBb KGxhYmVsLCB0ZXh0X2h0bWwoZWxpZGUodmFsdWUsIFJVTl9ERVRBSUxfQ0hBUlMpKSwgIiIpIGZv ciBsYWJlbCwgdmFsdWUgaW4gcm93c10KICAgICAgICApCiAgICAgICAgc2VsZi5pdGVtc1siUnVu RGV0YWlscyJdLlRvb2xUaXAgPSAiXG4iLmpvaW4oZiJ7bGFiZWx9OiB7dmFsdWV9IiBmb3IgbGFi ZWwsIHZhbHVlIGluIHJvd3MpCgogICAgZGVmIHNldF9zdGVwcyhzZWxmLCBzdGVwczogbGlzdFt0 dXBsZVtzdHIsIHN0ciwgc3RyXV0pIC0+IE5vbmU6CiAgICAgICAgIiIiKG5hbWUsIERPTkUvQ1VS UkVOVC9UT0RPLCBkZXRhaWwpIHBlciBzdGVwIG9mIHRoZSBydW4uIiIiCiAgICAgICAgc2VsZi5p dGVtc1siU3RlcHMiXS5UZXh0ID0gc3RlcHNfaHRtbChzdGVwcykKCiAgICBkZWYgc2V0X3Byb2R1 Y3Rpb25fbGluayhzZWxmLCB1cmw6IHN0ciwgdGV4dDogc3RyID0gT1BFTl9URVhUKSAtPiBOb25l OgogICAgICAgICIiIkEgYnV0dG9uIHRoYXQgb3BlbnMgdGhlIHByb2R1Y3Rpb24gb24gYXVwaG9u aWMuY29tICgiIiBoaWRlcyBpdCkuIiIiCiAgICAgICAgc2VsZi5wcm9kdWN0aW9uX3VybCA9IHVy bAogICAgICAgIGZvciBpdGVtX2lkIGluICgiUHJvZHVjdGlvbkxpbmsiLCAiUnVuUHJvZHVjdGlv bkxpbmsiKToKICAgICAgICAgICAgc2VsZi5pdGVtc1tpdGVtX2lkXS5UZXh0ID0gdGV4dAogICAg ICAgICAgICBzZWxmLml0ZW1zW2l0ZW1faWRdLlRvb2xUaXAgPSB1cmwKICAgICAgICBzZWxmLl91 cGRhdGVfcHJvZHVjdGlvbl9yb3coKQoKICAgIGRlZiBzaG93X2ZpbGVfYnV0dG9uKHNlbGYsIHZp c2libGU6IGJvb2wpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5fZmlsZV93YW50ZWQgPSB2aXNpYmxl CiAgICAgICAgc2VsZi5fdXBkYXRlX3Byb2R1Y3Rpb25fcm93KCkKCiAgICBkZWYgc2hvd19rZWVw X29yX2RlbGV0ZShzZWxmLCB2aXNpYmxlOiBib29sKSAtPiBOb25lOgogICAgICAgIHNlbGYuX2tl ZXBfb3JfZGVsZXRlX3dhbnRlZCA9IHZpc2libGUKICAgICAgICBzZWxmLl91cGRhdGVfcHJvZHVj dGlvbl9yb3coKQoKICAgIGRlZiBhc2tfYWJvdXRfc2lsZW5jZShzZWxmLCB2aXNpYmxlOiBib29s KSAtPiBOb25lOgogICAgICAgICIiIldoaWxlIHJ1bm5pbmc6IHRoZSByZW5kZXIgaXMgc2lsZW50 OyBCYWNrIHRvIFNldHRpbmdzIG9yIENvbnRpbnVlIEFueXdheQogICAgICAgIChpbnN0ZWFkIG9m IENhbmNlbCkuIiIiCiAgICAgICAgaWYgdmlzaWJsZToKICAgICAgICAgICAgcmljaCwgaGVpZ2h0 ID0gcmVzdWx0X2h0bWwoIm5vdGljZSIsIFNJTEVOQ0VfSEVBRExJTkUsIFtdLCBTSUxFTkNFX1RF WFQsIFtdKQogICAgICAgICAgICBzZXRfY2FyZChzZWxmLml0ZW1zWyJTaWxlbmNlQ2FyZCJdLCBy aWNoLCBoZWlnaHQsIHJlc3VsdF9zdHlsZShXQVJOKSkKICAgICAgICBhc2tpbmcgPSB2aXNpYmxl IGFuZCBzZWxmLm1vZGUgPT0gUlVOTklORwogICAgICAgIGZvciBpdGVtX2lkIGluICgiU2lsZW5j ZUNhcmQiLCAiQmFja1RvU2V0dGluZ3MiLCAiQ29udGludWVTaWxlbnQiKToKICAgICAgICAgICAg c2VsZi5fc2hvdyhpdGVtX2lkLCBhc2tpbmcpCiAgICAgICAgICAgIHNlbGYuaXRlbXNbaXRlbV9p ZF0uRW5hYmxlZCA9IGFza2luZwogICAgICAgIHNlbGYuX3Nob3coIkNhbmNlbCIsIHNlbGYubW9k ZSA9PSBSVU5OSU5HIGFuZCBub3QgdmlzaWJsZSkKCiAgICBkZWYgc2hvd19yZXN1bHQoCiAgICAg ICAgc2VsZiwKICAgICAgICBraW5kOiBzdHIsCiAgICAgICAgaGVhZGxpbmU6IHN0ciwKICAgICAg ICByb3dzOiBsaXN0W3R1cGxlW3N0ciwgc3RyXV0gfCBOb25lID0gTm9uZSwKICAgICAgICB0ZXh0 OiBzdHIgPSAiIiwKICAgICAgICBub3RlczogbGlzdFtzdHJdIHwgTm9uZSA9IE5vbmUsCiAgICAp IC0+IE5vbmU6CiAgICAgICAgIiIiVGhlIHJ1bidzIG91dGNvbWUgYXMgYSBjYXJkOiBhIGhlYWRs aW5lIHdpdGggYSBtYXJrIChvaywgbm90aWNlLCBlcnJvciwKICAgICAgICBpbmZvKSwgc2hvcnQg bGFiZWwvdmFsdWUgcm93cywgYSBzZW50ZW5jZSBhbmQgbm90ZXMuIiIiCiAgICAgICAgcm93cywg bm90ZXMgPSByb3dzIG9yIFtdLCBub3RlcyBvciBbXQogICAgICAgIHJpY2gsIGhlaWdodCA9IHJl c3VsdF9odG1sKGtpbmQsIGhlYWRsaW5lLCByb3dzLCB0ZXh0LCBub3RlcykKICAgICAgICBzZXRf Y2FyZChzZWxmLml0ZW1zWyJSZXN1bHRDYXJkIl0sIHJpY2gsIGhlaWdodCwgcmVzdWx0X3N0eWxl KFJFU1VMVF9DT0xPVVJTW2tpbmRdKSkKICAgICAgICBzZWxmLnJlc3VsdF90ZXh0ID0gIlxuIi5q b2luKAogICAgICAgICAgICBbaGVhZGxpbmUsICooZiJ7bGFiZWx9OiB7dmFsdWV9IiBmb3IgbGFi ZWwsIHZhbHVlIGluIHJvd3MpLCB0ZXh0LCAqbm90ZXNdCiAgICAgICAgKS5zdHJpcCgpCiAgICAg ICAgc2V0X21lc3NhZ2Uoc2VsZi53aW4sIHNlbGYuaXRlbXNbIlN0YXR1cyJdLCAiIikKICAgICAg ICBzZWxmLl9zaG93KCJSZXN1bHRDYXJkIiwgVHJ1ZSkKICAgICAgICBzZWxmLndpbi5SZWNhbGNM YXlvdXQoKQoKICAgIGRlZiBzZXRfcHJvZ3Jlc3Moc2VsZiwgc3RhZ2U6IHN0ciwgZnJhY3Rpb246 IGZsb2F0IHwgTm9uZSkgLT4gTm9uZToKICAgICAgICAiIiJUaGUgc3RhZ2UsIHBsdXMgYSBmaXhl ZC1zaXplIGJhciBhbmQgcGVyY2VudGFnZSB3aGVuIHRoZSBzdGFnZSBoYXMgYSBmcmFjdGlvbi4i IiIKICAgICAgICBzZWxmLml0ZW1zWyJQcm9ncmVzcyJdLlRleHQgPSB0ZXh0X2h0bWwoZiJ7c3Rh Z2V94oCmIikgaWYgc3RhZ2UgZWxzZSAiIgogICAgICAgIGJhciwgcGVyY2VudCA9IHNlbGYuaXRl bXNbIlByb2dyZXNzQmFyIl0sIHNlbGYuaXRlbXNbIlByb2dyZXNzUGVyY2VudCJdCiAgICAgICAg c2hvdyA9IGZyYWN0aW9uIGlzIG5vdCBOb25lCiAgICAgICAgaWYgZnJhY3Rpb24gaXMgbm90IE5v bmU6CiAgICAgICAgICAgIGJhci5TdHlsZVNoZWV0ID0gcHJvZ3Jlc3Nfc3R5bGUoZnJhY3Rpb24p CiAgICAgICAgICAgIHBlcmNlbnQuVGV4dCA9IHBlcmNlbnRfdGV4dChmcmFjdGlvbikKICAgICAg ICBpZiBiYXIuSGlkZGVuID09IHNob3c6ICAjIHJlLWxheW91dCBvbmx5IHdoZW4gdGhlIGJhciBh cHBlYXJzIG9yIGRpc2FwcGVhcnMKICAgICAgICAgICAgYmFyLkhpZGRlbiA9IHBlcmNlbnQuSGlk ZGVuID0gbm90IHNob3cKICAgICAgICAgICAgc2VsZi53aW4uUmVjYWxjTGF5b3V0KCkKCiAgICAj IC0tIHN0YXR1cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZGVmIF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2U6 IHN0ciwga2luZDogc3RyLCBzdHlsZTogc3RyKSAtPiBOb25lOgogICAgICAgICIiIkluIHRoZSBy ZXN1bHQgdmlldywgbWVzc2FnZXMgZ28gaW50byB0aGUgcmVzdWx0IGNhcmQuIiIiCiAgICAgICAg aWYgc2VsZi5tb2RlID09IFJFU1VMVCBhbmQgbWVzc2FnZToKICAgICAgICAgICAgc2VsZi5zaG93 X3Jlc3VsdChraW5kLCAiIiwgdGV4dD1tZXNzYWdlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAg IHNldF9tZXNzYWdlKHNlbGYud2luLCBzZWxmLml0ZW1zWyJTdGF0dXMiXSwgbWVzc2FnZSwgc3R5 bGUpCgogICAgZGVmIHNldF9zdGF0dXMoc2VsZiwgbWVzc2FnZTogc3RyKSAtPiBOb25lOgogICAg ICAgIHNlbGYuX21lc3NhZ2UobWVzc2FnZSwgIm9rIiwgTVVURURfU1RZTEUpCgogICAgZGVmIHNo b3dfZXJyb3Ioc2VsZiwgbWVzc2FnZTogc3RyKSAtPiBOb25lOgogICAgICAgIHNlbGYuX21lc3Nh Z2UobWVzc2FnZSwgImVycm9yIiwgRVJST1JfU1RZTEUpCgogICAgZGVmIHNob3dfbm90aWNlKHNl bGYsIG1lc3NhZ2U6IHN0cikgLT4gTm9uZToKICAgICAgICBzZWxmLl9tZXNzYWdlKG1lc3NhZ2Us ICJub3RpY2UiLCBOT1RJQ0VfU1RZTEUpCgoKRElWSURFUl9GQUxMQkFDSyA9ICLilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAiCgoKZGVmIF9jb3VudChjb21ibzogQW55 KSAtPiBpbnQgfCBOb25lOgogICAgdHJ5OgogICAgICAgIHJldHVybiBpbnQoY29tYm8uQ291bnQo KSkKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcmV0dXJuIE5vbmUKCgpkZWYgX2FkZF9k aXZpZGVyKGNvbWJvOiBBbnksIHBvc2l0aW9uOiBpbnQpIC0+IE5vbmU6CiAgICAiIiJBIHNlcGFy YXRvciBsaW5lIGluIGEgZHJvcGRvd247IGEgbGluZSBvZiB0ZXh0IGlmIFVJTWFuYWdlciBoYXMg bm8gc2VwYXJhdG9ycy4iIiIKICAgIGJlZm9yZSA9IF9jb3VudChjb21ibykKICAgIHRyeToKICAg ICAgICBjb21iby5JbnNlcnRTZXBhcmF0b3IocG9zaXRpb24pCiAgICBleGNlcHQgRXhjZXB0aW9u OgogICAgICAgIGNvbWJvLkFkZEl0ZW0oRElWSURFUl9GQUxMQkFDSykKICAgICAgICByZXR1cm4K ICAgIGFmdGVyID0gX2NvdW50KGNvbWJvKQogICAgaWYgYmVmb3JlIGlzIG5vdCBOb25lIGFuZCBh ZnRlciBpcyBub3QgTm9uZSBhbmQgYWZ0ZXIgIT0gYmVmb3JlICsgMToKICAgICAgICBjb21iby5B ZGRJdGVtKERJVklERVJfRkFMTEJBQ0spICAjIHRoZSBjYWxsIGRpZCBub3RoaW5nCgoKZGVmIF9j YWxsKG9iajogQW55LCBtZXRob2Q6IHN0ciwgKmFyZ3M6IEFueSkgLT4gQW55OgogICAgdHJ5Ogog ICAgICAgIHJldHVybiBnZXRhdHRyKG9iaiwgbWV0aG9kKSgqYXJncykKICAgIGV4Y2VwdCBFeGNl cHRpb246CiAgICAgICAgcmV0dXJuIE5vbmUKCgpkZWYgX2NsZWFyX3RyZWUodHJlZTogQW55KSAt PiBOb25lOgogICAgdHJ5OgogICAgICAgIHRyZWUuQ2xlYXIoKQogICAgZXhjZXB0IEV4Y2VwdGlv bjoKICAgICAgICB3aGlsZSAoX2NhbGwodHJlZSwgIlRvcExldmVsSXRlbUNvdW50Iikgb3IgMCkg PiAwOgogICAgICAgICAgICB0cmVlLlRha2VUb3BMZXZlbEl0ZW0oMCkKCgpkZWYgX2NoZWNrYWJs ZShpdGVtOiBBbnkpIC0+IE5vbmU6CiAgICAjIE5vIEl0ZW1Jc0F1dG9UcmlzdGF0ZTogdGhlIHNj cmVlbiBsb2dpYyBzZXRzIHRoZSB0cmFjaydzIHN0YXRlIGZyb20gaXRzIGNsaXBzLgogICAgaXRl bS5GbGFncyA9IHsiSXRlbUlzU2VsZWN0YWJsZSI6IFRydWUsICJJdGVtSXNFbmFibGVkIjogVHJ1 ZSwgIkl0ZW1Jc1VzZXJDaGVja2FibGUiOiBUcnVlfQogICAgaXRlbS5DaGVja1N0YXRlWzBdID0g VU5DSEVDS0VECgoKZGVmIF9zZXRfY2hlY2soaXRlbTogQW55LCBzdGF0ZTogc3RyKSAtPiBOb25l OgogICAgd2l0aCBjb250ZXh0bGliLnN1cHByZXNzKEV4Y2VwdGlvbik6CiAgICAgICAgaXRlbS5D aGVja1N0YXRlWzBdID0gc3RhdGUKCgpkZWYgX2dldF9jaGVjayhpdGVtOiBBbnkpIC0+IHN0ciB8 IE5vbmU6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHN0cihpdGVtLkNoZWNrU3RhdGVbMF0pCiAg ICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiBOb25lClBLAwQUAAAAAAAUW2pdEIaA phcIAAAXCAAAHAAAAGF1cGhvbmljX3Jlc29sdmUvdWkvdGFza3MucHkiIiJSdW4gYmxvY2tpbmcg d29yayBpbiB3b3JrZXIgdGhyZWFkcyBhbmQgZGVsaXZlciByZXN1bHRzIG9uIHRoZSBVSSB0aHJl YWQuCgpVSU1hbmFnZXIgZWxlbWVudHMgbXVzdCBvbmx5IGJlIHRvdWNoZWQgZnJvbSB0aGUgVUkg dGhyZWFkLiBXb3JrZXJzIHRoZXJlZm9yZSBuZXZlcgpjYWxsIGJhY2sgZGlyZWN0bHk6IHRoZWly IHJlc3VsdHMgYXJlIHF1ZXVlZCwgYW5kIGBgcG9sbCgpYGAgKGNhbGxlZCBmcm9tIHRoZSBVSQp0 aW1lcikgcnVucyB0aGUgY2FsbGJhY2tzLgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5u b3RhdGlvbnMKCmltcG9ydCB0aHJlYWRpbmcKZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IENh bGxhYmxlCmZyb20gdHlwaW5nIGltcG9ydCBBbnkKCmZyb20gLi4gaW1wb3J0IGxvZwoKQ2FsbGJh Y2sgPSBDYWxsYWJsZVtbQW55LCBCYXNlRXhjZXB0aW9uIHwgTm9uZV0sIE5vbmVdCgoKZGVmIF9z dGFydF90aHJlYWQodGFyZ2V0OiBDYWxsYWJsZVtbXSwgTm9uZV0sIG5hbWU6IHN0cikgLT4gTm9u ZToKICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXRhcmdldCwgbmFtZT1uYW1lLCBkYWVtb249 VHJ1ZSkuc3RhcnQoKQoKCmNsYXNzIFRhc2tSdW5uZXI6CiAgICBkZWYgX19pbml0X18oc2VsZiwg c3RhcnQ6IENhbGxhYmxlW1tDYWxsYWJsZVtbXSwgTm9uZV0sIHN0cl0sIE5vbmVdID0gX3N0YXJ0 X3RocmVhZCkgLT4gTm9uZToKICAgICAgICBzZWxmLl9zdGFydCA9IHN0YXJ0CiAgICAgICAgc2Vs Zi5fbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKICAgICAgICBzZWxmLl9maW5pc2hlZDogbGlzdFt0 dXBsZVtDYWxsYmFjaywgQW55LCBCYXNlRXhjZXB0aW9uIHwgTm9uZV1dID0gW10KICAgICAgICBz ZWxmLl9ydW5uaW5nID0gMAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJ1c3koc2VsZikgLT4gYm9v bDoKICAgICAgICB3aXRoIHNlbGYuX2xvY2s6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9ydW5u aW5nID4gMCBvciBib29sKHNlbGYuX2ZpbmlzaGVkKQoKICAgIGRlZiBydW4oc2VsZiwgbmFtZTog c3RyLCB3b3JrOiBDYWxsYWJsZVtbXSwgQW55XSwgb25fZG9uZTogQ2FsbGJhY2spIC0+IE5vbmU6 CiAgICAgICAgIiIiUnVuIGBgd29yaygpYGAgaW4gYSB0aHJlYWQ7IGxhdGVyIGNhbGwgYGBvbl9k b25lKHJlc3VsdCwgZXJyb3IpYGAgZnJvbSBgYHBvbGwoKWBgLiIiIgoKICAgICAgICBkZWYgdGFy Z2V0KCkgLT4gTm9uZToKICAgICAgICAgICAgcmVzdWx0OiBBbnkgPSBOb25lCiAgICAgICAgICAg IGVycm9yOiBCYXNlRXhjZXB0aW9uIHwgTm9uZSA9IE5vbmUKICAgICAgICAgICAgdHJ5OgogICAg ICAgICAgICAgICAgcmVzdWx0ID0gd29yaygpCiAgICAgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0 aW9uIGFzIGV4YzoKICAgICAgICAgICAgICAgIGVycm9yID0gZXhjCiAgICAgICAgICAgIHdpdGgg c2VsZi5fbG9jazoKICAgICAgICAgICAgICAgIHNlbGYuX3J1bm5pbmcgLT0gMQogICAgICAgICAg ICAgICAgc2VsZi5fZmluaXNoZWQuYXBwZW5kKChvbl9kb25lLCByZXN1bHQsIGVycm9yKSkKCiAg ICAgICAgd2l0aCBzZWxmLl9sb2NrOgogICAgICAgICAgICBzZWxmLl9ydW5uaW5nICs9IDEKICAg ICAgICBzZWxmLl9zdGFydCh0YXJnZXQsIGYiYXVwaG9uaWMte25hbWV9IikKCiAgICBkZWYgcG9s bChzZWxmKSAtPiBOb25lOgogICAgICAgICIiIlJ1biB0aGUgY2FsbGJhY2tzIG9mIGZpbmlzaGVk IHRhc2tzLiBDYWxsIGZyb20gdGhlIFVJIHRocmVhZCBvbmx5LiIiIgogICAgICAgIHdpdGggc2Vs Zi5fbG9jazoKICAgICAgICAgICAgZmluaXNoZWQsIHNlbGYuX2ZpbmlzaGVkID0gc2VsZi5fZmlu aXNoZWQsIFtdCiAgICAgICAgZm9yIGNhbGxiYWNrLCByZXN1bHQsIGVycm9yIGluIGZpbmlzaGVk OgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXN1bHQsIGVycm9y KQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgICAgIGxv Zy5lcnJvcigiVW5leHBlY3RlZCBlcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgd2luZG93LiIsIGV4 YykKUEsDBBQAAAAAABRbal31l7Gg+zQAAPs0AAAeAAAAYXVwaG9uaWNfcmVzb2x2ZS91aS93aWRn ZXRzLnB5IiIiU2hhcmVkIFVJTWFuYWdlciBidWlsZGluZyBibG9ja3MuIiIiCgpmcm9tIF9fZnV0 dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgaHRtbAppbXBvcnQgdGV4dHdyYXAKZnJv bSB0eXBpbmcgaW1wb3J0IEFueQoKZnJvbSAuLiBpbXBvcnQgX192ZXJzaW9uX18KZnJvbSAuLmxp bmtzIGltcG9ydCBIRUxQX1VSTAoKIyBDb2xvdXJzLCBjaG9zZW4gZm9yIERhVmluY2kgUmVzb2x2 ZSdzIGRhcmsgZ3JleSB3aW5kb3dzLgpURVhUID0gIiNkNmQ4ZGMiCk1VVEVEID0gIiM4Yjk0OWUi CkxJTkUgPSAiIzNhM2Q0MiIKQ0FSRF9CRyA9ICIjMmEyZDMxIgpBQ0NFTlQgPSAiIzNkOGZkMSIK QUNDRU5UX0hPVkVSID0gIiM1YWEzZGUiCk9LID0gIiM1N2FiNWEiCldBUk4gPSAiI2Q0YTcyYyIK RVJST1IgPSAiI2U1NTM0YiIKCkVSUk9SX1NUWUxFID0gZiJjb2xvcjoge0VSUk9SfTsiCk5PVElD RV9TVFlMRSA9IGYiY29sb3I6IHtXQVJOfTsiCk1VVEVEX1NUWUxFID0gZiJjb2xvcjoge01VVEVE fTsiCkNBUkRfUEFERElOR19QWCA9IDgKQ0FSRF9TVFlMRSA9ICgKICAgIGYiYmFja2dyb3VuZDog e0NBUkRfQkd9OyBib3JkZXI6IDFweCBzb2xpZCB7TElORX07IGJvcmRlci1yYWRpdXM6IDZweDsg IgogICAgZiJwYWRkaW5nOiB7Q0FSRF9QQURESU5HX1BYfXB4OyIKKQojIFRoZSBvbmUgZmlsbGVk IGJ1dHRvbiBwZXIgc2NyZWVuIChzZWVuIHdvcmtpbmcgaW4gUmVzb2x2ZSAyMS4xLjEncyBzdHls ZSBwcm9iZSkuCiMgUm91bmRlZCBsaWtlIFJlc29sdmUncyBvd24gYnV0dG9ucywgd2hpY2ggYXJl IHBpbGwtc2hhcGVkIChhYm91dCAyMiBweCBoaWdoKS4gVGhlCiMgYm9yZGVyIGFuZCB0ZXh0IGFy ZSBhIHNvZnQgd2hpdGU6IHB1cmUgd2hpdGUgbG9va2VkIGhhcnNoIG5leHQgdG8gUmVzb2x2ZSdz IGdyZXlzLgpQUklNQVJZX0JVVFRPTl9TVFlMRSA9ICgKICAgIGYiUVB1c2hCdXR0b24ge3sgYmFj a2dyb3VuZDoge0FDQ0VOVH07IGNvbG9yOiAjZThmMWY5OyAiCiAgICAiYm9yZGVyOiAxcHggc29s aWQgcmdiYSgyNTUsIDI1NSwgMjU1LCA3MCk7IGJvcmRlci1yYWRpdXM6IDExcHg7ICIKICAgICJw YWRkaW5nOiAzcHggMTZweDsgbWluLWhlaWdodDogMTZweDsgZm9udC13ZWlnaHQ6IDUwMDsgfSAi CiAgICBmIlFQdXNoQnV0dG9uOmhvdmVyIHt7IGJhY2tncm91bmQ6IHtBQ0NFTlRfSE9WRVJ9OyAi CiAgICAiYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDExMCk7IH0gIgogICAgIlFQ dXNoQnV0dG9uOmRpc2FibGVkIHsgYmFja2dyb3VuZDogIzRhNGE0YTsgY29sb3I6ICM4YThhOGE7 IGJvcmRlci1jb2xvcjogIzVkNjM2YjsgfSIKKQojIFNtYWxsIHNlY29uZGFyeSBhY3Rpb25zIChS ZWZyZXNoLCBMb2cgT3V0KSBkcmF3biBhcyBsaW5rcywgc28gdGhleSBkb24ndCBjb21wZXRlCiMg d2l0aCB0aGUgcHJpbWFyeSBidXR0b24uCkxJTktfQlVUVE9OX1NUWUxFID0gKAogICAgZiJRUHVz aEJ1dHRvbiB7eyBib3JkZXI6IG5vbmU7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjog e0FDQ0VOVF9IT1ZFUn07ICIKICAgICJwYWRkaW5nOiAycHggNHB4OyB9ICIKICAgICJRUHVzaEJ1 dHRvbjpob3ZlciB7IGNvbG9yOiAjOGNjNGYwOyB9ICIKICAgICJRUHVzaEJ1dHRvbjpkaXNhYmxl ZCB7IGNvbG9yOiAjNWQ2MzZiOyB9IgopCgoKZGVmIHRleHRfaHRtbCh0ZXh0OiBzdHIpIC0+IHN0 cjoKICAgICIiIlRleHQgZm9yIGEgcmljaC10ZXh0IGxhYmVsLiBRdW90ZXMgc3RheSBhcyB0aGV5 IGFyZTogUXQgc2hvd3MgZW50aXRpZXMgc3VjaCBhcwogICAgYGAmI3gyNztgYCAod2hhdCBgYGh0 bWwuZXNjYXBlYGAgbWFrZXMgb2YgYW4gYXBvc3Ryb3BoZSkgbGl0ZXJhbGx5LiIiIgogICAgcmV0 dXJuIGh0bWwuZXNjYXBlKHRleHQsIHF1b3RlPUZhbHNlKQoKCmRlZiBlbGlkZSh0ZXh0OiBzdHIs IGxpbWl0OiBpbnQpIC0+IHN0cjoKICAgICIiIlNob3J0ZW4gYGB0ZXh0YGAgaW4gdGhlIG1pZGRs ZSB0byBgYGxpbWl0YGAgY2hhcmFjdGVycyAoa2VlcHMgYm90aCBlbmRzLCBlLmcuIGEKICAgIGZp bGUgZXh0ZW5zaW9uIGFuZCBhIHRyYWNrIG5hbWUpLiIiIgogICAgaWYgbGVuKHRleHQpIDw9IGxp bWl0OgogICAgICAgIHJldHVybiB0ZXh0CiAgICBoZWFkID0gKGxpbWl0IC0gMSkgLy8gMgogICAg cmV0dXJuIHRleHRbOmhlYWRdICsgIuKApiIgKyB0ZXh0W2xlbih0ZXh0KSAtIChsaW1pdCAtIDEg LSBoZWFkKSA6XQoKCmRlZiBsaW5rKHVybDogc3RyLCB0ZXh0OiBzdHIpIC0+IHN0cjoKICAgIHJl dHVybiBmJzxhIGhyZWY9IntodG1sLmVzY2FwZSh1cmwsIHF1b3RlPVRydWUpfSI+e3RleHRfaHRt bCh0ZXh0KX08L2E+JwoKCkZPT1RFUl9TUEFDRV9BQk9WRSA9IDE4ICAjIHB4IGFib3ZlIHRoZSBs aW5lIG92ZXIgdGhlIHZlcnNpb24gYW5kIGhlbHAgbGluawpGT09URVJfUk9XX0hFSUdIVCA9IDE2 ICAjIHB4OyBsYWJlbHMgYXJlIHRhbGxlciB0aGFuIHRoZWlyIHRleHQgYnkgZGVmYXVsdAojIE5l c3RlZCBncm91cHMgbWF5IGdldCBtYXJnaW5zIG9mIHRoZWlyIG93bjsgemVybyB0aGVtIHdoZXJl IHNwYWNpbmcgaXMgc2V0IGV4YWN0bHkuCk5PX01BUkdJTiA9IDAKRk9PVEVSX1NQQUNFX0JFTE9X ID0gMCAgIyBweCBiZXR3ZWVuIHRoYXQgbGluZSBhbmQgdGhlIHZlcnNpb24gYW5kIGhlbHAgbGlu awoKCmRlZiBkaXZpZGVyKHVpOiBBbnkpIC0+IEFueToKICAgICIiIkEgdGhpbiBob3Jpem9udGFs IGxpbmUuIiIiCiAgICByZXR1cm4gdWkuTGFiZWwoCiAgICAgICAgewogICAgICAgICAgICAiVGV4 dCI6ICIiLAogICAgICAgICAgICAiV2VpZ2h0IjogMCwKICAgICAgICAgICAgIk1pbmltdW1TaXpl IjogWzAsIDFdLAogICAgICAgICAgICAiTWF4aW11bVNpemUiOiBbMTY3NzcyMTUsIDFdLAogICAg ICAgICAgICAiU3R5bGVTaGVldCI6IGYiYmFja2dyb3VuZDoge0xJTkV9OyIsCiAgICAgICAgfQog ICAgKQoKCmRlZiBmb290ZXIodWk6IEFueSkgLT4gQW55OgogICAgIiIiQSBsaW5lLCB0aGVuIHRo ZSB2ZXJzaW9uIG9uIHRoZSBsZWZ0IGFuZCB0aGUgaGVscCBsaW5rIG9uIHRoZSByaWdodC4KCiAg ICBMYWJlbHMgc3RyZXRjaCBieSBkZWZhdWx0LCBzbyBib3RoIGdldCBXZWlnaHQgMCAoZWxzZSB0 aGUgZ2FwIG9ubHkgZ2V0cyBhIHNoYXJlIG9mCiAgICB0aGUgcm9vbSkgYW5kIHRoZSBsaW5rIGlz IHJpZ2h0LWFsaWduZWQgYXMgd2VsbC4KICAgICIiIgogICAgdGlnaHQgPSB7CiAgICAgICAgIldl aWdodCI6IDAsCiAgICAgICAgIk1pbmltdW1TaXplIjogWzAsIEZPT1RFUl9ST1dfSEVJR0hUXSwK ICAgICAgICAiTWF4aW11bVNpemUiOiBbMTY3NzcyMTUsIEZPT1RFUl9ST1dfSEVJR0hUXSwKICAg IH0KICAgIHJvdyA9IHVpLkhHcm91cCgKICAgICAgICB7IldlaWdodCI6IDAsICJNYXJnaW4iOiBO T19NQVJHSU59LAogICAgICAgIFsKICAgICAgICAgICAgdWkuTGFiZWwoCiAgICAgICAgICAgICAg ICB7CiAgICAgICAgICAgICAgICAgICAgKip0aWdodCwKICAgICAgICAgICAgICAgICAgICAiSUQi OiAiVmVyc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgIlRleHQiOiBmIlZlcnNpb24ge19fdmVy c2lvbl9ffSIsCiAgICAgICAgICAgICAgICAgICAgIlN0eWxlU2hlZXQiOiBmIntNVVRFRF9TVFlM RX0gbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyIsCiAgICAgICAgICAgICAgICAgICAgIkFsaWdubWVu dCI6IHsiQWxpZ25MZWZ0IjogVHJ1ZSwgIkFsaWduVG9wIjogVHJ1ZX0sCiAgICAgICAgICAgICAg ICB9CiAgICAgICAgICAgICksCiAgICAgICAgICAgIHVpLkhHYXAoMCwgMSksCiAgICAgICAgICAg IHVpLkxhYmVsKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICoqdGlnaHQs CiAgICAgICAgICAgICAgICAgICAgIklEIjogIkhlbHBMaW5rIiwKICAgICAgICAgICAgICAgICAg ICAiVGV4dCI6IGxpbmsoSEVMUF9VUkwsICJIZWxwIiksCiAgICAgICAgICAgICAgICAgICAgIk9w ZW5FeHRlcm5hbExpbmtzIjogVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAiU3R5bGVTaGVldCI6 ICJtYXJnaW46IDA7IHBhZGRpbmc6IDA7IiwKICAgICAgICAgICAgICAgICAgICAiQWxpZ25tZW50 IjogeyJBbGlnblJpZ2h0IjogVHJ1ZSwgIkFsaWduVG9wIjogVHJ1ZX0sCiAgICAgICAgICAgICAg ICB9CiAgICAgICAgICAgICksCiAgICAgICAgXSwKICAgICkKICAgIHJldHVybiB1aS5WR3JvdXAo CiAgICAgICAgeyJXZWlnaHQiOiAwLCAiU3BhY2luZyI6IDAsICJNYXJnaW4iOiBOT19NQVJHSU59 LAogICAgICAgIFt1aS5WR2FwKEZPT1RFUl9TUEFDRV9BQk9WRSwgMCksIGRpdmlkZXIodWkpLCB1 aS5WR2FwKEZPT1RFUl9TUEFDRV9CRUxPVywgMCksIHJvd10sCiAgICApCgoKU0VDVElPTl9TUEFD RV9BQk9WRSA9IDE2ICAjIHB4IGFib3ZlIGEgc2VjdGlvbiB0aXRsZSwgb24gdG9wIG9mIHRoZSB3 aW5kb3cncyBzcGFjaW5nClNFQ1RJT05fU1BBQ0VfQkVMT1cgPSAwICAjIHB4IGJldHdlZW4gdGhl IGxpbmUgdW5kZXIgdGhlIHRpdGxlIGFuZCB0aGUgY29udGVudApDT05URU5UX1NQQUNJTkcgPSA2 ICAjIHB4IGJldHdlZW4gdGhlIGVsZW1lbnRzIG9mIGEgc2VjdGlvbgoKCmRlZiBzZWN0aW9uKHVp OiBBbnksIHRpdGxlOiBzdHIsIGNoaWxkcmVuOiBsaXN0W0FueV0sICosIGl0ZW1faWQ6IHN0ciA9 ICIiLCB3ZWlnaHQ6IGludCA9IDApIC0+IEFueToKICAgICIiIkEgc2VjdGlvbjogc21hbGwgZ3Jl eSBjYXBpdGFscyBvdmVyIGEgdGhpbiBsaW5lLCB0aGVuIGBgY2hpbGRyZW5gYC4KCiAgICBUaGUg c3BhY2luZyBpbnNpZGUgaXMgc2V0IGV4YWN0bHkgd2l0aCBnYXBzIChhIGdyb3VwJ3Mgc3BhY2lu ZyBhcHBsaWVzIGJldHdlZW4gYWxsCiAgICBpdHMgZWxlbWVudHMpLiBgYGl0ZW1faWRgYCBuYW1l cyB0aGUgdGl0bGUgbGFiZWwsIGZvciBjaGFuZ2luZyBpdHMgdGV4dDsgYGB3ZWlnaHRgYAogICAg bGV0cyBhIHNlY3Rpb24gd2l0aCBhIGdyb3dpbmcgZWxlbWVudCAodGhlIHRyYWNrIGxpc3QpIGdy b3cuCiAgICAiIiIKICAgIHRpdGxlX3Byb3BzOiBkaWN0W3N0ciwgQW55XSA9IHsKICAgICAgICAi VGV4dCI6IHRleHRfaHRtbCh0aXRsZS51cHBlcigpKSwKICAgICAgICAiV2VpZ2h0IjogMCwKICAg ICAgICAiU3R5bGVTaGVldCI6IGYiY29sb3I6IHtNVVRFRH07IGZvbnQtc2l6ZTogMTFweDsgZm9u dC13ZWlnaHQ6IDYwMDsgbGV0dGVyLXNwYWNpbmc6IDFweDsiLAogICAgfQogICAgaWYgaXRlbV9p ZDoKICAgICAgICB0aXRsZV9wcm9wc1siSUQiXSA9IGl0ZW1faWQKICAgIHJldHVybiB1aS5WR3Jv dXAoCiAgICAgICAgeyJXZWlnaHQiOiB3ZWlnaHQsICJTcGFjaW5nIjogMCwgIk1hcmdpbiI6IE5P X01BUkdJTn0sCiAgICAgICAgWwogICAgICAgICAgICB1aS5WR2FwKFNFQ1RJT05fU1BBQ0VfQUJP VkUsIDApLAogICAgICAgICAgICB1aS5MYWJlbCh0aXRsZV9wcm9wcyksCiAgICAgICAgICAgIHVp LlZHYXAoMiwgMCksCiAgICAgICAgICAgIGRpdmlkZXIodWkpLAogICAgICAgICAgICAqKFt1aS5W R2FwKFNFQ1RJT05fU1BBQ0VfQkVMT1csIDApXSBpZiBTRUNUSU9OX1NQQUNFX0JFTE9XIGVsc2Ug W10pLAogICAgICAgICAgICB1aS5WR3JvdXAoCiAgICAgICAgICAgICAgICB7IldlaWdodCI6IHdl aWdodCwgIlNwYWNpbmciOiBDT05URU5UX1NQQUNJTkcsICJNYXJnaW4iOiBOT19NQVJHSU59LCBj aGlsZHJlbgogICAgICAgICAgICApLAogICAgICAgIF0sCiAgICApCgoKZGVmIGxpbmtfYnV0dG9u KHVpOiBBbnksIGl0ZW1faWQ6IHN0ciwgdGV4dDogc3RyLCB0b29sdGlwOiBzdHIgPSAiIikgLT4g QW55OgogICAgcmV0dXJuIHVpLkJ1dHRvbigKICAgICAgICB7CiAgICAgICAgICAgICJJRCI6IGl0 ZW1faWQsCiAgICAgICAgICAgICJUZXh0IjogdGV4dCwKICAgICAgICAgICAgIkZsYXQiOiBUcnVl LAogICAgICAgICAgICAiV2VpZ2h0IjogMCwKICAgICAgICAgICAgIlRvb2xUaXAiOiB0b29sdGlw LAogICAgICAgICAgICAiU3R5bGVTaGVldCI6IExJTktfQlVUVE9OX1NUWUxFLAogICAgICAgIH0K ICAgICkKCgpkZWYgdGFibGVfaHRtbChyb3dzOiBsaXN0W3R1cGxlW3N0ciwgc3RyLCBzdHJdXSkg LT4gc3RyOgogICAgIiIiQSB0d28tY29sdW1uIHRhYmxlIGZvciBhIGNhcmQ6IChsYWJlbCwgdmFs dWUgSFRNTCwgdmFsdWUgc3R5bGUpIHBlciByb3cuIiIiCiAgICBjZWxscyA9ICIiLmpvaW4oCiAg ICAgICAgZiI8dHI+PHRkIHN0eWxlPSdjb2xvcjp7TVVURUR9OyBwYWRkaW5nLXJpZ2h0OjEwcHgn Pnt0ZXh0X2h0bWwobGFiZWwpfTwvdGQ+IgogICAgICAgIGYiPHRkIHN0eWxlPSd7c3R5bGV9Jz57 dmFsdWV9PC90ZD48L3RyPiIKICAgICAgICBmb3IgbGFiZWwsIHZhbHVlLCBzdHlsZSBpbiByb3dz CiAgICApCiAgICByZXR1cm4gZiI8dGFibGUgY2VsbHNwYWNpbmc9JzAnIGNlbGxwYWRkaW5nPScy Jz57Y2VsbHN9PC90YWJsZT4iCgoKRE9ORSwgQ1VSUkVOVCwgVE9ETyA9ICJkb25lIiwgImN1cnJl bnQiLCAidG9kbyIKX1NURVBfTUFSSyA9IHtET05FOiAoIuKckyIsIE9LKSwgQ1VSUkVOVDogKCLi l48iLCBBQ0NFTlRfSE9WRVIpLCBUT0RPOiAoIuKXiyIsICIjNWQ2MzZiIil9CgoKZGVmIHN0ZXBz X2h0bWwoc3RlcHM6IGxpc3RbdHVwbGVbc3RyLCBzdHIsIHN0cl1dKSAtPiBzdHI6CiAgICAiIiJU aGUgc3RlcCBsaXN0IHNob3duIHdoaWxlIGEgcHJvZHVjdGlvbiBydW5zOiAobmFtZSwgc3RhdGUs IGRldGFpbCkgcGVyIHN0ZXAuIiIiCiAgICByb3dzID0gW10KICAgIGZvciBuYW1lLCBzdGF0ZSwg ZGV0YWlsIGluIHN0ZXBzOgogICAgICAgIG1hcmssIGNvbG91ciA9IF9TVEVQX01BUktbc3RhdGVd CiAgICAgICAgd2VpZ2h0ID0gImZvbnQtd2VpZ2h0OjYwMDsiIGlmIHN0YXRlID09IENVUlJFTlQg ZWxzZSAiIgogICAgICAgIHRleHRfY29sb3VyID0gTVVURUQgaWYgc3RhdGUgPT0gVE9ETyBlbHNl IFRFWFQKICAgICAgICByb3dzLmFwcGVuZCgKICAgICAgICAgICAgZiI8dHI+PHRkIHdpZHRoPScx OCcgc3R5bGU9J2NvbG9yOntjb2xvdXJ9Jz57bWFya308L3RkPiIKICAgICAgICAgICAgZiI8dGQg d2lkdGg9JzEwMCUnIHN0eWxlPSdjb2xvcjp7dGV4dF9jb2xvdXJ9OyB7d2VpZ2h0fSc+e3RleHRf aHRtbChuYW1lKX08L3RkPiIKICAgICAgICAgICAgZiI8dGQgc3R5bGU9J2NvbG9yOntNVVRFRH0n IGFsaWduPSdyaWdodCc+e3RleHRfaHRtbChkZXRhaWwpfTwvdGQ+PC90cj4iCiAgICAgICAgKQog ICAgcmV0dXJuIGYiPHRhYmxlIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMicgd2lkdGg9 JzEwMCUnPnsnJy5qb2luKHJvd3MpfTwvdGFibGU+IgoKCkxJTkVfSEVJR0hUX1BYID0gMTgKTUVT U0FHRV9QQURESU5HX1BYID0gOAojIENvbnNlcnZhdGl2ZSBjaGFyYWN0ZXJzIHBlciBsaW5lIGZv ciBhIG1lc3NhZ2UgaW4gYSB+NDQwIHB4IHdpZGUgd2luZG93LgpNRVNTQUdFX0NIQVJTX1BFUl9M SU5FID0gNTAKUkVTVUxUX1BBRERJTkdfUFggPSA4CiMgUmVhZC1vbmx5IHRleHQgZmllbGRzIGRy YXduIGxpa2UgcGxhaW4gdGV4dC4gTGFiZWxzIGNhbid0IGJlIHNlbGVjdGVkIGluIFVJTWFuYWdl ciwKIyBzbyBtZXNzYWdlcyBhbmQgdmFsdWVzIHVzZSByZWFkLW9ubHkgZmllbGRzLCB3aGljaCB1 c2VycyBjYW4gc2VsZWN0IGFuZCBjb3B5LgpGTEFUX0ZJRUxEX1NUWUxFID0gImJvcmRlcjogbm9u ZTsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IgoKCmRlZiBtZXNzYWdlX2xhYmVsKHVpOiBBbnks IGl0ZW1faWQ6IHN0cikgLT4gQW55OgogICAgIiIiQSBzZWxlY3RhYmxlLCB3b3JkLXdyYXBwaW5n IG1lc3NhZ2UgYXJlYSwgaGlkZGVuIHdoaWxlIGl0IGhhcyBubyB0ZXh0LiIiIgogICAgcmV0dXJu IHVpLlRleHRFZGl0KAogICAgICAgIHsKICAgICAgICAgICAgIklEIjogaXRlbV9pZCwKICAgICAg ICAgICAgIlBsYWluVGV4dCI6ICIiLAogICAgICAgICAgICAiUmVhZE9ubHkiOiBUcnVlLAogICAg ICAgICAgICAiV2VpZ2h0IjogMCwKICAgICAgICAgICAgIkhpZGRlbiI6IFRydWUsCiAgICAgICAg ICAgICJTdHlsZVNoZWV0IjogZiJRVGV4dEVkaXQge3sge0ZMQVRfRklFTERfU1RZTEV9IH19IiwK ICAgICAgICB9CiAgICApCgoKZGVmIHZhbHVlX2ZpZWxkKHVpOiBBbnksIGl0ZW1faWQ6IHN0ciwg dGV4dDogc3RyID0gIuKAkyIpIC0+IEFueToKICAgICIiIkEgc2VsZWN0YWJsZSBvbmUtbGluZSB2 YWx1ZSwgZHJhd24gbGlrZSBhIGxhYmVsLiIiIgogICAgcmV0dXJuIHVpLkxpbmVFZGl0KAogICAg ICAgIHsKICAgICAgICAgICAgIklEIjogaXRlbV9pZCwKICAgICAgICAgICAgIlRleHQiOiB0ZXh0 LAogICAgICAgICAgICAiUmVhZE9ubHkiOiBUcnVlLAogICAgICAgICAgICAiV2VpZ2h0IjogMSwK ICAgICAgICAgICAgIlN0eWxlU2hlZXQiOiBmIlFMaW5lRWRpdCB7eyB7RkxBVF9GSUVMRF9TVFlM RX0gfX0iLAogICAgICAgIH0KICAgICkKCgpkZWYgc2V0X3ZhbHVlKGl0ZW06IEFueSwgdGV4dDog c3RyLCBzdHlsZTogc3RyID0gIiIpIC0+IE5vbmU6CiAgICBpdGVtLlRleHQgPSB0ZXh0CiAgICBp dGVtLlN0eWxlU2hlZXQgPSBmIlFMaW5lRWRpdCB7eyB7RkxBVF9GSUVMRF9TVFlMRX0ge3N0eWxl fSB9fSIKCgpkZWYgbWVzc2FnZV9oZWlnaHQobGluZXM6IGludCkgLT4gaW50OgogICAgcmV0dXJu IGxpbmVzICogTElORV9IRUlHSFRfUFggKyBNRVNTQUdFX1BBRERJTkdfUFggaWYgbGluZXMgZWxz ZSAwCgoKZGVmIG1lc3NhZ2VfbGluZXModGV4dDogc3RyLCBjaGFyc19wZXJfbGluZTogaW50ID0g TUVTU0FHRV9DSEFSU19QRVJfTElORSkgLT4gaW50OgogICAgIiIiSG93IG1hbnkgbGluZXMgYGB0 ZXh0YGAgd3JhcHMgdG8gKDAgZm9yIG5vIHRleHQpOyBsaW5lIGJyZWFrcyBzdGFydCBuZXcgbGlu ZXMuIiIiCiAgICBpZiBub3QgdGV4dC5zdHJpcCgpOgogICAgICAgIHJldHVybiAwCiAgICByZXR1 cm4gc3VtKG1heCgxLCBsZW4odGV4dHdyYXAud3JhcChsaW5lLCBjaGFyc19wZXJfbGluZSkpKSBm b3IgbGluZSBpbiB0ZXh0LnNwbGl0KCJcbiIpKQoKCmRlZiBzZXRfbWVzc2FnZSh3aW5kb3c6IEFu eSwgaXRlbTogQW55LCB0ZXh0OiBzdHIsIHN0eWxlOiBzdHIgPSAiIiwgcGFkZGluZzogaW50ID0g MCkgLT4gTm9uZToKICAgICIiIlNob3cgYGB0ZXh0YGAgaW4gYSBtZXNzYWdlIGFyZWEsIHNpemVk IHRvIGl0cyB3cmFwcGVkIGxpbmUgY291bnQuCgogICAgVGhlIGFyZWEncyBoZWlnaHQgZm9sbG93 cyB0aGUgbWVzc2FnZSAoZml4ZWQsIHNvIGl0IG5ldmVyIHNjcm9sbHMgb3IgbGVhdmVzIGEgZ2Fw KSwKICAgIGFuZCBhbiBlbXB0eSBhcmVhIGlzIGhpZGRlbiBlbnRpcmVseS4gVUlNYW5hZ2VyIGRv ZXNuJ3QgcmUtbGF5b3V0IG9uIGl0cyBvd24gYWZ0ZXIKICAgIHN1Y2ggY2hhbmdlcyAoYSBsYWJl bCB3YXMgZHJhd24gb3ZlciB0aGUgd2luZG93J3MgdG9wLWxlZnQgY29ybmVyIGluIFJlc29sdmUg MjEuMSksCiAgICBzbyBhc2sgdGhlIHdpbmRvdyB0by4KICAgICIiIgogICAgaGVpZ2h0ID0gbWVz c2FnZV9oZWlnaHQobWVzc2FnZV9saW5lcyh0ZXh0KSkKICAgIGhlaWdodCArPSAyICogcGFkZGlu ZyBpZiBoZWlnaHQgZWxzZSAwCiAgICBpdGVtLlBsYWluVGV4dCA9IHRleHQKICAgIGl0ZW0uU3R5 bGVTaGVldCA9IGYiUVRleHRFZGl0IHt7IHtGTEFUX0ZJRUxEX1NUWUxFfSB7c3R5bGV9IH19Igog ICAgaXRlbS5NaW5pbXVtU2l6ZSA9IFswLCBoZWlnaHRdCiAgICBpdGVtLk1heGltdW1TaXplID0g WzE2Nzc3MjE1LCBoZWlnaHRdCiAgICBpdGVtLkhpZGRlbiA9IGhlaWdodCA9PSAwCiAgICB3aW5k b3cuUmVjYWxjTGF5b3V0KCkKCgojIFFUZXh0RWRpdCdzIGRvY3VtZW50IG1hcmdpbiAoNCBweCBv biBlYWNoIHNpZGUpLCBvbiB0b3Agb2YgdGhlIGNhcmQncyBwYWRkaW5nLgpDQVJEX0RPQ1VNRU5U X01BUkdJTl9QWCA9IDgKCgpkZWYgY2FyZF9maWVsZCh1aTogQW55LCBpdGVtX2lkOiBzdHIsICos IGhpZGRlbjogYm9vbCA9IEZhbHNlKSAtPiBBbnk6CiAgICAiIiJBIHJpY2gtdGV4dCBjYXJkLiBB IHJlYWQtb25seSB0ZXh0IGZpZWxkLCBub3QgYSBsYWJlbDogaW4gVUlNYW5hZ2VyLCBvbmx5IHRl eHQKICAgIGZpZWxkcyBsZXQgdXNlcnMgc2VsZWN0IGFuZCBjb3B5IHRoZWlyIHRleHQgKFRleHRJ bnRlcmFjdGlvbkZsYWdzIGhhZCBubyBlZmZlY3QpLiIiIgogICAgcmV0dXJuIHVpLlRleHRFZGl0 KAogICAgICAgIHsKICAgICAgICAgICAgIklEIjogaXRlbV9pZCwKICAgICAgICAgICAgIkhUTUwi OiAiIiwKICAgICAgICAgICAgIlJlYWRPbmx5IjogVHJ1ZSwKICAgICAgICAgICAgIldlaWdodCI6 IDAsCiAgICAgICAgICAgICJIaWRkZW4iOiBoaWRkZW4sCiAgICAgICAgICAgICJTdHlsZVNoZWV0 IjogZiJRVGV4dEVkaXQge3sge0NBUkRfU1RZTEV9IH19IiwKICAgICAgICB9CiAgICApCgoKZGVm IHNldF9jYXJkKGl0ZW06IEFueSwgaHRtbDogc3RyLCBoZWlnaHQ6IGludCwgc3R5bGU6IHN0ciA9 IENBUkRfU1RZTEUpIC0+IE5vbmU6CiAgICAiIiJGaWxsIGEgY2FyZDsgaXRzIGhlaWdodCBpcyBm aXhlZCwgc28gaXQgbmV2ZXIgc2Nyb2xscyBvciBsZWF2ZXMgYSBnYXAuIiIiCiAgICBpdGVtLkhU TUwgPSBodG1sCiAgICBpdGVtLlN0eWxlU2hlZXQgPSBmIlFUZXh0RWRpdCB7eyB7c3R5bGV9IH19 IgogICAgaXRlbS5NaW5pbXVtU2l6ZSA9IFswLCBoZWlnaHRdCiAgICBpdGVtLk1heGltdW1TaXpl ID0gWzE2Nzc3MjE1LCBoZWlnaHRdCgoKZGVmIHJlc3VsdF9zdHlsZShjb2xvdXI6IHN0cikgLT4g c3RyOgogICAgIiIiQSBjYXJkIHdpdGggYSBjb2xvdXJlZCBsZWZ0IGVkZ2UgKHRoZSBydW4ncyBv dXRjb21lKS4iIiIKICAgIHJldHVybiAoCiAgICAgICAgZiJiYWNrZ3JvdW5kOiB7Q0FSRF9CR307 IGJvcmRlcjogMXB4IHNvbGlkIHtMSU5FfTsgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCB7Y29sb3Vy fTsgIgogICAgICAgIGYiYm9yZGVyLXJhZGl1czogNnB4OyBwYWRkaW5nOiB7UkVTVUxUX1BBRERJ TkdfUFh9cHggMTBweDsgY29sb3I6IHtURVhUfTsiCiAgICApCgoKSU5GTyA9ICJpbmZvIiAgIyBy ZXN1bHQga2luZHM6IE9LLCBOT1RJQ0UgKGRvbmUsIHdpdGggbm90ZXMpLCBFUlJPUiwgSU5GTyAo ZS5nLiBjYW5jZWxsZWQpClJFU1VMVF9NQVJLUyA9IHsib2siOiAoIuKckyIsIE9LKSwgIm5vdGlj ZSI6ICgi4pqgIiwgV0FSTiksICJlcnJvciI6ICgi4pyVIiwgRVJST1IpLCBJTkZPOiAoIiIsIE1V VEVEKX0KUkVTVUxUX1JPV19DSEFSUyA9IDQ0ICAjIHBlciBsaW5lIG9mIGEgcm93IHZhbHVlIGlu IHRoZSByZXN1bHQgY2FyZCAoYWZ0ZXIgdGhlIGxhYmVsIGNvbHVtbikKUkVTVUxUX1RFWFRfQ0hB UlMgPSA1OCAgIyBwZXIgbGluZSBvZiBhIHBhcmFncmFwaCBpbiB0aGUgcmVzdWx0IGNhcmQKCgpk ZWYgcmVzdWx0X2h0bWwoCiAgICBraW5kOiBzdHIsIGhlYWRsaW5lOiBzdHIsIHJvd3M6IGxpc3Rb dHVwbGVbc3RyLCBzdHJdXSwgdGV4dDogc3RyLCBub3RlczogbGlzdFtzdHJdCikgLT4gdHVwbGVb c3RyLCBpbnRdOgogICAgIiIiVGhlIHJlc3VsdCBjYXJkJ3MgcmljaCB0ZXh0LCBhbmQgaXRzIGhl aWdodCBpbiBweCAobGFiZWxzIGRvbid0IGdyb3cgd2l0aAogICAgd3JhcHBlZCB0ZXh0IGluIFVJ TWFuYWdlciwgc28gdGhlIGhlaWdodCBpcyBlc3RpbWF0ZWQgZnJvbSB0aGUgbGluZSBjb3VudCku IiIiCiAgICBtYXJrLCBjb2xvdXIgPSBSRVNVTFRfTUFSS1Nba2luZF0KICAgIHBhcnRzLCBsaW5l cyA9IFtdLCAwLjAKICAgIGlmIGhlYWRsaW5lOgogICAgICAgIHRpdGxlID0gZiJ7bWFya30mbmJz cDsge3RleHRfaHRtbChoZWFkbGluZSl9IiBpZiBtYXJrIGVsc2UgdGV4dF9odG1sKGhlYWRsaW5l KQogICAgICAgIHBhcnRzLmFwcGVuZChmIjxkaXYgc3R5bGU9J2NvbG9yOntjb2xvdXJ9OyBmb250 LXNpemU6MTRweDsgZm9udC13ZWlnaHQ6NjAwJz57dGl0bGV9PC9kaXY+IikKICAgICAgICBsaW5l cyArPSAxLjQKICAgIGlmIHJvd3M6CiAgICAgICAgcGFydHMuYXBwZW5kKHRhYmxlX2h0bWwoWyhs YWJlbCwgdGV4dF9odG1sKHZhbHVlKSwgIiIpIGZvciBsYWJlbCwgdmFsdWUgaW4gcm93c10pKQog ICAgICAgIGxpbmVzICs9IDAuNCArIHN1bShtYXgoMSwgbGVuKHRleHR3cmFwLndyYXAodmFsdWUs IFJFU1VMVF9ST1dfQ0hBUlMpKSkgZm9yIF8sIHZhbHVlIGluIHJvd3MpCiAgICBmb3IgcGFyYWdy YXBoLCBzdHlsZSBpbiBbKHRleHQsIGYiY29sb3I6e1RFWFR9IildICsgWyhuLCBmImNvbG9yOntX QVJOfSIpIGZvciBuIGluIG5vdGVzXToKICAgICAgICBpZiBwYXJhZ3JhcGg6CiAgICAgICAgICAg IHBhcnRzLmFwcGVuZChmIjxwIHN0eWxlPSd7c3R5bGV9OyBtYXJnaW4tdG9wOjZweCc+e3RleHRf aHRtbChwYXJhZ3JhcGgpfTwvcD4iKQogICAgICAgICAgICBsaW5lcyArPSAwLjUgKyBsZW4odGV4 dHdyYXAud3JhcChwYXJhZ3JhcGgsIFJFU1VMVF9URVhUX0NIQVJTKSkKICAgIGhlaWdodCA9IHJv dW5kKGxpbmVzICogTElORV9IRUlHSFRfUFgpICsgMiAqIFJFU1VMVF9QQURESU5HX1BYICsgNCAr IENBUkRfRE9DVU1FTlRfTUFSR0lOX1BYCiAgICByZXR1cm4gIiIuam9pbihwYXJ0cyksIGhlaWdo dAoKClBST0dSRVNTX0JBUl9TSVpFID0gKDE4MCwgMTApICAjIHB4OyBmaXhlZCBzbyB0aGUgYmFy IG5ldmVyIGNoYW5nZXMgc2l6ZQpQUk9HUkVTU19GSUxMRUQgPSBBQ0NFTlQKUFJPR1JFU1NfRU1Q VFkgPSAiIzNhM2EzYSIKCgpkZWYgcHJvZ3Jlc3Nfc3R5bGUoZnJhY3Rpb246IGZsb2F0KSAtPiBz dHI6CiAgICAiIiJBIGxhYmVsIHN0eWxlc2hlZXQgdGhhdCBkcmF3cyBhIHByb2dyZXNzIGJhciBm aWxsZWQgdG8gYGBmcmFjdGlvbmBgLgoKICAgIFVJTWFuYWdlciBoYXMgbm8gcHJvZ3Jlc3MgYmFy IGVsZW1lbnQsIHNvIGEgZml4ZWQtc2l6ZSBsYWJlbCdzIGJhY2tncm91bmQgaXMgYQogICAgaGFy ZC1lZGdlZCBncmFkaWVudDogZmlsbGVkIGNvbG91ciB1cCB0byBgYGZyYWN0aW9uYGAsIGVtcHR5 IGNvbG91ciBhZnRlciBpdC4KICAgICIiIgogICAgZWRnZSA9IG1pbihtYXgoZnJhY3Rpb24sIDAu MCksIDEuMCkKICAgICMgR3JhZGllbnQgc3RvcHMgbXVzdCBpbmNyZWFzZSwgc28ga2VlcCBhIHRp bnkgc3RlcCBiZXR3ZWVuIHRoZSB0d28gY29sb3Vycy4KICAgIGZpcnN0LCBzZWNvbmQgPSAoZWRn ZSwgZWRnZSArIDAuMDAwMSkgaWYgZWRnZSA8IDEgZWxzZSAoMC45OTk5LCAxLjApCiAgICByZXR1 cm4gKAogICAgICAgICJib3JkZXItcmFkaXVzOiAzcHg7IGJhY2tncm91bmQ6IHFsaW5lYXJncmFk aWVudCh4MTowLCB5MTowLCB4MjoxLCB5MjowLCAiCiAgICAgICAgZiJzdG9wOjAge1BST0dSRVNT X0ZJTExFRH0sIHN0b3A6e2ZpcnN0Oi40Zn0ge1BST0dSRVNTX0ZJTExFRH0sICIKICAgICAgICBm InN0b3A6e3NlY29uZDouNGZ9IHtQUk9HUkVTU19FTVBUWX0sIHN0b3A6MSB7UFJPR1JFU1NfRU1Q VFl9KTsiCiAgICApCgoKZGVmIHBlcmNlbnRfdGV4dChmcmFjdGlvbjogZmxvYXQpIC0+IHN0cjoK ICAgIHJldHVybiBmIntyb3VuZChtaW4obWF4KGZyYWN0aW9uLCAwLjApLCAxLjApICogMTAwKX0g JSIKUEsBAhQDFAAAAAAAFFtqXfbtqMaJCgAAiQoAABwAAAAAAAAAAAAAAKSBAAAAAGF1cGhvbmlj X3Jlc29sdmUvX19pbml0X18ucHlQSwECFAMUAAAAAAAUW2pdPcfUZkcAAABHAAAAHAAAAAAAAAAA AAAApIHDCgAAYXVwaG9uaWNfcmVzb2x2ZS9fdmVyc2lvbi5weVBLAQIUAxQAAAAAABRbal3Hhppt HjYAAB42AAAXAAAAAAAAAAAAAACkgUQLAABhdXBob25pY19yZXNvbHZlL2FwcC5weVBLAQIUAxQA AAAAABRbal1108FLHC0AABwtAAAdAAAAAAAAAAAAAACkgZdBAABhdXBob25pY19yZXNvbHZlL2F1 ZGlvZmlsZS5weVBLAQIUAxQAAAAAABRbal0hC/HPe14AAHteAAAgAAAAAAAAAAAAAACkge5uAABh dXBob25pY19yZXNvbHZlL2F1cGhvbmljX2FwaS5weVBLAQIUAxQAAAAAABRbal13w78bWRAAAFkQ AAAYAAAAAAAAAAAAAACkgafNAABhdXBob25pY19yZXNvbHZlL2F1dGgucHlQSwECFAMUAAAAAAAU W2pdujPiB64KAACuCgAAGgAAAAAAAAAAAAAApIE23gAAYXVwaG9uaWNfcmVzb2x2ZS9jb21wYXQu cHlQSwECFAMUAAAAAAAUW2pdiNvSkUwNAABMDQAAGgAAAAAAAAAAAAAApIEc6QAAYXVwaG9uaWNf cmVzb2x2ZS9jb25maWcucHlQSwECFAMUAAAAAAAUW2pdmGEc5bAMAACwDAAAKAAAAAAAAAAAAAAA pIGg9gAAYXVwaG9uaWNfcmVzb2x2ZS9jcmVkZW50aWFscy9fX2luaXRfXy5weVBLAQIUAxQAAAAA ABRbal2Dpmyr0QMAANEDAAAoAAAAAAAAAAAAAACkgZYDAQBhdXBob25pY19yZXNvbHZlL2NyZWRl bnRpYWxzL19wcm9jZXNzLnB5UEsBAhQDFAAAAAAAFFtqXaDnafjpAQAA6QEAACQAAAAAAAAAAAAA AKSBrQcBAGF1cGhvbmljX3Jlc29sdmUvY3JlZGVudGlhbHMvYmFzZS5weVBLAQIUAxQAAAAAABRb al2juzOxQgcAAEIHAAAlAAAAAAAAAAAAAACkgdgJAQBhdXBob25pY19yZXNvbHZlL2NyZWRlbnRp YWxzL2xpbnV4LnB5UEsBAhQDFAAAAAAAFFtqXV4hr6jyCAAA8ggAACUAAAAAAAAAAAAAAKSBXREB AGF1cGhvbmljX3Jlc29sdmUvY3JlZGVudGlhbHMvbWFjb3MucHlQSwECFAMUAAAAAAAUW2pdP4kL VDMNAAAzDQAAJwAAAAAAAAAAAAAApIGSGgEAYXVwaG9uaWNfcmVzb2x2ZS9jcmVkZW50aWFscy93 aW5kb3dzLnB5UEsBAhQDFAAAAAAAFFtqXUWN2TwFBAAABQQAABsAAAAAAAAAAAAAAKSBCigBAGF1 cGhvbmljX3Jlc29sdmUvY3JlZGl0cy5weVBLAQIUAxQAAAAAABRbal1vnSB93DkAANw5AAAaAAAA AAAAAAAAAACkgUgsAQBhdXBob25pY19yZXNvbHZlL2luc2VydC5weVBLAQIUAxQAAAAAABRbal0G TvR3IQsAACELAAAZAAAAAAAAAAAAAACkgVxmAQBhdXBob25pY19yZXNvbHZlL2xpbmtzLnB5UEsB AhQDFAAAAAAAFFtqXdG+XEGtEgAArRIAABcAAAAAAAAAAAAAAKSBtHEBAGF1cGhvbmljX3Jlc29s dmUvbG9nLnB5UEsBAhQDFAAAAAAAFFtqXW44wMYngQAAJ4EAAB8AAAAAAAAAAAAAAKSBloQBAGF1 cGhvbmljX3Jlc29sdmUvbWFpbl9zY3JlZW4ucHlQSwECFAMUAAAAAAAUW2pd0ZCZ045DAACOQwAA HAAAAAAAAAAAAAAApIH6BQIAYXVwaG9uaWNfcmVzb2x2ZS9waXBlbGluZS5weVBLAQIUAxQAAAAA ABRbal0hHZt8GV0AABldAAAeAAAAAAAAAAAAAACkgcJJAgBhdXBob25pY19yZXNvbHZlL3Jlc29s dmVfaW8ucHlQSwECFAMUAAAAAAAUW2pdUgngzBkdAAAZHQAAHQAAAAAAAAAAAAAApIEXpwIAYXVw aG9uaWNfcmVzb2x2ZS9zZWxlY3Rpb24ucHlQSwECFAMUAAAAAAAUW2pdgUpDp7wYAAC8GAAAGgAA AAAAAAAAAAAApIFrxAIAYXVwaG9uaWNfcmVzb2x2ZS90aW1pbmcucHlQSwECFAMUAAAAAAAUW2pd p1BcohIAAAASAAAAHwAAAAAAAAAAAAAApIFf3QIAYXVwaG9uaWNfcmVzb2x2ZS91aS9fX2luaXRf Xy5weVBLAQIUAxQAAAAAABRbal2PeYexzRgAAM0YAAAcAAAAAAAAAAAAAACkga7dAgBhdXBob25p Y19yZXNvbHZlL3VpL2xvZ2luLnB5UEsBAhQDFAAAAAAAFFtqXYsvBYLMBgAAzAYAABsAAAAAAAAA AAAAAKSBtfYCAGF1cGhvbmljX3Jlc29sdmUvdWkvbG9nby5weVBLAQIUAxQAAAAAABRbal0+fmmH /CgAAPwoAAAgAAAAAAAAAAAAAACkgbr9AgBhdXBob25pY19yZXNvbHZlL3VpL2xvZ29fZGF0YS5w eVBLAQIUAxQAAAAAABRbal29qKPS9JMAAPSTAAAbAAAAAAAAAAAAAACkgfQmAwBhdXBob25pY19y ZXNvbHZlL3VpL21haW4ucHlQSwECFAMUAAAAAAAUW2pdEIaAphcIAAAXCAAAHAAAAAAAAAAAAAAA pIEhuwMAYXVwaG9uaWNfcmVzb2x2ZS91aS90YXNrcy5weVBLAQIUAxQAAAAAABRbal31l7Gg+zQA APs0AAAeAAAAAAAAAAAAAACkgXLDAwBhdXBob25pY19yZXNvbHZlL3VpL3dpZGdldHMucHlQSwUG AAAAAB4AHgDhCAAAqfgDAAAA ]], } PAYLOAD[#PAYLOAD + 1] = { name = "LICENSE.txt", size = 629, adler32 = 3422600582, data = [[ Q29weXJpZ2h0IChjKSAyMDI2IEF1cGhvbmljIEdtYkguIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpU aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBhcmUgcHJvcHJpZXRhcnkgdG8gQXVw aG9uaWMgR21iSC4gTm8gcGFydCBvZgp0aGlzIHNvZnR3YXJlIG1heSBiZSBjb3BpZWQsIG1vZGlm aWVkLCBkaXN0cmlidXRlZCBvciB1c2VkIGV4Y2VwdCBhcyBleHByZXNzbHkKcGVybWl0dGVkIGlu IHdyaXRpbmcgYnkgQXVwaG9uaWMgR21iSC4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMg SVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElO Q0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM SVRZLCBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5U LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgpDT1BZUklHSFQgSE9MREVSUyBCRSBM SUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFkgQVJJU0lORwpG Uk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBJVFMgVVNF Lgo= ]], } main()