// pagy.ts var pagy_default = (() => { const storageSupport = "sessionStorage" in window && "BroadcastChannel" in window; let pagy = "pagy", storage, sync, tabId; if (storageSupport) { storage = sessionStorage; sync = new BroadcastChannel(pagy); tabId = Date.now(); sync.addEventListener("message", (e) => { if (e.data.from) { const cutoffs = storage.getItem(e.data.key); if (cutoffs) { sync.postMessage({ to: e.data.from, key: e.data.key, str: cutoffs }); } } else if (e.data.to) { if (e.data.to == tabId) { storage.setItem(e.data.key, e.data.str); } } }); } const rjsObserver = new ResizeObserver((entries) => entries.forEach((e) => { e.target.querySelectorAll(".pagy-rjs").forEach((el) => el.render()); })); const B64SafeEncode = (unicode) => btoa(String.fromCharCode(...new TextEncoder().encode(unicode))).replace(/[+/=]/g, (m) => m == "+" ? "-" : m == "/" ? "_" : ""), B64Decode = (base64) => new TextDecoder().decode(Uint8Array.from(atob(base64), (c) => c.charCodeAt(0))); const randKey = () => Math.floor(Math.random() * 36 ** 3).toString(36); const augmentKeynav = async (nav, [storageKey, rootKey, pageKey, last, spliceArgs]) => { let augmentPage; const browserKey = document.cookie.split(/;\s+/).find((row) => row.startsWith(pagy + "="))?.split("=")[1] ?? randKey(); document.cookie = pagy + "=" + browserKey; if (storageKey && !(storageKey in storage)) { sync.postMessage({ from: tabId, key: storageKey }); await new Promise((resolve) => setTimeout(() => resolve(""), 100)); if (!(storageKey in storage)) { augmentPage = (page) => page + "+" + last; } } if (!augmentPage) { if (!storageKey) { do { storageKey = randKey(); } while (storageKey in storage); } const data = storage.getItem(storageKey), cutoffs = data ? JSON.parse(data) : [undefined]; if (spliceArgs) { cutoffs.splice(...spliceArgs); storage.setItem(storageKey, JSON.stringify(cutoffs)); } augmentPage = (page) => { const pageNum = parseInt(page); return B64SafeEncode(JSON.stringify([ browserKey, storageKey, pageNum, cutoffs.length, cutoffs[pageNum - 1], cutoffs[pageNum] ])); }; } const search = rootKey ? `${rootKey}%5B${pageKey}%5D` : pageKey; const re = new RegExp(`(?<=\\?.*)(\\b${search}=)(\\d+)`); for (const a of nav.querySelectorAll("a[href]")) { a.href = a.href.replace(re, (_match, prefix, digit) => `${prefix}${augmentPage(digit)}`); } return augmentPage; }; const buildNavJs = (nav, [ [before, anchor, current, gap, after], pageToken, [widths, series, labels], keynavArgs ]) => { const parent = nav.parentElement; let lastWidth = -1; (nav.render = () => { const index = widths.findIndex((w) => w < parent.clientWidth); if (widths[index] === lastWidth) { return; } let html = before; series[index].forEach((item, i) => { html += item == "gap" ? gap : (typeof item == "number" ? anchor.replace(pageToken, item) : current).replace("L<", labels?.[index][i] ?? item + "<"); }); html += after; nav.innerHTML = ""; nav.insertAdjacentHTML("afterbegin", html); lastWidth = widths[index]; if (keynavArgs && storageSupport) { augmentKeynav(nav, keynavArgs); } })(); if (nav.classList.contains(pagy + "-rjs")) { rjsObserver.observe(parent); } }; const initInputNavJs = async (nav, [url_token, pageToken, keynavArgs]) => { const augment = keynavArgs && storageSupport ? await augmentKeynav(nav, keynavArgs) : (page) => page; initInput(nav, (inputValue) => url_token.replace(pageToken, augment(inputValue))); }; const initLimitTagJs = (span, [from, url_token, page_token, limitToken]) => { initInput(span, (inputValue) => { return url_token.replace(page_token, Math.max(Math.ceil(from / parseInt(inputValue)), 1)).replace(limitToken, inputValue); }); }; const initInput = (element, getUrl) => { const input = element.querySelector("input"), link = element.querySelector("a"); let initial = input.value; const action = () => { if (input.value === initial) { return; } const [min, val, max] = [input.min, input.value, input.max].map((n) => parseInt(n) || 0); if (val < min || val > max) { input.value = initial; input.select(); return; } initial = input.value; link.href = getUrl(input.value); link.click(); }; input.addEventListener("focus", () => input.select()); input.addEventListener("focusout", action); input.addEventListener("keypress", (e) => { if (e.key == "Enter") { action(); } }); }; return { version: "43.4.4", init(arg) { const target = arg instanceof HTMLElement ? arg : document, elements = target.querySelectorAll("[data-pagy]"); for (const element of elements) { try { const [helperId, ...args] = JSON.parse(B64Decode(element.getAttribute("data-pagy"))); if (helperId == "k") { augmentKeynav(element, ...args); } else if (helperId == "snj") { buildNavJs(element, args); } else if (helperId == "inj") { initInputNavJs(element, args); } else if (helperId == "ltj") { initLimitTagJs(element, args); } } catch (err) { console.warn(`Pagy.init: %o %s`, element, err); } } } }; })(); // pagy-shim.ts window.Pagy = pagy_default; //# debugId=6725138D5BA01DF464756E2164756E21 //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsicGFneS50cyIsICJwYWd5LXNoaW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW50ZXJmYWNlIFN5bmNEYXRhIHtcbiAgZnJvbT86IG51bWJlclxuICB0bz86ICAgbnVtYmVyXG4gIGtleTogICBzdHJpbmdcbiAgc3RyPzogIHN0cmluZ1xufVxudHlwZSBJbml0QXJncyA9IFtcImtcIiwgIEtleW5hdkFyZ3NdIHwgICAgICAgICAgLy8gc2VyaWVzX25hdltfanNdIHdpdGgga2V5bmF2IGluc3RhbmNlXG4gICAgICAgICAgICAgICAgW1wic25qXCIsIFNlcmllc05hdkpzQXJnc10gfCAgICAvLyBzZXJpZXNfbmF2X2pzXG4gICAgICAgICAgICAgICAgW1wiaW5qXCIsIElucHV0TmF2SnNBcmdzXSB8ICAgICAvLyBpbnB1dF9uYXZfanNcbiAgICAgICAgICAgICAgICBbXCJsdGpcIiwgTGltaXRUYWdKc0FyZ3NdICAgICAgIC8vIGxpbWl0X3RhZ19qc1xudHlwZSBBdWdtZW50S2V5bmF2ID0gKG5hdjpIVE1MRWxlbWVudCwga2V5bmF2QXJnczpLZXluYXZBcmdzKSA9PiBQcm9taXNlPCgocGFnZTogc3RyaW5nKSA9PiBzdHJpbmcpPlxudHlwZSBLZXluYXZBcmdzID0gcmVhZG9ubHkgW3N0b3JhZ2VLZXk6ICBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RLZXk6ICAgICBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VLZXk6ICAgICBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdDogICAgICAgIG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2VBcmdzPzogU3BsaWNlQXJnc11cbnR5cGUgU3BsaWNlQXJncyA9IHJlYWRvbmx5IFtzdGFydDogICAgICAgbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiBudW1iZXIsICAgICAvLyBpdCB3b3VsZCBiZSBvcHRpb25hbCwgYnV0IHRzIGNvbXBsYWluc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW1zOiAgICBDdXRvZmZbXV1cbnR5cGUgQ3V0b2ZmID0gcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pW11cbnR5cGUgQXVnbWVudGVkUGFnZSA9IFticm93c2VySWQ6ICAgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VLZXk6ICBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcjogIG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICBwYWdlczogICAgICAgbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgIHByaW9yQ3V0b2ZmOiBDdXRvZmYgfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZ2VDdXRvZmY6ICBDdXRvZmYgfCBudWxsXVxudHlwZSBTZXJpZXNOYXZKc0FyZ3MgPSByZWFkb25seSBbTmF2SnNUb2tlbnMsIHBhZ2VUb2tlbjogc3RyaW5nLCBOYXZKc1NlcmllcywgS2V5bmF2QXJncz9dXG50eXBlIE5hdkpzU2VyaWVzID0gcmVhZG9ubHkgW3dpZHRoczogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllczogKHN0cmluZyB8IG51bWJlcilbXVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IHN0cmluZ1tdW10gfCBudWxsXVxudHlwZSBJbnB1dE5hdkpzQXJncyA9IHJlYWRvbmx5IFt1cmxUb2tlbjogIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVRva2VuOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleW5hdkFyZ3M/XVxudHlwZSBMaW1pdFRhZ0pzQXJncyA9IHJlYWRvbmx5IFtmcm9tOiAgICAgICBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybFRva2VuOiAgIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVRva2VuOiAgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdFRva2VuOiBzdHJpbmddXG50eXBlIE5hdkpzVG9rZW5zID0gcmVhZG9ubHkgW2JlZm9yZTogIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yOiAgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhcDogICAgIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXI6ICAgc3RyaW5nXVxuaW50ZXJmYWNlIE5hdkpzRWxlbWVudCBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgcmVuZGVyKCk6IHZvaWRcbn1cblxuLy8gVGhlIHN5bnRheCB1c2VkIGluIHRoaXMgZmlsZSBoYXMgYmVlbiBjYXJlZnVsbHkgY29tcG9zZWQgdG8gbWluaW1pemVcbi8vIHRoZSBwYWd5Lm1pbi5qcyBzaXplIGFuZCBhdm9pZCBwb2xsdXRpb24gaW4gdGhlIHdpbmRvdyBvYmplY3RcbmV4cG9ydCBkZWZhdWx0ICgoKSA9PiB7XG4gIGNvbnN0IHN0b3JhZ2VTdXBwb3J0ID0gJ3Nlc3Npb25TdG9yYWdlJyBpbiB3aW5kb3cgJiYgJ0Jyb2FkY2FzdENoYW5uZWwnIGluIHdpbmRvdztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICBsZXQgcGFneSA9IFwicGFneVwiLCBzdG9yYWdlOiBTdG9yYWdlLCBzeW5jOiBCcm9hZGNhc3RDaGFubmVsLCB0YWJJZDogbnVtYmVyO1xuICBpZiAoc3RvcmFnZVN1cHBvcnQpIHtcbiAgICBzdG9yYWdlID0gc2Vzc2lvblN0b3JhZ2U7IC8vIHNob3J0ZW4gdGhlIGNvbXBpbGVkIHNpemVcbiAgICBzeW5jICAgID0gbmV3IEJyb2FkY2FzdENoYW5uZWwocGFneSk7XG4gICAgdGFiSWQgICA9IERhdGUubm93KCk7XG4gICAgLy8gU3luYyB0aGUgc2Vzc2lvblN0b3JhZ2Uga2V5cyBmb3IgdGhlIGN1dG9mZnMgb3BlbmVkIGluIGEgbmV3IHRhYi93aW5kb3dcbiAgICBzeW5jLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChlOk1lc3NhZ2VFdmVudDxTeW5jRGF0YT4pID0+IHtcbiAgICAgIGlmIChlLmRhdGEuZnJvbSkgeyAvLyByZXF1ZXN0IGN1dG9mZnNcbiAgICAgICAgY29uc3QgY3V0b2ZmcyA9IHN0b3JhZ2UuZ2V0SXRlbShlLmRhdGEua2V5KTtcbiAgICAgICAgaWYgKGN1dG9mZnMpIHtcbiAgICAgICAgICBzeW5jLnBvc3RNZXNzYWdlKDxTeW5jRGF0YT57dG86IGUuZGF0YS5mcm9tLCBrZXk6IGUuZGF0YS5rZXksIHN0cjogY3V0b2Zmc30pO1xuICAgICAgICB9IC8vIHNlbmQgcmVzcG9uc2VcbiAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLnRvKSB7ICAvLyByZWNlaXZlIGN1dG9mZnNcbiAgICAgICAgaWYgKGUuZGF0YS50byA9PSB0YWJJZCkge1xuICAgICAgICAgIHN0b3JhZ2Uuc2V0SXRlbShlLmRhdGEua2V5LCA8c3RyaW5nPmUuZGF0YS5zdHIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLy8gVGhlIG9ic2VydmVyIGluc3RhbmNlIGZvciByZXNwb25zaXZlIG5hdnNcbiAgY29uc3QgcmpzT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoXG4gICAgICBlbnRyaWVzID0+IGVudHJpZXMuZm9yRWFjaChlID0+IHtcbiAgICAgICAgZS50YXJnZXQucXVlcnlTZWxlY3RvckFsbDxOYXZKc0VsZW1lbnQ+KFwiLnBhZ3ktcmpzXCIpLmZvckVhY2goZWwgPT4gZWwucmVuZGVyKCkpO1xuICAgICAgfSkpO1xuXG4gIC8qIEZ1bGwgc2V0IG9mIEI2NCBmdW5jdGlvbnNcbiAgY29uc3QgQjY0RW5jb2RlICAgICA9ICh1bmljb2RlOnN0cmluZykgPT4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLihuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh1bmljb2RlKSkpLFxuICAgICAgICBCNjRTYWZlICAgICAgID0gKHVuc2FmZTpzdHJpbmcpICA9PiB1bnNhZmUucmVwbGFjZSgvWysvPV0vZywgKG0pID0+IG0gPT0gXCIrXCIgPyBcIi1cIiA6IG0gPT0gXCIvXCIgPyBcIl9cIiA6IFwiXCIpLFxuICAgICAgICBCNjRTYWZlRW5jb2RlID0gKHVuaWNvZGU6c3RyaW5nKSA9PiBCNjRTYWZlKEI2NEVuY29kZSh1bmljb2RlKSksXG4gICAgICAgIEI2NERlY29kZSAgICAgPSAoYmFzZTY0OnN0cmluZykgID0+IChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKFVpbnQ4QXJyYXkuZnJvbShhdG9iKGJhc2U2NCksIGMgPT4gYy5jaGFyQ29kZUF0KDApKSksXG4gICAgICAgIEI2NFVuc2FmZSAgICAgPSAoc2FmZTpzdHJpbmcpICAgID0+IHNhZmUucmVwbGFjZSgvWy1fXS9nLCAobWF0Y2gpID0+IG1hdGNoID09IFwiLVwiID8gXCIrXCIgOiBcIi9cIiksXG4gICAgICAgIEI2NFNhZmVEZWNvZGUgPSAoYmFzZTY0OnN0cmluZykgID0+IEI2NERlY29kZShCNjRVbnNhZmUoYmFzZTY0KSlcbiAgKi9cbiAgY29uc3QgQjY0U2FmZUVuY29kZSA9ICh1bmljb2RlOnN0cmluZykgPT4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLihuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh1bmljb2RlKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bKy89XS9nLCAobSkgPT4gbSA9PSBcIitcIiA/IFwiLVwiIDogbSA9PSBcIi9cIiA/IFwiX1wiIDogXCJcIiksXG4gICAgICAgIEI2NERlY29kZSAgICAgPSAoYmFzZTY0OnN0cmluZykgID0+IChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKFVpbnQ4QXJyYXkuZnJvbShhdG9iKGJhc2U2NCksIGMgPT4gYy5jaGFyQ29kZUF0KDApKSk7XG5cbiAgLy8gUmV0dXJuIGEgcmFuZG9tIGtleTogMyBjaGFycyBtYXgsIGJhc2UtMzYgbnVtYmVyIDwgMzYqKjNcbiAgY29uc3QgcmFuZEtleSA9ICgpID0+IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDM2ICoqIDMpLnRvU3RyaW5nKDM2KTtcblxuICAvLyBNYW5hZ2UgdGhlIHBhZ2UgYXVnbWVudGF0aW9uIGZvciBLZXluYXYsIGNhbGxlZCBvbmx5IGlmIHN0b3JhZ2VTdXBwb3J0XG4gIGNvbnN0IGF1Z21lbnRLZXluYXY6IEF1Z21lbnRLZXluYXYgPSBhc3luYyAobmF2LCBbc3RvcmFnZUtleSwgcm9vdEtleSwgcGFnZUtleSwgbGFzdCwgc3BsaWNlQXJnc10pID0+IHtcbiAgICBsZXQgYXVnbWVudFBhZ2U6KHBhZ2U6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgIGNvbnN0IGJyb3dzZXJLZXkgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoLztcXHMrLykgIC8vIGl0IHdvcmtzIGV2ZW4gaWYgbWFsZm9ybWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoKHJvdykgPT4gcm93LnN0YXJ0c1dpdGgocGFneSArIFwiPVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LnNwbGl0KFwiPVwiKVsxXSA/PyByYW5kS2V5KCk7XG4gICAgZG9jdW1lbnQuY29va2llID0gcGFneSArIFwiPVwiICsgYnJvd3NlcktleTsgIC8vIFNtYWxsZXIgLm1pbiBzaXplOiBzZXQgdGhlIGNvb2tpZSB3aXRob3V0IGNoZWNraW5nXG4gICAgaWYgKHN0b3JhZ2VLZXkgJiYgIShzdG9yYWdlS2V5IGluIHN0b3JhZ2UpKSB7XG4gICAgICAvLyBTeW5jIHRoZSBzZXNzaW9uZ1N0b3JhZ2UgZnJvbSBvdGhlciB0YWJzL3dpbmRvd3MgKGUuZy4sIG9wZW4gcGFnZSBpbiB0aGUgbmV3IHRhYi93aW5kb3cpXG4gICAgICBzeW5jLnBvc3RNZXNzYWdlKDxTeW5jRGF0YT57IGZyb206IHRhYklkLCBrZXk6IHN0b3JhZ2VLZXkgfSk7XG4gICAgICAvLyBXYWl0IGZvciB0aGUgbGlzdGVuZXIgdG8gY29weSB0aGUgY3V0b2ZmcyBpbiB0aGUgY3VycmVudCBzZXNzaW9uU3RvcmFnZVxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nfG51bGw+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoXCJcIiksIDEwMCkpO1xuICAgICAgaWYgKCEoc3RvcmFnZUtleSBpbiBzdG9yYWdlKSkgeyAvLyB0aGUgc3RvcmFnZUtleSBkaWRuJ3QgZ2V0IGNvcGllZDogZmFsbGJhY2sgdG8gY291bnRsZXNzIHBhZ2luYXRpb25cbiAgICAgICAgYXVnbWVudFBhZ2UgPSAocGFnZTogc3RyaW5nKSA9PiBwYWdlICsgJysnICsgbGFzdDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBJZiBpdCBpcyBub3QgYXNzaWduZWQgaXQgbWVhbnMgaXQgc3VwcG9ydHMga2V5bmF2XG4gICAgaWYgKCFhdWdtZW50UGFnZSkgeyAvLyByZWd1bGFyIGtleW5hdiBwYWdpbmF0aW9uXG4gICAgICBpZiAoIXN0b3JhZ2VLZXkpIHsgZG8geyBzdG9yYWdlS2V5ID0gcmFuZEtleSgpIH0gd2hpbGUgKHN0b3JhZ2VLZXkgaW4gc3RvcmFnZSkgfSAvLyBubyBkdXAga2V5c1xuICAgICAgY29uc3QgZGF0YSA9IHN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5KSxcbiAgICAgICAgICBjdXRvZmZzID0gPEN1dG9mZltdPihkYXRhID8gSlNPTi5wYXJzZShkYXRhKSA6IFt1bmRlZmluZWRdKTtcbiAgICAgIGlmIChzcGxpY2VBcmdzKSB7XG4gICAgICAgIGN1dG9mZnMuc3BsaWNlKC4uLnNwbGljZUFyZ3MpO1xuICAgICAgICBzdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkoY3V0b2ZmcykpO1xuICAgICAgfVxuICAgICAgLy8gQXVnbWVudCBmdW5jdGlvblxuICAgICAgYXVnbWVudFBhZ2UgPSAocGFnZTpzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZU51bSA9IHBhcnNlSW50KHBhZ2UpO1xuICAgICAgICByZXR1cm4gQjY0U2FmZUVuY29kZShKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIDxBdWdtZW50ZWRQYWdlPlticm93c2VyS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXRvZmZzLmxlbmd0aCwgICAgICAgLy8gcGFnZXMvbGFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnNbcGFnZU51bSAtIDFdLCAvLyBwcmlvckN1dG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnNbcGFnZU51bV1dKSk7ICAvLyBwYWdlQ3V0b2ZmXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzZWFyY2ggPSAocm9vdEtleSkgPyBgJHtyb290S2V5fSU1QiR7cGFnZUtleX0lNURgIDogcGFnZUtleTtcbiAgICBjb25zdCByZSAgICAgPSBuZXcgUmVnRXhwKGAoPzw9XFxcXD8uKikoXFxcXGIke3NlYXJjaH09KShcXFxcZCspYCk7XG4gICAgLy8gQXVnbWVudCB0aGUgcGFnZSBwYXJhbSBvZiBlYWNoIGhyZWZcbiAgICBmb3IgKGNvbnN0IGEgb2YgPE5vZGVMaXN0T2Y8SFRNTEFuY2hvckVsZW1lbnQ+Pjx1bmtub3duPm5hdi5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZdJykpIHtcbiAgICAgIGEuaHJlZiA9IGEuaHJlZi5yZXBsYWNlKHJlLCAoX21hdGNoLCBwcmVmaXgsIGRpZ2l0KTogc3RyaW5nID0+IGAke3ByZWZpeH0ke2F1Z21lbnRQYWdlKDxzdHJpbmc+ZGlnaXQpfWApO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIGF1Z21lbnQgZnVuY3Rpb24gZm9yIGZ1cnRoZXIgYXVnbWVudGF0aW9uIChpLmUuLCB1cmwgdG9rZW4gaW4gaW5wdXRfbmF2X2pzKVxuICAgIHJldHVybiBhdWdtZW50UGFnZTtcbiAgfTtcblxuICAvLyBCdWlsZCB0aGUgc2VyaWVzX25hdl9qcyBoZWxwZXJcbiAgY29uc3QgYnVpbGROYXZKcyA9IChuYXY6TmF2SnNFbGVtZW50LCBbW2JlZm9yZSwgYW5jaG9yLCBjdXJyZW50LCBnYXAsIGFmdGVyXSwgcGFnZVRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3aWR0aHMsIHNlcmllcywgbGFiZWxzXSwga2V5bmF2QXJnc106U2VyaWVzTmF2SnNBcmdzKSA9PiB7XG4gICAgY29uc3QgIHBhcmVudCA9IDxIVE1MRWxlbWVudD5uYXYucGFyZW50RWxlbWVudDtcbiAgICBsZXQgbGFzdFdpZHRoID0gLTE7XG4gICAgKG5hdi5yZW5kZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHdpZHRocy5maW5kSW5kZXgodyA9PiB3IDwgcGFyZW50LmNsaWVudFdpZHRoKTtcbiAgICAgIGlmICh3aWR0aHNbaW5kZXhdID09PSBsYXN0V2lkdGgpIHsgcmV0dXJuIH0gLy8gbm8gY2hhbmdlOiBhYm9ydFxuXG4gICAgICBsZXQgaHRtbCA9IGJlZm9yZTtcbiAgICAgIHNlcmllc1tpbmRleF0uZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAvLyBBdm9pZCB0aGUgaWYgYmxvY2tzIGFuZCBjaGFpbiB0aGUgcmVzdWx0cyAoc2hvcnRlciBwYWd5Lm1pbi5qcyBhbmQgZWFzaWVyIHJlYWRpbmcpXG4gICAgICAgIGh0bWwgKz0gaXRlbSA9PSBcImdhcFwiID8gZ2FwIDpcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSBpdGVtIG1heSBiZSBhIG51bWJlciwgYnV0IHRoZSAncmVwbGFjZScgY29udmVydHMgaXQgdG8gc3RyaW5nIChzaG9ydGVyIHBhZ3kubWluLmpzKVxuICAgICAgICAgICAgICAgICh0eXBlb2YgaXRlbSA9PSBcIm51bWJlclwiID8gYW5jaG9yLnJlcGxhY2UocGFnZVRva2VuLCBpdGVtKSA6IGN1cnJlbnQpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiTDxcIiwgbGFiZWxzPy5baW5kZXhdW2ldID8/IGl0ZW0gKyBcIjxcIik7XG4gICAgICB9KTtcbiAgICAgIGh0bWwgICAgICAgICArPSBhZnRlcjtcbiAgICAgIG5hdi5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgbmF2Lmluc2VydEFkamFjZW50SFRNTChcImFmdGVyYmVnaW5cIiwgaHRtbCk7XG4gICAgICBsYXN0V2lkdGggPSB3aWR0aHNbaW5kZXhdO1xuICAgICAgaWYgKGtleW5hdkFyZ3MgJiYgc3RvcmFnZVN1cHBvcnQpIHsgdm9pZCBhdWdtZW50S2V5bmF2KG5hdiwga2V5bmF2QXJncykgfVxuICAgIH0pKCk7XG4gICAgaWYgKG5hdi5jbGFzc0xpc3QuY29udGFpbnMocGFneSArIFwiLXJqc1wiKSkgeyByanNPYnNlcnZlci5vYnNlcnZlKHBhcmVudCkgfVxuICB9O1xuXG4gIC8vIEluaXQgdGhlIGlucHV0X25hdl9qcyBoZWxwZXJzXG4gIGNvbnN0IGluaXRJbnB1dE5hdkpzID0gYXN5bmMgKG5hdjpIVE1MRWxlbWVudCwgW3VybF90b2tlbiwgcGFnZVRva2VuLCBrZXluYXZBcmdzXTpJbnB1dE5hdkpzQXJncykgPT4ge1xuICAgIGNvbnN0IGF1Z21lbnQgPSBrZXluYXZBcmdzICYmIHN0b3JhZ2VTdXBwb3J0XG4gICAgICAgICAgICAgICAgICAgID8gYXdhaXQgYXVnbWVudEtleW5hdihuYXYsIGtleW5hdkFyZ3MpXG4gICAgICAgICAgICAgICAgICAgIDogKHBhZ2U6IHN0cmluZykgPT4gcGFnZTtcbiAgICBpbml0SW5wdXQobmF2LCBpbnB1dFZhbHVlID0+IHVybF90b2tlbi5yZXBsYWNlKHBhZ2VUb2tlbiwgYXVnbWVudChpbnB1dFZhbHVlKSkpO1xuICB9O1xuXG4gIC8vIEluaXQgdGhlIGxpbWl0X3RhZ19qcyBoZWxwZXJcbiAgY29uc3QgaW5pdExpbWl0VGFnSnMgPSAoc3BhbjpIVE1MU3BhbkVsZW1lbnQsIFtmcm9tLCB1cmxfdG9rZW4sIHBhZ2VfdG9rZW4sIGxpbWl0VG9rZW5dOkxpbWl0VGFnSnNBcmdzKSA9PiB7XG4gICAgaW5pdElucHV0KHNwYW4sIGlucHV0VmFsdWUgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGUgcGFnZSBpcyBhIG51bWJlciwgYnV0IHRoZSAncmVwbGFjZScgY29udmVydHMgaXQgdG8gc3RyaW5nIChzaG9ydGVyIHBhZ3kubWluLmpzKVxuICAgICAgcmV0dXJuIHVybF90b2tlbi5yZXBsYWNlKHBhZ2VfdG9rZW4sIE1hdGgubWF4KE1hdGguY2VpbChmcm9tIC8gcGFyc2VJbnQoaW5wdXRWYWx1ZSkpLCAxKSlcbiAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShsaW1pdFRva2VuLCBpbnB1dFZhbHVlKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBJbml0IHRoZSBpbnB1dCBlbGVtZW50XG4gIGNvbnN0IGluaXRJbnB1dCA9IChlbGVtZW50OkhUTUxFbGVtZW50LCBnZXRVcmw6KHY6c3RyaW5nKSA9PiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpbnB1dCAgID0gPEhUTUxJbnB1dEVsZW1lbnQ+ZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIiksXG4gICAgICAgICAgbGluayAgICA9IDxIVE1MQW5jaG9yRWxlbWVudD5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJhXCIpO1xuICAgIGxldCAgIGluaXRpYWwgPSBpbnB1dC52YWx1ZTtcbiAgICBjb25zdCBhY3Rpb24gID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZSA9PT0gaW5pdGlhbCkgeyByZXR1cm4gfSAgLy8gbm90IGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbbWluLCB2YWwsIG1heF0gPSBbaW5wdXQubWluLCBpbnB1dC52YWx1ZSwgaW5wdXQubWF4XS5tYXAobiA9PiBwYXJzZUludChuKSB8fCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkgeyAgLy8gcmVzZXQgaW52YWxpZC9vdXQtb2YtcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gaW5pdGlhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsID0gaW5wdXQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgbGluay5ocmVmID0gZ2V0VXJsKGlucHV0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsICgpID0+IGlucHV0LnNlbGVjdCgpKTtcbiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgYWN0aW9uKTtcbiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgZSA9PiB7IGlmIChlLmtleSA9PSBcIkVudGVyXCIpIHsgYWN0aW9uKCkgfSB9KTtcbiAgfTtcblxuICAvLyBQdWJsaWMgaW50ZXJmYWNlXG4gIHJldHVybiB7XG4gICAgdmVyc2lvbjogXCI0My40LjRcIixcblxuICAgIC8vIFNjYW4gZm9yIGVsZW1lbnRzIHdpdGggYSBcImRhdGEtcGFneVwiIGF0dHJpYnV0ZSBhbmQgY2FsbCB0aGVpciBpbml0IGZ1bmN0aW9ucyB3aXRoIHRoZSBkZWNvZGVkIGFyZ3NcbiAgICBpbml0KGFyZz86SFRNTEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCAgID0gYXJnIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBhcmcgOiBkb2N1bWVudCxcbiAgICAgICAgICAgIGVsZW1lbnRzID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1wYWd5XVwiKTtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiA8Tm9kZUxpc3RPZjxIVE1MRWxlbWVudD4+ZWxlbWVudHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBbaGVscGVySWQsIC4uLmFyZ3NdID0gPEluaXRBcmdzPkpTT04ucGFyc2UoQjY0RGVjb2RlKDxzdHJpbmc+ZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ3lcIikpKTtcbiAgICAgICAgICBpZiAoaGVscGVySWQgPT0gXCJrXCIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc3ByZWFkIDIgYXJndW1lbnRzLCBub3QgMyBhcyBpdCBjb21wbGFpbnMgYWJvdXRcbiAgICAgICAgICAgIHZvaWQgYXVnbWVudEtleW5hdihlbGVtZW50LCAuLi48S2V5bmF2QXJncz48dW5rbm93bj5hcmdzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhlbHBlcklkID09IFwic25qXCIpIHtcbiAgICAgICAgICAgIGJ1aWxkTmF2SnMoPE5hdkpzRWxlbWVudD5lbGVtZW50LCA8U2VyaWVzTmF2SnNBcmdzPjx1bmtub3duPmFyZ3MpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGVscGVySWQgPT0gXCJpbmpcIikge1xuICAgICAgICAgICAgdm9pZCBpbml0SW5wdXROYXZKcyhlbGVtZW50LCA8SW5wdXROYXZKc0FyZ3M+PHVua25vd24+YXJncyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChoZWxwZXJJZCA9PSBcImx0alwiKSB7XG4gICAgICAgICAgICBpbml0TGltaXRUYWdKcyhlbGVtZW50LCA8TGltaXRUYWdKc0FyZ3M+PHVua25vd24+YXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGVsc2UgeyBjb25zb2xlLndhcm4oXCJQYWd5LmluaXQ6ICVvXFxuVW5rbm93biBoZWxwZXJJZCAnJXMnXCIsIGVsZW1lbnQsIGhlbHBlcklkKSB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikgeyBjb25zb2xlLndhcm4oXCJQYWd5LmluaXQ6ICVvXFxuJXNcIiwgZWxlbWVudCwgZXJyKSB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufSkoKTtcbiIsCiAgICAiaW1wb3J0IFBhZ3kgZnJvbSBcIi4vcGFneS50c1wiXG53aW5kb3cuUGFneSA9IFBhZ3lcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFnREEsSUFBZ0Isc0JBQU07QUFBQSxFQUNwQixNQUFNLGlCQUFpQixvQkFBb0IsVUFBVSxzQkFBc0I7QUFBQSxFQUUzRSxJQUFJLE9BQU8sUUFBUSxTQUFrQixNQUF3QjtBQUFBLEVBQzdELElBQUksZ0JBQWdCO0FBQUEsSUFDbEIsVUFBVTtBQUFBLElBQ1YsT0FBVSxJQUFJLGlCQUFpQixJQUFJO0FBQUEsSUFDbkMsUUFBVSxLQUFLLElBQUk7QUFBQSxJQUVuQixLQUFLLGlCQUFpQixXQUFXLENBQUMsTUFBNkI7QUFBQSxNQUM3RCxJQUFJLEVBQUUsS0FBSyxNQUFNO0FBQUEsUUFDZixNQUFNLFVBQVUsUUFBUSxRQUFRLEVBQUUsS0FBSyxHQUFHO0FBQUEsUUFDMUMsSUFBSSxTQUFTO0FBQUEsVUFDWCxLQUFLLFlBQXNCLEVBQUMsSUFBSSxFQUFFLEtBQUssTUFBTSxLQUFLLEVBQUUsS0FBSyxLQUFLLEtBQUssUUFBTyxDQUFDO0FBQUEsUUFDN0U7QUFBQSxNQUNGLEVBQU8sU0FBSSxFQUFFLEtBQUssSUFBSTtBQUFBLFFBQ3BCLElBQUksRUFBRSxLQUFLLE1BQU0sT0FBTztBQUFBLFVBQ3RCLFFB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QUNyQixNQUFNLFNBQVcsZUFBZSxjQUFjLE1BQU0sVUFDOUMsV0FBVyxPQUFPLGlCQUFpQixhQUFhO0FBQUEsTUFDdEQsV0FBVyxXQUFvQyxVQUFVO0FBQUEsUUFDdkQsSUFBSTtBQUFBLFVBQ0YsT0FBTyxhQUFhLFFBQWtCLEtBQUssTUFBTSxVQUFrQixRQUFRLGFBQWEsV0FBVyxDQUFDLENBQUM7QUFBQSxVQUNyRyxJQUFJLFlBQVksS0FBSztBQUFBLFlBRWQsY0FBYyxTQUFTLEdBQXdCLElBQUk7QUFBQSxVQUMxRCxFQUFPLFNBQUksWUFBWSxPQUFPO0FBQUEsWUFDNUIsV0FBeUIsU0FBbUMsSUFBSTtBQUFBLFVBQ2xFLEVBQU8sU0FBSSxZQUFZLE9BQU87QUFBQSxZQUN2QixlQUFlLFNBQWtDLElBQUk7QUFBQSxVQUM1RCxFQUFPLFNBQUksWUFBWSxPQUFPO0FBQUEsWUFDNUIsZUFBZSxTQUFrQyxJQUFJO0FBQUEsVUFDdkQ7QUFBQSxVQUVBLE9BQU8sS0FBSztBQUFBLFVBQUUsUUFBUSxLQUFLO0FBQUEsS0FBcUIsU0FBUyxHQUFHO0FBQUE7QUFBQSxNQUNoRTtBQUFBO0FBQUEsRUFFSjtBQUFBLEdBQ0M7OztBQ3BPSCxPQUFPLE9BQU87IiwKICAiZGVidWdJZCI6ICI2NzI1MTM4RDVCQTAxREY0NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==